web-dev-qa-db-ja.com

MySQLの致命的なエラー:特権テーブルを開いてロックできません:ファイル形式が正しくありません 'user'

MySQL(Percona 5.6)は起動しません。

このエラーは私に何度か起こりました。毎回、MySQLデータディレクトリを削除してMySQLを再インストールする必要がありました。

MySQLを修正する別の方法はありますか? (具体的には、データが吹き飛ばされていないものですか?)

/ var/log/mysql/error.log

150214 16:36:39 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
2015-02-14 16:36:40 0 [Warning] Using unique option prefix key_buffer instead of key_buffer_size is deprecated and will be removed in a future release. Please use the full name instead.
2015-02-14 16:36:40 0 [Warning] 'THREAD_CONCURRENCY' is deprecated and will be removed in a future release.
2015-02-14 16:36:40 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2015-02-14 16:36:40 1018 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
2015-02-14 16:36:40 1018 [Note] Plugin 'FEDERATED' is disabled.
/usr/sbin/mysqld: Incorrect file format 'plugin'
2015-02-14 16:36:40 1018 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
2015-02-14 16:36:40 1018 [Note] InnoDB: Using atomics to ref count buffer pool pages
2015-02-14 16:36:40 1018 [Note] InnoDB: The InnoDB memory heap is disabled
2015-02-14 16:36:40 1018 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-02-14 16:36:40 1018 [Note] InnoDB: Memory barrier is not used
2015-02-14 16:36:40 1018 [Note] InnoDB: Compressed tables use zlib 1.2.8
2015-02-14 16:36:40 1018 [Note] InnoDB: Using Linux native AIO
2015-02-14 16:36:40 1018 [Note] InnoDB: Using CPU crc32 instructions
2015-02-14 16:36:40 1018 [Note] InnoDB: Initializing buffer pool, size = 256.0M
2015-02-14 16:36:40 1018 [Note] InnoDB: Completed initialization of buffer pool
2015-02-14 16:36:40 1018 [Note] InnoDB: Highest supported file format is Barracuda.
2015-02-14 16:36:40 1018 [Note] InnoDB: The log sequence numbers 714340126 and 714340126 in ibdata files do not match the log sequence number 716513090 in the ib_logfiles!
2015-02-14 16:36:40 1018 [Note] InnoDB: Database was not shutdown normally!
2015-02-14 16:36:40 1018 [Note] InnoDB: Starting crash recovery.
2015-02-14 16:36:40 1018 [Note] InnoDB: Reading tablespace information from the .ibd files...
2015-02-14 16:36:40 1018 [Note] InnoDB: Restoring possible half-written data pages 
2015-02-14 16:36:40 1018 [Note] InnoDB: from the doublewrite buffer...
InnoDB: Last MySQL binlog file position 0 292596, file name binlog.000056
2015-02-14 16:36:40 1018 [Note] InnoDB: 128 rollback segment(s) are active.
2015-02-14 16:36:40 1018 [Note] InnoDB: Waiting for purge to start
2015-02-14 16:36:40 1018 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.21-70.1 started; log sequence number 716513090
2015-02-14 16:36:40 1018 [Note] Recovering after a crash using binlog
2015-02-14 16:36:40 1018 [Note] Starting crash recovery...
2015-02-14 16:36:40 1018 [Note] Crash recovery finished.
2015-02-14 16:36:40 1018 [Note] RSA private key file not found: /var/lib/mysql//private_key.pem. Some authentication plugins will not work.
2015-02-14 16:36:40 1018 [Note] RSA public key file not found: /var/lib/mysql//public_key.pem. Some authentication plugins will not work.
2015-02-14 16:36:40 1018 [Note] Server hostname (bind-address): '*'; port: 3306
2015-02-14 16:36:40 1018 [Note] IPv6 is available.
2015-02-14 16:36:40 1018 [Note]   - '::' resolves to '::';
2015-02-14 16:36:40 1018 [Note] Server socket created on IP: '::'.
2015-02-14 16:36:40 1018 [ERROR] Fatal error: Can't open and lock privilege tables: Incorrect file format 'user'
150214 16:36:40 mysqld_safe mysqld from pid file /tmp/mysqld.pid ended
9
Paul Draper

