MySQLでバイナリログを削除したら立ち上がらなくなったので直す。

さて以前、『MySQLのバイナリログが、ディスクを圧迫していたのです。』を書きました。

設定ファイル my.cnf に、例えば
log-bin=mysql-bin
expire_log_days=7
と書いてやれば、バイナリログはデフォルトディレクトリに保存され、7日前より古いログは順次消去されます。これはこれで問題なし。

で、手動でバイナリログを削除したいとき。正式には、コマンドラインから root ユーザとして mysql を立ち上げて、
mysql> PURGE MASTER LOGS BEFORE '2012-03-03 23:59:59' ;
とか、
mysql> PURGE MASTER LOGS TO 'mysql-bin.000030' ;
とか、全消ししたいならば
mysql> RESET MASTER ;
してやれば安全安心なのだけれど、もう面倒なので保存先ディレクトリに行って rm で消してしまえ! と、やや無茶なことを実行してみたら、MySQL が立ち上がらなくなった。
Manager of pid-file quit without updating file.
というエラーメッセージを吐くのだが、意味が判らない。エラーログを見てみると、
[ERROR] Failed to open log (file './mysql-bin.000030', errno 2)
[ERROR] Could not open log file
[ERROR] Can't init tc log
[ERROR] Aborting
…ということなのね。ログファイルが見つからないので立ち上がらない。ログファイルそのものを削除しても、どこか別の場所に、そのファイル情報が保存されたまま残っているだな。

はいその通り。現在のバイナリログのファイル名を格納しているのが mysql-bin.index というファイルです。ログが保存されるディレクトリに mysql-bin.index が見つかる筈。

mysql-bin.index 内に「存在するよ」と書かれているログファイルが、実際には存在しない(だって rm コマンドで消しちゃったんだもん)のでエラーになるのです。

なので、このエラーを回避するには、実際には存在しないバイナリログファイルの名前を mysql-bin.index から削除してやれば良いのです。

これで無事、MySQL が立ち上がってくれる筈。

要は、横着しないできちんと操作すれば、無駄なエラー対処も必要無い…ということですな。

カテゴリ: