異なるDockerコンテナに同一構造のテーブルを持つデータベースがあり、
両方動かさねば!テストで動かしたい!ということで上司にどうすれば?と確認したところ、
「ダンプレストア!んじゃやってみよう!」とのことでやってみた。
まずはダンプ
$ mysqldump -u root -p -h $IP -P $PORT DATABASE_NAME TABLE_NAME > dump.sql
いけー!と思ったらエラー。
$ mysqldump: Couldn't execute 'SELECT COLUMN_NAME, hogehogefugafuga
SELECT COLUMN_NAMEを実行できない?的な?
ということらしくちょいハマりしたが、以下のオプションをつけることで解決。
$ --column-statistics=0
実際の使用例はこんな感じ。
$ mysqldump -u root -p -h $IP -P $PORT DATABASE_NAME TABLE_NAME --column-statistics=0 > dump.sql
パスワードの入力が求められるので入力する。
これでダンプ完了。
ダンプで生成したファイルについて
dump.sqlの中身はこんな感じ。
DROP TABLE IF EXISTS `TABLE_NAME`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `TABLE_NAME` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hoge` varchar(20) NOT NULL,
hogehogefugafuga
DROP TABLE IF EXISTS
で既存で同名のテーブルがあった場合はそれを削除してから、
CREATE TABLE
で再度新しく同様のテーブルを作成するクエリが盛り込まれていますね。
dump.sqlには続きがあり、それが以下の処理です。
LOCK TABLES `TABLE_NAME` WRITE;
/*!40000 ALTER TABLE `TABLE_NAME` DISABLE KEYS */;
INSERT INTO `TABLE_NAME` VALUES (hogehogefugafuga
LOCK TABLES
でテーブルをロックして、書き込みができないようにしているみたいです。
これは、ダンプを作成したあとに、別でDB(テーブル)への新規の書き込みがあった場合などに、
ダンプファイルとの整合性が取れなくなってしまうことを避けるためです。
その後INSERT INTO `TABLE_NAME`
で値を挿入していく。
まとめると、
- テーブル削除
- テーブル作成
- レコード挿入(作成)
というファイル内容になっています。
次はレストア
ファイル内容がわかったところで、実際にdump.sqlを新テーブルへと流し込みましょう(レストア)。
(今回ファイルはローカル上で移動させてあります。)
mysql -u root -p -h $IP -P $PORT DATABASE_NAME < dump.sql
ダンプ時とレストア時で<>の向き先に注意です。
またまたパスワードの入力を求められるので入力して、レストア完了です。
あとはmysqlにログインして確認するでもよし、
phpMyAdminにアクセスして確認するでもよし。
やってみて
MySQLは自己開発でも副業でも触ってますし、CUIでの操作もアレコレやったことありますが、
mysqldumpコマンドは初めて使いました。
テーブル被りは削除とか、ロックかけて整合性の保持をするなど、
気の利いてるコマンドだなぁ、なんて思いました。
最初はコマンド打つのアレコレ分からないしなんとなく怖いしって
感じなんですが、、慣れると便利ですね。
(万が一にも変なコマンド打たないようにせねば。。)