環境
バックアップを取得するサーバ(mysqldump
を実行するクライアント側のサーバ):
CentOS5.6
MySQL 5.0.95
現象
mysqldump
でMySQLのDBをフルバックアップを行い、それをもとにリストアしようとした際、
ERROR 1556 (HY000) at line XXXX: You can't use locks with log tables.
と言われ、リストアできない。
詳細
バックアップ時は書き込みをロックし、全てのデータベースに対してバックアップをとる。
mysqldump -u{user} -p{password} --lock-all-tables --all-databases > ~/dumpfile
これをもとにリストアを行うと、先ほどのエラーが発生する。
mysql < ~/dumpfile
...
ERROR 1556 (HY000) at line XXXX: You can't use locks with log tables.
...
原因
ダンプファイルの中の指摘されている行を調べると、以下のような記述があった。
...
LOCK TABLES `general_log` WRITE;
...
上記の通り、general_log
テーブルに対してロックをかけようとしている。
mysql
データベースのgeneral_log
テーブルは、MySQLのコンフィグで一般クエリログをDBに保存する設定を行った際、ログが保存されるテーブルである。
このテーブルに対してはロックを行ったり、INSERT
やDELETE
などを行うことは出来ず、サーバ内部からのみ値が挿入される。
このように本来はユーザ側から明示的にアクセスはできないテーブルであるが、古いMySQLクライアントの場合、mysqldump
を実行するとこのテーブルに対する操作まで発行されてしまう。
参考: https://bugs.mysql.com/bug.php?id=26121
上記URLによると、MySQL 5.1.18でこのバグは修正されたようである。
例えば古いサーバでダンプを取って新しいサーバに移行するなどの際には注意が必要である。
※ダンプファイルの問題なので、移行先が新しいバージョンのMySQL(あるいはMariaDB)でも問題は発生する。
この問題はMySQLのクライアント側の問題であるため、クライアント側のMySQLをバージョンアップを行うことで問題は解決する。別サーバの新しいMySQLクライアントからバックアップを取るなどして対処できる。
関連事象
同じように、リストア時に以下のようなエラーが発生する場合がある。
ERROR 1580 (HY000) at line XXXX: You cannot 'DROP' a log table if logging is enabled
ダンプファイルの該当の行を参照すると、以下のような記述があった。
...
DROP TABLE IF EXISTS `general_log`;
...
これはMySQLのコンフィグでクエリログを発行する設定にしている場合に起こる。
※すなわち、my.cnf
でgeneral-log=1
にしている場合
これも同様に新しいバージョンのMySQLでダンプを行った場合はgeneral_log
テーブルに対する操作そのものが発行されないので、問題とならない。