0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【MySQL】mysqldump restoreでちょいハマり

Last updated at Posted at 2020-03-31

異なる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の中身はこんな感じ。

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には続きがあり、それが以下の処理です。

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` で値を挿入していく。

まとめると、

  1. テーブル削除
  2. テーブル作成
  3. レコード挿入(作成)

というファイル内容になっています。

次はレストア

ファイル内容がわかったところで、実際にdump.sqlを新テーブルへと流し込みましょう(レストア)。

(今回ファイルはローカル上で移動させてあります。)

mysql -u root -p -h $IP -P $PORT DATABASE_NAME < dump.sql

ダンプ時とレストア時で<>の向き先に注意です。

またまたパスワードの入力を求められるので入力して、レストア完了です。

あとはmysqlにログインして確認するでもよし、
phpMyAdminにアクセスして確認するでもよし。

やってみて

MySQLは自己開発でも副業でも触ってますし、CUIでの操作もアレコレやったことありますが、
mysqldumpコマンドは初めて使いました。

テーブル被りは削除とか、ロックかけて整合性の保持をするなど、
気の利いてるコマンドだなぁ、なんて思いました。

最初はコマンド打つのアレコレ分からないしなんとなく怖いしって
感じなんですが、、慣れると便利ですね。
(万が一にも変なコマンド打たないようにせねば。。)

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?