« 2008年10月 | メイン | 2008年12月 »

2008年11月17日

MySQL5.0 バイナリログの保存先が変わった?

とあるシステムの構築作業において、CentOS5上でMySQL5.0.45を使用していて気づいたのですが、バイナリログのデフォルトの保存先が変わりましたね。

これまでは、たとえばMySQL5.0.22では、/etc/my.cnfにおいて下記のようにlog-binのみ記述しておくと、datadirで指定したディレクトリ、デフォルトでは/var/lib/mysql にバイナリログが作成されていました。

-- /etc/my.cnf
log-bin
--

ところが、MySQL5.0.45では、PIDファイルと同じディレクトリ /var/run/mysqld に保存されるようになりました。
MySQLのログでも、「起動時に log-bin= で明にしていしてね」というメッセージが出ています。

-- /var/log/mysqld.log
081114 14:31:16 [Warning] No argument was provided to --log-bin,
and --log-bin-index was not used; so replication may break
when this MySQL server acts as a master and has his hostname changed!!
Please use '--log-bin=/var/run/mysqld/mysqld-bin' to avoid this problem.
--

そのままでもよいのですが、バイナリログファイルはデータファイルと同じ場所にないといざというときに見つけにくいので、そのように変更します。

0. MySQLを停止する

# /etc/init.d/mysqld stop

1. /etc/my.cnf にてバイナリログの出力先を明に指定する

log-bin= でbase_nameとしてmysqld-binを指定します。
これで、/var/run/mysqld ではなく、datadir で指定したディレクトリ、デフォルトでは/var/lib/mysql に保存されるようになります。

-- /etc/my.cnf
log-bin=mysqld-bin
--

すでにバイナリログを /var/run/mysqld に生成してしまった場合はそれだけでは不十分なので、以下を行います。

2. /var/run/mysqld 以下に生成されたバイナリログ、インデックスファイルをデータディレクトリに移動

バイナリログファイルmysqld-bin.000001, mysqld-bin.000002, ... と、インデックスファイルmysqld-bin.index を/var/lib/mysql に移動します。

# mv /var/run/mysqld/mysqld-bin.* /var/lib/mysql/

3. インデックスファイルに記載されているバイナリログファイルのパスを修正

-- mysqld-bin.index 修正前
/var/run/mysqld/mysqld-bin.000001
/var/run/mysqld/mysqld-bin.000002
...
--


-- mysqld-bin.index 修正後
/var/lib/mysql/mysqld-bin.000001
/var/lib/mysql/mysqld-bin.000002
...
--

4. MySQLを起動

# /etc/init.d/mysqld start


3. を行わないと、MySQLの起動時にMySQLのログに以下のようなメッセージが出力され、起動に失敗します。

-- /var/log/mysqld.log
081114 14:36:21 mysqld started
081114 14:36:21 InnoDB: Started; log sequence number 0 92391
/usr/libexec/mysqld: File '/var/run/mysqld/mysqld-bin.000001' not
found (Errcode: 2)
081114 14:36:21 [ERROR] Failed to open log (file
'/var/run/mysqld/mysqld-bin.000001', errno 2)
081114 14:36:21 [ERROR] Could not open log file
081114 14:36:21 [ERROR] Can't init tc log
081114 14:36:21 [ERROR] Aborting
--


なお、レプリケーション環境を構築している場合は、スレーブサーバ側でのリレーログも、デフォルトでは/var/run/mysqld に保存されます。

こちらも、/etc/my.cnfにてbasenameを明に指定すると、リレーログがデータディレクトリに保存されるようになります。

-- /etc/my.cnf
relay-log=mysqld-relay-bin
--


これ、いつの間に変わったのでしょうね。
MySQL5.0.22から5.0.45のChangeLogを眺めても見つけられません。