MySQLがクラッシュして勝手に終了する原因はファイル破損らしい
DailyFeedで使用しているMySQLのテーブルのひとつが1,000万レコードを超え、実行するクエリが重くなってきていたので、なんとかしようとインデックスを新しく作成。クエリ自体は軽くなったのだけど、それ以来MySQLが自然とお亡くなりになるという事態に。。
MySQLのドキュメント「MySQL :: MySQL 4.1 リファレンスマニュアル :: A.4.1 MySQL が何度もクラッシュする場合に行うこと」によると、大抵はファイルの破損が原因とか。インデックスを作成するときにファイルが壊れたのかなと思いつつ、mysqlcheckを実行してみると問題のあるテーブルが大量に・・・
とりあえず mysqlcheck -c と mysqlcheck -r を繰り返す。ちなみにInnoDBを使っているとmysqlcheckの一部のオプションは使えない。
$ mysqlcheck -c -A -u root -p ... (省略) ... $ mysqlcheck -r -A -u root -p
これでひと通り全データベースのテーブルのエラーは解消。しかしまだMySQLのクラッシュは解消しない。さらに mysqld.log を見てみると起動時に次のようなエラーが出ていた。
110528 12:35:56 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 110528 12:35:56 [Warning] '--default-character-set' is deprecated and will be removed in a future release. Please use '--character-set-server' instead. /usr/libexec/mysqld: Table 'mysql.plugin' doesn't exist 110528 12:35:56 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 110528 12:35:57 InnoDB: Started; log sequence number 2 3224113078 110528 12:35:57 [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist 110528 12:35:57 [ERROR] Column count of mysql.db is wrong. Expected 22, found 20. The table is probably corrupted 110528 12:35:57 [ERROR] mysql.user has no `Event_priv` column at position 29 110528 12:35:57 [ERROR] Cannot open mysql.event 110528 12:35:57 [ERROR] Event Scheduler: An error occurred when initializing system tables. Disabling the Event Scheduler. 110528 12:35:57 [Note] /usr/libexec/mysqld: ready for connections. Version: '5.1.52-log' socket: '/var/lib/mysql/mysql.sock' port: 0 MySQL Community Server (GPL) by Utter Ramblings
なにやら怪しい感じだけどよく分からない。とりあえず[ERROR]の1行目に「mysql_upgradeを実行せよ」とあるので、指示通りに実行してみた。すると、
110528 12:44:04 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 110528 12:44:04 [Warning] '--default-character-set' is deprecated and will be removed in a future release. Please use '--character-set-server' instead. 110528 12:44:04 InnoDB: Started; log sequence number 2 3225204356 110528 12:44:05 [Note] Event Scheduler: Loaded 0 events 110528 12:44:05 [Note] /usr/libexec/mysqld: ready for connections. Version: '5.1.52-log' socket: '/var/lib/mysql/mysql.sock' port: 0 MySQL Community Server (GPL) by Utter Ramblings
エラーが解消された。と同時にMySQLが自然とお亡くなりになる事象も発生しなくなった。ちなみにこのエラーは随分前から記録されていたけどMySQLがクラッシュすることはなかったので気づかなかった。
コメントを残す