MySQL のデータをバックアップする際に mysqldump を使用することが多いですが、大規模なデータベースでは特定のデータのみをエクスポートしたいケースがあります。mysqldump では --where オプションを使うことで、条件を指定してデータをダンプすることが可能です。本記事では、mysqldump の --where オプションの詳細な使い方と、他のオプションとの組み合わせについて解説します。
基本的な mysqldump コマンドの使い方
通常、mysqldump を使ってデータベース全体をバックアップする場合、以下のようにコマンドを実行します。
mysqldump -u ユーザー名 -p データベース名 > backup.sqlこの方法では、指定したデータベースのすべてのテーブルがダンプされます。しかし、特定のテーブルのデータのみをバックアップしたい場合は、次のようにテーブル名を指定できます。
mysqldump -u ユーザー名 -p データベース名 テーブル名 > backup.sql--where オプションを使用して条件を指定する
--where オプションを使うことで、特定の条件に合致するデータのみをエクスポートできます。例えば、users テーブルから created_at が 2024-01-01 以降のデータのみをエクスポートする場合、以下のように記述します。
mysqldump -u ユーザー名 -p データベース名 users --where="created_at >= '2024-01-01'" > users_backup.sqlまた、複数の条件を指定する場合は、SQL の AND を使います。
mysqldump -u ユーザー名 -p データベース名 orders --where="status='completed' AND order_date >= '2024-01-01'" > completed_orders.sqlLIKE検索も使うことが可能です。
mysqldump -u ユーザー名 -p データベース名 users --where='name LIKE "Foo%"' > foo_users.sqlサブクエリも使うことが可能です。
mysqldump -u ユーザー名 -p データベース名 users --where="id IN (SELECT user_id FROM orders WHERE order_date = '2024-01-01')" > order_users_20240101.sql--where オプションと組み合わせる便利なオプション
mysqldump の --where オプションと組み合わせると便利なオプションを紹介します。
--single-transaction
--single-transaction を指定すると、ダンプ中にテーブルのロックを回避しながら整合性の取れたデータを取得できます。
mysqldump -u ユーザー名 -p --single-transaction データベース名 テーブル名 --where="条件" > backup.sql--no-create-info
--no-create-info を指定すると、テーブルの CREATE 文を含めず、データのみをエクスポートできます。
mysqldump -u ユーザー名 -p データベース名 テーブル名 --where="条件" --no-create-info > data_only_backup.sql--lock-tables
デフォルトでは mysqldump は --lock-tables を有効にし、テーブルのロックを取得してバックアップを実行します。大量のデータをダンプする場合に影響があるため、必要に応じて --single-transaction を併用するのが望ましいです。
mysqldump -u ユーザー名 -p --single-transaction データベース名 テーブル名 --where="条件" --lock-tables=0 > backup.sql最新の MySQL バージョンでの動作確認
MySQL のバージョンによっては mysqldump の仕様が変更されることがあります。最新の mysqldump の仕様やオプションの詳細については、公式ドキュメントを参照してください。
まとめ
mysqldump の --where オプションを活用することで、大規模なデータベースの一部のみを効率的にバックアップできます。
--whereを使って特定のデータのみをエクスポートできる。--single-transactionを併用すると、ダンプ中のロックを回避できる。--no-create-infoでデータのみのエクスポートが可能。- MySQL の最新バージョンに合わせた仕様を確認することが重要。
特定の条件を指定してデータを抽出する場合は、適切なオプションを組み合わせて活用しましょう。
mysqldump -u root -p --where="id=1" mydb usersダブルクォートを利用するパターン
mysqldump -u root -p --where='name="Foo"' mydb users


コメント