なぜ差分バックアップではベースを指定できないのですか?


18

これは私の最初のDBA.SE投稿ですので、間違いがある場合はお知らせください、ありがとう!

私は新しいDBAです(ITプロフェッショナルではなく、社内の他の誰もやっていません)。私はデータベースのバックアップ戦略について読んでいます(または、それらを呼び出すことを学んだように、「復元戦略」)。完全バックアップ、差分バックアップ、およびトランザクションログバックアップの機能は理解していますが、差分バックアップが最新の完全バックアップのみに基づいている理由を知りたいです。

最後の完全バックアップ以降に変更されたすべてが差分バックアップである場合、選択したバックアップに基づいて差分を作成できないのはなぜですか?もっと明確にするために、復元時ではなく、バックアップ時のベースの指定について尋ねています。復元時に、正しいベースとそれに対応する差分を選択して復元を実行すると想定しています(ベースAから復元するためにベースBから作成された差分を使用しない)。

この機能が使用できなくなる理由は何ですか?理由があるに違いないと思うのですが、それが何なのかわかりません。

注:ベースを指定できないことは理解していますが、質問はなぜですか?(「なぜあなたは?」についての議論にも興味がありません)

類推

差分バックアップを理解する方法の例えを以下に示します。

セルにいくつかのデータを含むExcelファイルがあります。

1日目に、このファイルのコピーを作成し、別の場所に保存します(「フルバックアップ」)。

2日目に、ファイルを見て、1日目に作成したバックアップコピーと比較し、変更されたすべてのセルとそれらの新しい値を確認します(「差分バックアップ」)。セルに加えられたすべての変更に注目するのではなく、その最終的な価値に注目します。セルA1が「Alfred」として始まり、「Betty」、「Charlie」、そして「Dave」に変わった場合、「A1 is now Dave」にしか気付かないでしょう。

3日目に、現在のファイルとバックアップファイルを再度比較し、変更を確認します(2日目と同じベースの別の「差分バックアップ」)。繰り返しますが、観察された時間のセルごとの最終値のみに注目し、そのセルが一日中ずっとあったすべての値ではありません。

4日目に、私は再び比較し、再び変化に注意します。セルA1を続けると、「Sarah」と表示されますが、たとえ1日中10名だったとしても、「今A1はSarah」です。

5日目に、私のファイルが台無しになります。したがって、1日目に作成したバックアップコピーを確認し、4日目に最終状態を記録し、記録した変更をバックアップコピーに適用すると、4日目にファイルが「復元」されます。したがって、1日目に作成されたバックアップを見て、4日目にセルA1が「サラ」として終了したことを確認し、バックアップセルA1を「サラ」に変更します。

2日目にファイルの別のバックアップコピー(「フル」)を作成した場合、なぜ問題になるのですか?3日目または4日目のファイルと1日目に作成されたコピーを比較(読み取り、「差分バックアップ」)することがまだできないのはなぜですか?私が理解しているように、SQL Serverでは、(別の差分バックアップを作成する場合)2日目に作成された完全バックアップ(作成されている場合)と比較する必要があります。他のオプションはありません。

回答:


14

差分バックアップは、差分変更マップと呼ばれるものを使用して、最後の完全バックアップ以降に変更されたページのリストを作成します。このリストは「差分」リストであるため、バックアップタイプの名前と、バックアップが関連するフルバックアップの上にのみ復元できる理由です。

完全バックアップを実行すると、差分変更マップがリセットされます。その時点から、変更されたページはすべてマップに記録されます。その後、差分を取る場合、そのバックアップには、最後の完全バックアップ以降に変更され、マップに記録されたページのみが含まれます。

たとえば、復元プロセス全体のベースとして機能する2つの完全バックアップの内容は異なるため、差分マップも異なります。最初のバックアップに基づいて差分を2番目のバックアップに復元すると、データベースが破損する可能性があります。実際、SQL Serverは、元になっている元の完全バックアップ以外の差分バックアップの復元を防ぎます。

SQL Serverに差分バックアップを取得するように要求する場合、差分の唯一の「ベース」は、差分バックアップの開始時にデータベースに存在する単一の差分変更マップです。これが、差分バックアップのベースを指定できない理由です。