私はなんとかしてこの問題を解決しました Ruby.bからの回答

ホストテーブルを修復する必要があります。これを行うには、次のコマンドを発行して、特権システムをバイパスしてサーバーを起動します。

1つのターミナルで、

$ Sudo mysqld --skip-grant-tables

別のターミナルを開き、これらのコマンドを実行します

$ mysql
mysql> use mysql
mysql> repair table Host use_frm;
mysql> exit

そして、mysqlサービスを再起動します

$ Sudo service mysql restart
17
John Linhart

私を正しい方向に導いてくれたジョンのおかげで、私は自分のシステムを飛び越えるために他のいくつかのフープを持っていました。これが誰かを助けることを願っています。

これは破損した特権テーブルです。アップグレードまたは電源障害が原因である可能性があります。私のシステムOpenSUSE13.2、MySQL5.6。単純な再インストールでは修正されません。再インストールする前にMySQLのすべてのトレースを削除する必要がありますまたは…

MySQLのすべてのインスタンスを閉じます

$ systemctl stop mysql.service
$ pkill -9 mysqld

特権システムをバイパスするサーバーを起動します

$ Sudo mysqld_safe --user=root --skip-grant-tables

MySQLコマンドラインツールを起動します

$ mysql

あなたが受け取る場合

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

mysqld_safeは、ソケットを別の場所で実行しています。で見つけてください。

$ Sudo find / -type s

私は/ var/run/mysql /にありました。my.cnfのソケット行を編集して、既存のソケット設定をメモします。私のラインは

socket=/var/run/mysql/mysql.sock

「MySQLのすべてのインスタンスを閉じる」(これらの手順の先頭)に戻ります。それらに従って、「MySQLコマンドラインツールの起動」を実行します。うまくいけば、mysqlを正常に開くことができます。 mysqlコマンドラインから。

mysql> use mysql
mysql> repair table user use_frm;
mysql> exit

MySQLのすべてのインスタンスを閉じます

$ systemctl stop mysql.service
$ pkill -9 mysqld

My.cnfを再編集し、ソケットラインを元の設定に戻します。

Mysqlデータディレクトリ内の2つのファイルのアクセス許可をリセットする必要がありました。

$ chown mysql:mysql server2.err
$ chown mysql:mysql server2.pid

MySQLサーバーを起動します

$ systemctl start mysql.service

次に、別のテーブル(db)で同じ元のエラーが発生しました

[ERROR] Fatal error: Can't open and lock privilege  tables: Incorrect file format 'db'

そして、すべての特権テーブルが修正されるまで、「repair」コマンドを変更して上記の手順を複数回繰り返す必要がありました。

mysql> repair table db use_frm;
8
Tim Richards

@ John Linhartを実行している場合の回答の設定は、次のとおりですDocker

まず、mysql-container(DBの作成に使用したものと同じ)から適切なタグを使用して、新しいDockerコンテナーを開始します。

$ docker run --rm -it -v <named_volume>:/var/lib/mysql mysql:<tag> /bin/bash

これにより、正しい名前のボリューム(またはマウントされたボリューム)がコンテナーにマウントされた新しいコンテナーが起動され、rootとしてシェルにドロップされます。ただし、mysqld-デーモンはrootとしての起動を拒否するため、mysql-userとして実行します。

$ whoami
root
$ which mysqld
/usr/sbin/mysqld
$ su mysql
$ whoami
mysql
$ /usr/sbin/mysqld --skip-grant-tables
....

SQLコマンドを実行するために、新しいターミナルから実行中のコンテナーに接続します。

$ docker ps 
CONTAINER ID [...]
abc123 [...]
$ docker exec -it abc123 /bin/bash
# We're on the container now!
$ whoami
root
$ mysql
...

そしてそこから続けます。完了したら、exitを介してコンテナを2番目のターミナルに残します。 mysqldを実行しているターミナルはCMD + Cに応答しないため、Dockerを介してコンテナーを停止します。

$ docker ps
CONTAINER ID [...]
abc123 [...]
$ docker stop abc123
0
Lukas Knuth