LoginSignup
4

More than 5 years have passed since last update.

posted at

updated at

mysqldumpで生成したダンプファイルからのリストア時にYou can't use locks with log tablesと言われる問題

環境

バックアップを取得するサーバ(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.
...

原因

ダンプファイルの中の指摘されている行を調べると、以下のような記述があった。

dumpfile
...
LOCK TABLES `general_log` WRITE;
...

上記の通り、general_logテーブルに対してロックをかけようとしている。

mysqlデータベースのgeneral_logテーブルは、MySQLのコンフィグで一般クエリログをDBに保存する設定を行った際、ログが保存されるテーブルである。
このテーブルに対してはロックを行ったり、INSERTDELETEなどを行うことは出来ず、サーバ内部からのみ値が挿入される。

このように本来はユーザ側から明示的にアクセスはできないテーブルであるが、古い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

ダンプファイルの該当の行を参照すると、以下のような記述があった。

dumpfile
...
DROP TABLE IF EXISTS `general_log`;
...

これはMySQLのコンフィグでクエリログを発行する設定にしている場合に起こる。
※すなわち、my.cnfgeneral-log=1にしている場合

これも同様に新しいバージョンのMySQLでダンプを行った場合はgeneral_logテーブルに対する操作そのものが発行されないので、問題とならない。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4