こんにちは。MCUを追いきれていないために、エンドゲームを見れないバックエンドエンジニアの id:kasei_san です
代わりにDCの シャザム! を見てきました。CMの印象と異なり、優しいファミリー向けの内容で、誰でも楽しく鑑賞できそうな良い映画でしたよ!
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のパスワード入力後は ^z
で mysqldump
をバックグラウンドジョブに移動させ、ログアウトして完了を待ちました)
オプションの解説
--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
オプションを加えましょう
参考
We are hiring!
LCLでは、MySQLもPostgreSQLも興味があるRailsエンジニアを募集中です!
ご興味ある方はぜひエントリお願いいたします!