MySQLにあるデータをdumpしたファイルを、別環境でトランザクションを張ってからdumpしようとした時にハマったメモ
環境情報
- innoDB
- MySQL5.6.37
最終的なdumpのコマンド
mysqldump db table1 --add-locks=false --disable-keys=false -t --where 'id > 1' > file.sql
mysqldump db table2 --add-locks=false --disable-keys=false -t --where 'id > 1' >> file.sql
sed -i 'begin;' file.sql #fileにトランザクションを書く
echo echo 'commit;' >> file.sql
mysqldumpオプション解説1
--add-locks=false
これがないとdumpファイルにLOCK TABLESが出力されるので外す。
LOCK TABLES `table1` WRITE;
INSERT INTO table1 VALUES(....)
UNLOCK TABLES;
LOCK TABLEが暗黙的にコミットしてしまうので除外。
https://dev.mysql.com/doc/refman/5.6/ja/lock-tables.html
mysqldumpオプション解説2
--disable-keys=false
これがないと DISABLE KEYS
が出力されるので外す。
/*!40000 ALTER TABLE `table1` DISABLE KEYS */;
INSERT INTO table1 VALUES(....)
/*!40000 ALTER TABLE `table1` ENABLE KEYS */;
ALTER TABLE
が暗黙的にコミットしてしまうので除外。あと、 /*!40000 */;
はコメントアウトじゃなく、バージョンが4以上ならばコマンドを流すという意味。
https://dev.mysql.com/doc/refman/5.6/ja/implicit-commit.html
感想
暗黙的なコミットが怖い。