@MartinSmithからのコメントに応じて、COPY_ONLYバックアップを使用して、複数の完全バックアップにわたって差分バックアップを復元できる場合があります。次のシナリオを検討してください。

  1. BACKUP DATABASE xyz TO DISK = 'path_to_backup.bak';
  2. BACKUP DATABASE xyz TO DISK = 'path_to_backup_2.bak' WITH COPY_ONLY;
  3. BACKUP DATABASE xyz TO DISK = 'path_to_backup_3.bak' WITH COPY_ONLY;
  4. BACKUP DATABASE xyz TO DISK = 'path_to_backup_4.bak' WITH COPY_ONLY;
  5. BACKUP DATABASE xyz TO DISK = 'path_to_backup_diff.bak' WITH DIFFERENTIAL;

差分変更マップは手順1の完全バックアップが発生したときにのみクリアされるため、手順5の差分バックアップは手順1〜4で実行されたバックアップのいずれかで復元できる必要があります。COPY_ONLY手順2、3、および4 のバックアップでは、変更マップリセットされませ。差分変更マップにはフルバックアップ以降に行われた変更が蓄積されるため、連続する各COPY_ONLYバックアップには、差分バックアップが以前の4つのバックアップのいずれかに対して機能するのに十分な情報が含まれます。

動作するように見えますが、実際には、copy_onlyバックアップの上に差分を復元すると、次のエラーが発生します。

メッセージ3136、レベル16、状態1、行1
この差分バックアップは、データベースが以前の正しい状態に復元されていないため、復元できません。
メッセージ3013、レベル16、状態1、行1
RESTORE DATABASEが異常終了しています。

差分およびcopy_onlyリストアをテストするためのSQL Server 2012プラットフォームの再現を作成し、gist.github.comにファイルを保存しました -スクリプトはRestoreTest、最初のステップとして指定されたデータベースを削除します。


完全バックアップを実行すると、差分変更マップがリセットされます(そうでない場合のみ)COPY_ONLY-OPが1日目に通常の完全バックアップを行い、COPY_ONLY2日目に完全バックアップを行う場合、同じベースから後の差分を適用することによって生じる問題2日目のバックアップへ?
マーティンスミス

私はそれをテストしましたが、実際には「データベースが以前の正しい状態に復元されていないため、この差分バックアップは復元できません。」-これがうまくいかない理由があるのか​​、それとも実装されていないのかはわかりません。
マーティンスミス

1
@MartinSmith-ちょっと 私もそれを検証しました。
マックスヴァーノン

5

必要な機能は原則として存在する可能性があります。現在のデータベース構造では効率的ではありません(Max Vernonの回答を参照)。SQL Serverは、一連のdiffマップを保持するか、ベースとして指定した完全バックアップと現在のDBの内容を比較する必要があります。

大きなファイルを重複排除するアプリケーションがあります。2つの完全バックアップを作成でき、変更されたデータのみが実際に保存されます。これは、カスタムベースのdiffのようなものです。exdupeたとえば、それを行うことができます。

それについての良いところは、バックアップファイルのセットで動作することです。実際、3番目の完全バックアップファイルから始めて、増分(差分ではなく)スペース使用量のみを支払います。スペース使用量は、前のバックアップファイルとの違いです(最初のバックアップファイルとは異なります)。重複排除ストレージにも同様の動作があります。

記述した機能が存在しないのはなぜですか?各機能は予算を消費し、他の機能が存在しないようにします。これはどうやら優先順位リストで十分ではなかったようです。それが何のために良いのか分かりません。カスタムベースを使用するのはかなり難解な要件のようです。


3

トランザクションログのバックアップと差分バックアップを混同しないでください。目的は異なります。「差分バックアップ」と呼ばれ、「セルへのすべての変更に注意する」ことは、実際にはトランザクションログです。

差分バックアップの目的は、最後の完全バックアップ以降に変更された情報のみを記録することにより、結果のバックアップファイルのサイズを小さく保ち、復元時間目標(RTO)内に復元時間を保つことです。

トランザクションログのバックアップの目的は、トランザクションを任意の時点まで再生できるようにすることです。多くの場合、「必ず起こる最新のもの」とは限りません。

あなたが話していることは実際には可能です-しかし、完全なバックアップを復元してから、トランザクションログを復元する必要があります。

1日目の完全バックアップと、1日目から5日目のすべてのトランザクションログバックアップがある場合、1日目のバックアップを復元し、4日目のデータが得られるまでトランザクションログを再生することを妨げるものは何もありません。また、2日目のバックアップから開始することもできます。これは、より少ないトランザクションを再生するため、復元がわずかに速くなります。また、1日目の完全バックアップ、3日目の差分バックアップを復元してから、トランザクションログを4日目に復元することもできます。

