ポイ探ではありませんが、他のサイトで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が実行されていませんので、対応できたようです。