F.Ko-Jiの「一秒後は未来」

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がクラッシュすることはなかったので気づかなかった。

コメントを残す

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

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など