8

マニュアルを読んだところ、すべてのトランザクションがBEGINダンプの取得を開始する前にステートメントを追加することが言及されていました。誰かがこれをよりわかりやすい方法で詳しく説明できますか?

これが私が読んだものです:

このオプションは、サーバーからデータをダンプする前に BEGIN SQL ステートメントを発行します。これは、アプリケーションをブロックすることなく、BEGIN が発行された時点でのデータベースの一貫した状態をダンプするため、InnoDB や BDB などのトランザクション テーブルでのみ役立ちます。」

これについて詳しく説明できますか?

4

3 に答える 3

23

ダンプは 1 つのトランザクションで行われるため、データベース内のすべてのテーブルの一貫したビューが得られます。これは、おそらく反例によって最もよく説明されます。2 つのテーブルを持つデータベースをダンプするとしますOrdersOrderLines

  1. 単一のトランザクションなしでダンプを開始します。
  2. 別のプロセスがテーブルに行を挿入しOrdersます。
  3. 別のプロセスがテーブルに行を挿入しOrderLinesます。
  4. ダンプはOrderLinesテーブルを処理します。
  5. Orders別のプロセスがおよびOrderLinesレコードを削除します。
  6. ダンプはOrdersテーブルを処理します。

この例では、ダンプには の行がありますが、行はOrderLinesありませんOrdersOrdersと の間に外部キーがある場合、データは一貫性のない状態になり、復元に失敗しOrderLinesます。

単一のトランザクションでそれを行った場合、トランザクションの開始後に両方が挿入されて削除されるため、ダンプには順序も行もありません (ただし一貫性があります)。

于 2012-05-22T15:42:46.280 に答える
5

以前は、ダンプ中にデータが変更されたために、-single-transactionパラメーターを指定しないmysqldumpが一貫して失敗するという問題が発生していました。私が理解できる限り、単一のトランザクション内で実行すると、ダンプ中に発生する変更によって問題が発生するのを防ぐことができます。基本的に、-single-transactionを発行すると、ユーティリティの実行中に変更される可能性のあるデータをダンプするのではなく、その時点でデータベースのスナップショットを取得してダンプします。

于 2012-05-22T15:37:17.450 に答える
5

これは、ある時点でのすべてのデータを正確に取得することを意味するため、バックアップにとって重要な場合があります。

たとえば、単純なブログ データベースを想像してみてください。

  1. 新しいユーザーを作成する
  2. ユーザーによる新しい投稿の作成
  3. 投稿を削除したユーザーを削除する

データベースをバックアップすると、バックアップはこの順序でテーブルをバックアップする場合があります

  1. 投稿
  2. ユーザー

バックアップが #1 に達した直後に、誰かが投稿に必要なユーザーを削除するとどうなりますか?

データを復元すると、投稿があることがわかりますが、ユーザーはバックアップに存在しません。

全体にトランザクションを配置するということは、バックアップ中にデータベースで発生するすべての更新、挿入、および削除がバックアップによって認識されないことを意味します。

于 2012-05-22T15:42:22.977 に答える