箱のプログラミング日記。

えんじにあ奮闘記

【MySQL】特定のレコードのみダンプしたい / 特定のテーブル以外をダンプしたい

f:id:y_hakoiri:20191102134313j:plain

MySQLでダンプするときに全てのレコードをdumpすると重いので、特定のテーブルの特定のレコードのみdumpしたいなーと思って調べたときのメモ。

基本のmysqldumpコマンド

$ mysqldump [options] db_name [tbl_name ...]

データベース全体をダンプするには、db_name に続けてテーブルを指名しないか、または --databases オプションまたは --all-databases オプションを使用します。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム

[options]に入るのはサーバー接続時のオプションなので

$ mysqldump -u USERNAME -p PASSWORD -h HOST sample_database > ~/hako_sample.sql

sample_databaseの全レコードをダンプする場合はこうなる。

--whereオプション

特定のレコードのみdumpする場合は--whereもしくは-wオプションを使う。

指定された WHERE 条件で選択される行のみダンプします。

--where="user='jimf'"
-w"userid>1"
-w"userid<1"

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム

当然テーブルは指定する必要があるので、

$ mysqldump -u USERNAME -p PASSWORD -h HOST sample_database users --where="id<=100" > ~/hako_sample.sql

sample_databaseusersテーブルから、idが100以下のレコードのみダンプする場合、上記のようになる。

--ignore-tableオプション

ついでによく使えそうな--ignore-tableオプションも使ってみた。

--ignore-table=db_name.tbl_name

指定されたテーブルをダンプしません。これはデータベース名とテーブル名を両方指定する必要があります。複数のテーブルを無視するには、このオプションを複数回使用してください。

なるほど。

$ mysqldump -u USERNAME -p PASSWORD -h HOST sample_database --ignore-table=sample_database.users > ~/hako_sample.sql

sample_databaseusersテーブル以外の全テーブルを取得。

データベース名を再びセットするのが若干冗長な気もするけど、複数のデータベースを指定する場合もあるから仕方ないか。

複数のテーブルを無視する場合は

$ mysqldump -u USERNAME -p PASSWORD -h HOST sample_database --ignore-table=sample_database.users --ignore-table=sample_database.articles > ~/hako_sample.sql

--ignore-tableオプションを2度使用。う〜ん長い。。

参考

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム