Help us understand the problem. What is going on with this article?

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

異なる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コマンドは初めて使いました。

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

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

_MasUchida
営業マン5年生だけど技術が好きになったのでエンジニアに転身した いまはシステム保守運用をメインに、PHPをベースに色々と触らせてもらっている・ω・
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした