LCL Engineers' Blog

バス比較なび・格安移動・バスとりっぷを運営する LCLの開発者ブログです。

MySQLで特定のテーブルの一部のデータだけ dump するときには --where オプションを使いましょう

f:id:kasei_san:20190430190640p:plain
using mysqldump with where option

こんにちは。MCUを追いきれていないために、エンドゲームを見れないバックエンドエンジニアの id:kasei_san です

代わりにDCの シャザム! を見てきました。CMの印象と異なり、優しいファミリー向けの内容で、誰でも楽しく鑑賞できそうな良い映画でしたよ!

www.youtube.com

MySQLで特定のテーブルの一部のデータだけdumpする方法

--where オプションを使うことで、検索条件を満たすものだけをdumpできます

今回のユースケース

既存のDBのテーブルに、別のDBのテーブルの一部のデータをコピーしたい

コマンド例

nohup /usr/bin/mysqldump \
  -u username\
  -p\
  -h localhost\
  --result-file /tmp/dump_file.dump\
  --no-create-info \
  --no-create-db \
  --where 'regist_unix < 1483196400' \
  database_name table_name

上記の場合、database_name にある table_name テーブル を where regist_unix < 1483196400 した結果をtmp/dump_file.dump にdumpしています

また、nohup コマンドをつかうことで、ログアウト後もコマンドが実行されたままとなります

(DBのパスワード入力後は ^zmysqldump をバックグラウンドジョブに移動させ、ログアウトして完了を待ちました)

オプションの解説

  • --where : 所定の WHERE 条件で選択された行のみダンプします
  • --no-create-info : ダンプされたテーブルを再作成する CREATE TABLE ステートメントを書き出さないようにします
  • --no-create-db : CREATE DATABASE ステートメントを抑制します

また、復元時に drop-table などはしたくないため、--opt は省いています

復元方法

source コマンドを使います

source /tmp/dump_file.dump

今回の場合、大量のINSERTでDBの負荷を上げたくなかったのと、追加されたカラムが更新されることは無いため、ファイルを適当に分割して1つづつ手作業で source しました

まとめ

  • 特定のテーブルの一部のデータだけ dump するときには --where オプションを使いましょう
  • 復元先にあわせて、--opt オプションを外したり、 --no-create-info--no-create-db オプションを加えましょう

参考

dev.mysql.com

We are hiring!

LCLでは、MySQLもPostgreSQLも興味があるRailsエンジニアを募集中です!

ご興味ある方はぜひエントリお願いいたします!

www.lclco.com