編集:OK、編集したアナロジーはもう少し意味があります。その答えは、「トランザクションログバックアップで必要なものをすでに達成できるからです」。差分バックアップは、トランザクションログのアクティビティ全体を記録するための安価で便利な方法にすぎません。トランザクションログバックアップでは提供されないデータリカバリの粒度は提供されません。それを製品にする「便利さ」を提供する機能は非常に多くあります。


アナロジーの言い回しが不十分で、編集の
準備が

新しい類推のために編集されました。
dpw

1

Excelとの類推は、リンゴとオレンジを比較することです。どうして ?Excelはデータの整合性に欠けるため、データベースではありません。Excelは非常に優れたスプレッドシートアプリケーションであり、データベースを補完する可能性があります。

SQL Serverは、すべてのデータを保存し、クエリを実行するメカニズムを提供するリレーショナルデータベースシステムです。データの整合性(ACIDプロパティ)とともにデータの関係が重要であるため、重要な部分は「関係」です。

基本:

データベース内のデータは、ユーザーに表示される論理コンポーネント(テーブル、ビュー、プロシージャ、トリガーなど)に編成されます。データベースは、ディスク上の2つ(データとログファイル)以上のファイル(セカンダリデータファイル)としても物理的に実装されます。

  • データベースには、レコードの保存に使用されるデータストレージの基本単位であるページが含まれます
  • データベースページは、データベースデータファイルの8192バイト(8KB)のチャンクです。
  • データベースファイル内の8つの物理的に連続したページ(8 * 8KB = 64KB)はエクステントを形成します
  • IAM(インデックス割り当てマップ)ページは、1つのファイルで約4GBのスペースを追跡し、4GBの境界に整列します。これらの4GBチャンクはGAMインターバルと呼ばれます

差分バックアップが最新のフルバックアップのみに基づいている理由。-または-最後の完全バックアップ以降に変更されたすべてが差分バックアップである場合、選択したバックアップに基づいて差分を作成できないのはなぜですか?

Excelに関するあなたの類推に基づいて、あなたがしていることは前者に変更されたものを適用することです。これは、コミットされたすべてのトランザクションをトランザクションログから適用しますwith STOP AT(注:5日目にファイルが台無しになり、4日目に停止します)

すべてのデータファイルの4GBセクション(GAMインターバルと呼ばれる)ごとに、差分ビットマップと呼ばれる特別なデータベースページがあり、最後の完全バックアップ以降に4GBセクションのどの部分(エクステントと呼ばれる)が変更されたかを追跡します。データベースに追加されました。

差分バックアップはこれらのビットマップをスキャンし、変更済みとしてマークされているデータファイルエクステントのみをバックアップします。ビットマップは次のフルバックアップによってリセットされるため (差分バックアップは最新のフルバックアップのみに基づくことができます、データベースの変更が増えるにつれて、差分ビットマップでより多くのマークが付けられることがわかります。連続する差分バックアップはますます大きくなります。

このスクリプトを使用して、最後の完全バックアップ以降にデータベースのどの部分が変更されたかを調べることもできます。

差分ベース情報はmasterデータベースに保存されます- sys.database_fileまたは(sys.master_files-データベースがread_onlyまたはオフラインの場合に便利です)。

微分ベースに関連する情報を格納する3つの重要な列があります。

  • これdifferential_base_lsnが差分バックアップのベースです。後differential_base_lsnに変更されるデータ範囲は、差分バックアップに含まれます。
  • differential_base_guid一意な識別子であるベースバックアップ、差分バックアップが基づいています。
  • differential_base_time対応する時間ですdifferential_base_lsn

差分バックアップは、大規模なデータベースやトランザクションログバックアップのボリュームが大きくなると復元する場合に問題となるより頻繁なフルバックアップとは対照的に、RTO(目標復旧時間=データベースの復旧にかかる時間)を短縮するのに役立ちます。時間枠にわたって。

注: COPY_ONLY完全バックアップは差分ベースをリセットしないため、COPY_ONLYバックアップは差分ベースとして機能できません。

参考文献:



2
@PaulSRandalは、レコードを保存するページが存在することを書きました彼のブログでそれをそのまま参照しました。(参照に基づいて)あなたが伝えていることを論理的参照に取り入れることも真実です!
キンシャー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.