mysqldumpでwhere句を使う方法

データベース データベース
主にデータベースに関する記事

MySQL のデータをバックアップする際に mysqldump を使用することが多いですが、大規模なデータベースでは特定のデータのみをエクスポートしたいケースがあります。mysqldump では --where オプションを使うことで、条件を指定してデータをダンプすることが可能です。本記事では、mysqldump--where オプションの詳細な使い方と、他のオプションとの組み合わせについて解説します。

基本的な mysqldump コマンドの使い方

通常、mysqldump を使ってデータベース全体をバックアップする場合、以下のようにコマンドを実行します。

mysqldump -u ユーザー名 -p データベース名 > backup.sql

この方法では、指定したデータベースのすべてのテーブルがダンプされます。しかし、特定のテーブルのデータのみをバックアップしたい場合は、次のようにテーブル名を指定できます。

mysqldump -u ユーザー名 -p データベース名 テーブル名 > backup.sql

--where オプションを使用して条件を指定する

--where オプションを使うことで、特定の条件に合致するデータのみをエクスポートできます。例えば、users テーブルから created_at2024-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.sql

LIKE検索も使うことが可能です。

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 の仕様やオプションの詳細については、公式ドキュメントを参照してください。

fw_error_www

まとめ

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

著者

Webエンジニア歴30年、フリーランスバックエンドエンジニア。

PHP歴約30年(Laravel 7年・FuelPHP 5年・CakePHP・自作FW)、
JavaScript歴約20年(React・Vue各4年)。
AWS(EC2 / CloudFront / RDS / API Gateway など)・
GCP(BigQuery)を使ったバックエンド開発を中心に、
複数の事業会社・受託案件でシステム設計から実装・運用まで担当しています。

PHPがバージョン4の時代から書いており、
Laravelが普及する前のフレームワーク乱立期も経験しています。
「昔はこう書いていたが今はこう」という変遷を肌で知っているエンジニアとして、
単なるコマンドの使い方だけでなく、なぜそうするのかの背景まで伝えることを意識して書いています。

このブログでは、実務で実際に詰まった箇所・調べたこと・気づいたことを
そのまま記事にしています。誰かの「詰まり」が解決するきっかけになれば幸いです。

千原 耕司をフォローする

役にたったと思ったら応援をお願いします m(._.)m

データベース
スポンサーリンク
シェアする
千原 耕司をフォローする
タイトルとURLをコピーしました