MySQLが何度も「Starting crash recovery」を実行する

ポイ探ではありませんが、他のサイトでMySQLの接続が不安定になる不具合がありました。MySQLのログを見ると下記のようになっています。

****** 11:02:44 mysqld_safe Number of processes running now: 0
****** 11:02:44 mysqld_safe mysqld restarted
****** 11:02:45 InnoDB: Initializing buffer pool, size = 8.0M
****** 11:02:45 InnoDB: Completed initialization of buffer pool
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
****** 11:02:45 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Last MySQL binlog file position 0 27378, file name ./mysql-bin.000015
****** 11:02:45 InnoDB: Started; log sequence number 0 1487447705
****** 11:02:45 [Note] Recovering after a crash using mysql-bin
****** 11:02:45 [Note] Starting crash recovery...
****** 11:02:45 [Note] Crash recovery finished.
****** 11:02:45 [Note] Event Scheduler: Loaded 0 events
****** 11:02:45 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
Version: '5.*.**-log' socket: '/tmp/mysql.sock' port: **** Source distribution

このログが、MySQLにアクセスされるたびに出力され、バイナリファイルがどんどんインクリメントされていきます。

ログを見ると、「データベースが正常にシャットダウンされてないのでリカバリーを開始します。リカバリーは終了しました。」となっていますが、次にMySQLにアクセスがあったときも、自動終了し同じメッセージが表示されます。

Google等で「mysql “starting crash recovery”」で検索すると、MySQLが起動しない場合について書かれていますが、起動している場合についてのリカバリ方法を見つけることができませんでした。念のため、/etc/my.cnfの[mysqld]に「innodb_force_recovery = 3」を設定してMySQLを起動、データベースをバックアップしました。別ディレクトリでMySQLを設定し、データをリストアしてから起動しても、全く同じ現象でデータベースの接続が不安定なままです。結局、再度同じ事を行ってから、サーバのリブートすることで不具合は無くなりました。

一応対処方法は下記の通りです。

■新規ディレクトリを用意し、mysqlユーザに

$ sudo su -
# mkdir /home/mysql3
# chown mysql.mysql /home/mysql3
# mkdir /home/mysql_dump
# chown mysql.mysql /home/mysql_dump

■httpdをストップし、リカバリモードでMySQLを起動(SELECT可能、UPDATE等は不可)

# /etc/init.d/httpd stop
# /etc/init.d/mysqld stop
# vi /etc/my.cnf

my.cnfの[mysqld]に「innodb_force_recovery = 3」を追加

[mysqld]
innodb_force_recovery = 3
# /etc/init.d/mysqld start

■データバックアップ

$ mysqldump -u [MySQLユーザ名] -p [データベース名] > /home/mysql_dump/[データベース名]-[日付].sql

■MySQL停止、リカバリーモード終了(コメントアウト)

# /etc/init.d/mysqld stop
# vi /etc/my.cnf
[mysqld]
# innodb_force_recovery = 3

■新規ディレクトリでMySQL起動するためにmy.cnfとmysqldを書き換え

# vi /etc/my.cnf
innodb_data_home_dir = /home/mysql3
innodb_log_group_home_dir = /home/mysql3
# vi /etc/init.d/mysqld
get_mysql_option mysqld datadir "/home/mysql3"

■データベース初期化後、MySQL起動

# sudo su - mysql
mysql-user$ mysql_install_db --datadir=/home/mysql3 --user=mysql
mysql-user$ sudo su -
# /etc/init.d/mysqld start

■新規データベースのパスワード設定

$ mysql -u root
mysql> SET PASSWORD=PASSWORD('MySQLのrootパスワード');
mysql> \q
$ mysql -u root -p
mysql> CREATE DATABASE [データベース名] default character set utf8;
mysql> GRANT ALL ON [データベース名].* to [MySQLユーザ名]@localhost IDENTIFIED BY 'MySQLパスワード';

■データベース作成、データリストア

$ mysql -u [MySQLユーザ名] -p [データベース名] < /home/mysql_dump/[データベース名]-[日付].sql

■サーバ再起動

# shutdown -r now

これで、httpdとmysqlが自動起動し、新しいディレクトリ(/home/mysql3)が有効になります。ログを見ると、Starting crash recoveryが実行されていませんので、対応できたようです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください