- 1 1. データベースの一貫性を保つバックアップの重要性
- 2 2. mysqldumpの基本的な使い方
- 3 3. –single-transactionオプションの詳細
- 4 4. –single-transactionオプションの使用方法
- 5 5. –single-transactionオプションの注意点
- 6 6. –single-transactionオプションと他のオプションの組み合わせ
- 7 7. よくある質問(FAQ)
- 7.1 Q1. --single-transactionオプションは、どのようなケースで使用するのが適していますか?
- 7.2 Q2. MyISAMテーブルが含まれている場合でも、--single-transactionは使えますか?
- 7.3 Q3. --single-transactionと--lock-tablesを同時に使うとどうなりますか?
- 7.4 Q4. ダンプ中にCREATE TABLEやALTER TABLEなどのDDL操作が行われた場合はどうなりますか?
- 7.5 Q5. --single-transactionを使用する際に、併用が推奨されるオプションはありますか?
- 7.6 Q6. バックアップ時間を短縮する方法はありますか?
- 7.7 Q7. --single-transactionのバックアップをリストアする方法は?
- 8 8. まとめ
1. データベースの一貫性を保つバックアップの重要性
データベースのバックアップは「保険」
ビジネスにおいてデータベースは心臓部とも言える存在です。顧客情報、取引履歴、在庫データなど、あらゆる業務がデータベースに依存しています。万が一、障害や人為的ミスによりデータが失われた場合、業務停止や信頼喪失といった深刻なリスクを招く可能性があります。
そのため、定期的なバックアップは「保険」として欠かせない運用のひとつです。
バックアップ中のデータ整合性はどう確保する?
ただし、バックアップを取得する際に課題となるのが「一貫性(整合性)」の確保です。特に、システムが稼働中でも止めることなくバックアップを行いたい場合、データの整合性をどう保つかは非常に重要なポイントです。
たとえば、バックアップ取得中に誰かがテーブルを更新したら、ダンプされた内容と実際のデータベースにズレが生じてしまう恐れがあります。
mysqldumpとは? そして–single-transactionとは?
MySQLやMariaDBで広く使われているバックアップツールが「mysqldump」です。シンプルなコマンドライン操作でデータベース全体や特定のテーブルをSQLファイルとしてエクスポートできます。
このmysqldumpでバックアップの一貫性を保ちながら、安全かつ効率的に取得するために用いられるオプションが、今回のテーマである --single-transaction
です。
このオプションは、トランザクション(処理単位)を使って「スナップショットのように一時点の状態」を保存しながら、他の処理をブロックせずにバックアップを行える非常に便利な機能です。
この記事で得られること
本記事では、mysqldump --single-transaction
オプションの使い方・注意点・他のオプションとの組み合わせ方まで、実用的な観点から徹底的に解説します。
mysqldump
の基礎から理解したい人--single-transaction
の意味を正しく知りたい人- 実務で安全なバックアップ運用を構築したい人
こういった方々に向けて、実際のコマンド例も交えながらわかりやすく解説していきます。ぜひ最後までご覧ください。
2. mysqldumpの基本的な使い方
mysqldumpとは?
mysqldump
は、MySQLやMariaDBのデータベースをバックアップするための標準的なコマンドラインツールです。テーブルの構造やデータをSQL形式でエクスポートすることができ、復元時にはそのSQLを実行するだけで簡単に元の状態に戻すことができます。
バックアップの手段としては非常に手軽かつ強力で、開発環境や本番環境を問わず幅広く活用されています。
基本的なmysqldumpの構文
以下は、もっともシンプルな形式のmysqldump
コマンドです。
mysqldump -u ユーザー名 -p データベース名 > 出力ファイル.sql
-u
:MySQLにログインするユーザー名-p
:パスワード入力を促すフラグ(入力省略不可)データベース名
:バックアップ対象のデータベース>
:出力先ファイルを指定(リダイレクト)
コマンド実行後、パスワードの入力が求められ、問題なければSQL形式のバックアップファイルが生成されます。
特定のテーブルだけをバックアップする
データベース全体ではなく、特定のテーブルだけをバックアップしたい場合は、以下のようにテーブル名を指定します。
mysqldump -u ユーザー名 -p データベース名 テーブル名1 テーブル名2 > 出力ファイル.sql
たとえば、users
と orders
テーブルだけをバックアップしたい場合は次のようになります。
mysqldump -u root -p shop_db users orders > users_orders.sql
複数のデータベースをバックアップする
-B
オプションを使用すると、複数のデータベースをまとめてバックアップできます。
mysqldump -u ユーザー名 -p -B データベース1 データベース2 > multi_backup.sql
この方法では、CREATE DATABASE
文も含まれるため、リストア時にそのまま使える点が便利です。
すべてのデータベースを一括バックアップ
システム全体のバックアップが必要な場合は、-A
(または --all-databases
)を使用します。
mysqldump -u ユーザー名 -p -A > all_databases.sql
このコマンドでは、MySQLサーバー上のすべてのデータベースがダンプ対象となります。MySQLのシステムデータベース(mysql
, information_schema
など)も含まれるため、環境移行などに適しています。
バックアップの復元方法
mysqldump
で取得したSQLファイルは、次のようなコマンドで復元できます。
mysql -u ユーザー名 -p データベース名 < 出力ファイル.sql
このようにして、バックアップデータを新たな環境や破損時に復元できます。
3. –single-transactionオプションの詳細
バックアップ中の一貫性を保つための鍵
mysqldump
コマンドは、デフォルトでは各テーブルを順番にダンプしていきます。そのため、バックアップの処理中に他のユーザーがデータを変更すると、途中の状態が保存されてしまい、復元時にデータの整合性が崩れる可能性があります。
この問題を解決するのが、--single-transaction
オプションです。
–single-transactionの基本的な仕組み
このオプションを使うと、mysqldumpはダンプ処理の最初にBEGINステートメントを実行し、トランザクションを開始します。これにより、その時点でのデータベースのスナップショット(静止状態)が作られ、ダンプ中に他のトランザクションが変更を加えても、バックアップは影響を受けずに完了できます。
つまり、「ダンプの最初の一瞬」の状態を丸ごとバックアップできるため、一貫性が保たれるというわけです。
利用できるのはInnoDBのみ
ここで注意が必要なのは、--single-transaction
が効果を発揮するのはInnoDBストレージエンジンを使用しているテーブルに限られるという点です。InnoDBはトランザクションに対応しているため、スナップショットの作成と維持が可能です。
一方、MyISAMやMEMORYといったトランザクション非対応のストレージエンジンを使用している場合、--single-transaction
の効果は得られません。このような場合、代替として--lock-tables
や--lock-all-tables
などのロックオプションが必要になります。
テーブルロックとの違い
デフォルトでは、mysqldumpはデータの整合性を保つためにテーブルをロックします(--lock-tables
が自動的に有効)。しかし、この方法は他のユーザーがデータを更新できなくなる=サービス停止が起きるというデメリットがあります。
--single-transaction
を使えば、ロックなしでバックアップが取れるため、サービスを止めずにバックアップを行うことができます。特に本番環境では非常に重宝される機能です。
イメージ図(文章での説明)
【通常のmysqldump】
時間経過 → [usersテーブルダンプ開始] → [途中でデータ変更] → [ordersテーブルダンプ開始] → データにズレ発生
【--single-transactionを使用】
時間経過 → [BEGINでスナップショット作成] → [users, ordersすべて一貫した時点でダンプ] → 安全なバックアップ完了
注意:DDL操作には無力
ただし、--single-transaction
はデータの変更(INSERT, UPDATE, DELETE)には強いですが、テーブル定義の変更(CREATE, DROP, ALTERなど)には無力です。バックアップ中にDDL操作が行われると、エラーや一貫性の欠如が発生する可能性があります。
そのため、バックアップを行う時間帯はできるだけメンテナンスウィンドウ中や、DDLを避けたタイミングに設定するのが理想です。
まとめ
--single-transaction
は、InnoDBを利用したMySQL環境において、サービスを止めずに一貫性のあるバックアップを取得するための非常に有効な手段です。その仕組みを理解し、正しく活用することで、安全で効率的なデータ保護が実現できます。
4. –single-transactionオプションの使用方法
基本的なコマンド例
まずは、最もシンプルな--single-transaction
の使い方から確認しましょう。
mysqldump --single-transaction -u ユーザー名 -p データベース名 > 出力ファイル.sql
このコマンドでは、InnoDBエンジンを使用しているデータベースに対して、トランザクションを開始した時点の状態をバックアップとして保存します。バックアップ中も他の処理に影響を与えず、サービスを停止させずに作業できるのが大きな利点です。
複数のテーブルを指定してバックアップ
特定のテーブルのみを対象に、--single-transaction
を適用することも可能です。
mysqldump --single-transaction -u root -p shop_db users orders > users_orders.sql
このようにテーブルを個別に指定しても、一貫性のあるスナップショットを作成し、同一の時点でのデータがエクスポートされます。
複数のデータベースをまとめてバックアップ
複数のデータベースを対象にするには、-B
(または--databases
)オプションと組み合わせて使います。
mysqldump --single-transaction -u root -p -B db1 db2 > multi_db_backup.sql
この形式では、各データベースに対してCREATE DATABASE文を含んだ形でダンプされるため、リストア時の利便性が高まります。
すべてのデータベースを対象にバックアップ
システム全体のバックアップが必要な場合は、-A
(または--all-databases
)オプションと組み合わせて使用します。
mysqldump --single-transaction -u root -p -A > full_backup.sql
このコマンドは、MySQLサーバー上の全データベース(mysql
, information_schema
, performance_schema
なども含む)をダンプするため、サーバー移行時やフルリストアの際に有効です。
実行時の確認ポイント
- ストレージエンジンがInnoDBであること
--single-transaction
はInnoDBに対してのみ有効です。MyISAMなどのトランザクション非対応エンジンでは期待通りの動作になりません。 --lock-tables
と併用しないこと--single-transaction
と--lock-tables
は相反する動作のため、整合性の保証が崩れます。明示的に--skip-lock-tables
を追加すると安心です。
よくある実行例(推奨構成)
mysqldump --single-transaction --quick --skip-lock-tables -u root -p production_db > backup.sql
この構成は以下のような特徴があります:
--quick
:大量データを一度にメモリに載せず、行ごとに出力してメモリ使用量を抑える--skip-lock-tables
:自動ロック回避を明示することで安全な挙動を保証
シェルスクリプトでの自動化例
実運用では、定期的なバックアップをスクリプト化してcronなどで自動実行するケースも一般的です。
#!/bin/bash
DATE=$(date +%F)
mysqldump --single-transaction --quick --skip-lock-tables -u root -pYourPassword production_db > /backups/production_$DATE.sql
※パスワードは環境変数や設定ファイルで管理するのが推奨です。

5. –single-transactionオプションの注意点
トランザクション非対応エンジンでは効果なし(MyISAMなど)
このオプションはトランザクション対応のストレージエンジン(主にInnoDB)でのみ有効です。MyISAMやMEMORYなどのエンジンはトランザクション機能を持たないため、--single-transaction
を指定しても一貫性は保証されません。
例:
users
テーブルがInnoDBlogs
テーブルがMyISAM
このような混在環境でバックアップを取得すると、users
テーブルは一貫性が保たれますが、logs
テーブルには他の操作の影響が出る可能性があります。
対策:
- できる限りInnoDBに統一する。
- MyISAMなどが混在する場合は
--lock-all-tables
の使用を検討してください。
DDL操作(テーブル定義変更)には無力
--single-transaction
は、ダンプ中のデータ操作(SELECT, INSERT, UPDATE, DELETE)には強いですが、DDL(CREATE, DROP, ALTERなど)には対応できません。
ダンプ中にテーブル定義が変更されると、次のようなリスクがあります。
- ダンプ途中でテーブルが削除された → エラー発生
- ダンプ中にテーブル定義が変更された → スキーマの不整合
対策:
- バックアップ実行中はDDLを行わないルールを設ける。
- 可能であればメンテナンス時間にバックアップを行う。
--lock-tables
との併用は不可
mysqldumpは、デフォルトで--lock-tables
オプションを有効にしますが、これは--single-transaction
とは相反する動作になります。テーブルロックはトランザクションの開始前に実行されるため、整合性の保証が崩れます。
そのため、--single-transaction
を使用する際は明示的に--skip-lock-tables
を併用することが推奨されます。
mysqldump --single-transaction --quick --skip-lock-tables -u root -p dbname > backup.sql
一貫性の担保は「開始時点」のみ
--single-transaction
は、mysqldumpがトランザクションを開始した時点の状態をスナップショットとして保持します。その後に行われる変更は当然ダンプには含まれません。
これにより、ダンプ中の変更によるロック競合は避けられますが、あくまで「ある時点のスナップショット」であることを認識しておく必要があります。
大量データの場合は–quickと併用を
大量データをバックアップする場合、mysqldumpはデフォルトでテーブル全体をメモリに読み込もうとするため、メモリ不足やスワップの発生を招く可能性があります。
このようなケースでは、以下のように--quick
オプションを併用し、1行ずつ読み込みながら出力する方式をとることで、メモリ使用量を大幅に抑えることができます。
mysqldump --single-transaction --quick --skip-lock-tables -u root -p dbname > backup.sql
まとめ
--single-transaction
は、サービスを止めずに一貫性のあるバックアップを実現できる強力なオプションですが、正しく使うためにはいくつかの注意点を理解しておく必要があります。本番環境での使用時には、ストレージエンジンやDDL操作との相性を考慮し、適切なタイミングと設定でバックアップを行いましょう。
6. –single-transactionオプションと他のオプションの組み合わせ
–quick:メモリ消費を抑える最強のパートナー
mysqldump --single-transaction --quick -u root -p dbname > backup.sql
--quick
オプションを付けると、mysqldumpはデータを一度にメモリに読み込まず、1行ずつ読み込みながら出力します。これは特に大規模なテーブルを扱う場合に有効で、メモリ使用量を大幅に削減できます。
メリット:
- バックアップ処理中のメモリ使用量を抑えられる
- スワップの発生や処理落ちを防げる
- 大量データ環境での安定性向上
推奨: --single-transaction
を使うなら、ほぼ常に--quick
を併用するのがベストプラクティスです。
–skip-lock-tables:自動ロックを明示的に回避
mysqldumpは、デフォルトで--lock-tables
オプションを有効にしようとしますが、これは--single-transaction
とは相反する動作になります。衝突を避けるためには明示的に--skip-lock-tables
を指定しておくのが安心です。
mysqldump --single-transaction --quick --skip-lock-tables -u root -p dbname > backup.sql
メリット:
- コマンドの意図が明確になり、トラブルを避けやすい
- オプションの衝突によるエラーや警告を防止
–master-data:レプリケーション用途に最適
MySQLのレプリケーション構成において、スレーブ側での正確な同期を行うためには、--master-data
オプションを使用するのが一般的です。
mysqldump --single-transaction --quick --master-data=2 -u root -p dbname > repl_backup.sql
--master-data=2
を指定すると、現在のバイナリログファイル名とポジションがダンプファイル内にコメントアウトされた形で記録されます。スレーブを立ち上げる際に、この情報を使って同期が可能になります。
注意点:
--master-data
も--single-transaction
と同様、InnoDB前提で使うべきです。--flush-logs
と併用してバイナリログをローテーションすることもあります。
–set-gtid-purged=OFF:GTIDを無効にしたい場合に
GTID(グローバルトランザクションID)を使用している環境では、mysqldumpがGTIDの定義を自動で書き込もうとしますが、場合によってはこれを無効化したいケースもあります。
mysqldump --single-transaction --quick --set-gtid-purged=OFF -u root -p dbname > no_gtid.sql
用途:
- スレーブ構成外の一時バックアップ
- 別の環境にデータを移したいとき
その他オプションとの組み合わせ例(総合)
mysqldump --single-transaction --quick --skip-lock-tables --master-data=2 --set-gtid-purged=OFF -u root -p production_db > production_backup.sql
このように、複数のオプションを組み合わせることで、「一貫性」「メモリ効率」「レプリケーション対応」「GTID管理」まで対応した、実用的なバックアップスクリプトを構築できます。
まとめ
--single-transaction
は単体でも強力ですが、他のオプションと組み合わせることで環境や目的に応じた最適なバックアップ戦略を実現できます。特に--quick
や--skip-lock-tables
との併用はほぼ必須レベルであり、レプリケーション運用をしている場合は--master-data
の利用も検討すべきです。
mysqldumpを最大限に活用するには、目的に応じたオプション選定が鍵となります。
7. よくある質問(FAQ)
ここでは、mysqldump --single-transaction
に関して、実務でよく寄せられる質問とその回答をまとめました。現場でのトラブル防止や運用設計の参考にしてください。
Q1. --single-transaction
オプションは、どのようなケースで使用するのが適していますか?
A1.
InnoDBストレージエンジンを使用しており、かつサービスを止めずに一貫性のあるバックアップを取得したい場合に最適です。ECサイトや予約システムなど、常にユーザーからアクセスがあるような本番環境では特に重宝されます。
Q2. MyISAMテーブルが含まれている場合でも、--single-transaction
は使えますか?
A2.
使用は可能ですが、MyISAMテーブルのデータ整合性は保証されません。MyISAMはトランザクション非対応のため、バックアップ中に更新があればダンプ内容が不整合になる可能性があります。MyISAMを含む場合は、代わりに--lock-all-tables
の使用を検討してください。
Q3. --single-transaction
と--lock-tables
を同時に使うとどうなりますか?
A3.
両者は相反する動作のため、mysqldumpが自動的にどちらかを無効化します。ただし、明示的に--skip-lock-tables
を指定しておいた方が、意図しない動作や警告を回避できるため、安全です。
Q4. ダンプ中にCREATE TABLE
やALTER TABLE
などのDDL操作が行われた場合はどうなりますか?
A4.--single-transaction
はDDL操作に対しては無力です。ダンプ中にテーブル定義が変更されると、ダンプの失敗や整合性のないバックアップになるリスクがあります。したがって、バックアップを行う時間帯はできるだけメンテナンスウィンドウ中や、DDLを避けたタイミングに設定するのが理想です。
Q5. --single-transaction
を使用する際に、併用が推奨されるオプションはありますか?
A5.
はい、以下のオプションを併用することで、バックアップの安全性・効率性が向上します。
--quick
:メモリ使用量を抑えて安定したダンプが可能に--skip-lock-tables
:テーブルロックの競合を明示的に回避--master-data=2
:レプリケーション用のバックアップに対応--set-gtid-purged=OFF
:GTID未対応の環境でも柔軟に扱える
Q6. バックアップ時間を短縮する方法はありますか?
A6.
以下のような対策が有効です:
--quick
オプションでメモリ使用量を抑えつつ高速化- 特定のテーブルだけを選んでバックアップ(部分バックアップ)
- バックアップ対象データを事前にアーカイブ・削除してスリム化
- SSD環境や高速ストレージにバックアップファイルを出力
Q7. --single-transaction
のバックアップをリストアする方法は?
A7.
通常のmysqldump
ファイルと同様、以下のコマンドでリストアできます。
mysql -u ユーザー名 -p データベース名 < backup.sql
バイナリログやGTIDを含むバックアップの場合、リストア前に必要な調整や設定が必要となることもあります(例:CHANGE MASTER TO
コマンドなど)。
8. まとめ
mysqldump --single-transaction
は、MySQL や MariaDB 環境においてサービスを停止せずに一貫性のあるバックアップを取得するための強力な手段です。本記事では、その仕組みから使用方法、注意点、他オプションとの組み合わせ、さらにはFAQまでを網羅的に解説してきました。
本記事のポイントを振り返りましょう
--single-transaction
は、InnoDBのトランザクション機能を活用して、スナップショットベースの整合性あるバックアップを実現します。- 使用することで、テーブルロックを回避しながら本番環境でも安全にダンプを取得できます。
- ただし、MyISAMなどの非トランザクションエンジンやDDL操作には対応していないため、用途と環境を十分に理解したうえでの運用が必要です。
--quick
や--skip-lock-tables
、--master-data
など、目的に応じたオプションとの組み合わせが品質と効率を高めます。- FAQでは、実務上よくある疑問にも対応し、現場での安心感を支える内容を網羅しました。
安全で効率的なバックアップ戦略を
企業やサービス運営において、データ損失はビジネスの信用問題にも直結します。mysqldump と --single-transaction
を活用すれば、信頼性と実用性を両立したバックアップ運用が可能になります。
重要なのは、「とりあえずバックアップしている」から一歩進んで、「一貫性のある、障害時に信頼できるバックアップ」を取得するという意識です。そのために、本記事の知識をぜひ日々の運用にお役立てください。