web-dev-qa-db-ja.com

完全バックアップの後、システムはトランザクションログバックアップから復元するトランザクションをどのようにして知るのですか?

完全バックアップでは、トランザクションログファイルは切り捨てられません。

次のシナリオを想定

  1. 午前6時の完全バックアップ
  2. 午前10時のTLogバックアップ
  3. 午後1時の完全バックアップ
  4. 午後6時のTLogバックアップ
  5. 次の1秒ですぐにクラッシュする(ログ末尾のバックアップは不要)

復元する手順:

  • ポイント3から完全バックアップを復元します(午後1時のデータが含まれます)
  • 次に、手順4のtlogバックアップを復元します(10AMから6PMまでのログが含まれます)。

ご質問

  • リカバリ中に、システムはログファイルの特定の部分(1PMより後[10AMから1PMを除く])だけをデータベースで再生する必要があることをどのようにして知るのですか?
  • トランザクションログバックアップでタイムスタンプをチェックして、完全バックアップと比較しますか?それともLSNをチェックしますか?

追加シナリオ

同様に、別のシナリオで、午前10時にフルバックアップを行い、次に午後12時にトランザクションログのバックアップを取るとします。トランザクションログには、午後12時までのすべてのトランザクションが含まれます(データベースが10AMより前に存在し、以前のトランザクションログバックアップがなかったと仮定すると、10AMより前でも)。

さて、フルバックアップを復元してからトランザクションログバックアップを適用すると、システムは、ログポスト10AMのトランザクションのみを再生する必要があることをどのようにして知るのでしょうか。 10AMより前のものはすべて、フルバックアップリストアの一部としてすでに存在しているためです。タイムスタンプまたはLSNを介してチェックされますか?

1
variable

すべての復元操作は(一部では)バックアップと共に内部でmsdbデータベースに格納されているLSNに依存しています。

基本をカバー

いくつかのマイクロソフトのドキュメントから:

emphasismine)

LSNはRESTOREシーケンス中に内部的に使用され、データが復元された時点を追跡します。 バックアップが復元されると、データはバックアップが作成された時点に対応するLSNに復元されます。差分バックアップとログバックアップは、より高いLSNに対応するデータベースを後で復元しました。

トランザクションログのすべてのレコードは、ログシーケンス番号(LSN)によって一意に識別されます。 LSNは、LSN2がLSN1より大きい場合、LSN2によって参照されるログレコードによって記述される変更が、ログレコードLSNによって記述される変更の後に発生するように順序付けられます。

重要なイベントが発生したログレコードのLSNは、正しい復元シーケンスを構築するのに役立ちます。 LSNは順序付けされているため、等しいか等しくないか(つまり、<、>、=、<=、> =)を比較できます。このような比較は、復元シーケンスを作成するときに役立ちます。

参照:ログシーケンス番号に回復 (Microsoft | Docs | SQL Server)

いくつかのループを読んだ後、最終的にはMicrosoftのドキュメントページに移動します SQL Serverトランザクションログのアーキテクチャと管理ガイド

emphasismine)

SQL Serverトランザクションログは、トランザクションログがログレコードの文字列であるかのように論理的に動作します。 各ログレコードは、ログシーケンス番号(LSN)によって識別されます。新しい各ログレコードは、その前のレコードのLSNよりも大きいLSNでログの論理的な末尾に書き込まれます。ログレコードは、作成時にシリアルシーケンスで格納されます。各ログレコードには、それが属するトランザクションのIDが含まれています。トランザクションごとに、トランザクションに関連付けられたすべてのログレコードが、トランザクションのロールバックを高速化する逆方向ポインタを使用してチェーンで個別にリンクされます。

参照:SQL Serverトランザクションログのアーキテクチャと管理ガイド (Microsoft | Docs | SQL Server)

システムに入る

独自の目的で作成したスクリプトを使用してmsdbデータベースにクエリを実行すると、FULL、DIFF、およびTLOGバックアップと共に保存されている関連LSN番号の概要が表示されます。

SELECT  
/* Columns for retrieving information */
   msdb.dbo.backupset.database_name,  
   msdb.dbo.backupset.backup_start_date,  
   msdb.dbo.backupset.backup_finish_date, 
   -- msdb.dbo.backupset.expiration_date, 
   CASE msdb..backupset.type  
       WHEN 'D' THEN 'Full'  
       WHEN 'I' THEN 'Diff'
       WHEN 'L' THEN 'Log'  
   END AS backup_type,  
   -- msdb.dbo.backupset.backup_size / 1024 / 1024 as [backup_size MB],  
   -- msdb.dbo.backupmediafamily.device_type,
   msdb.dbo.backupmediafamily.physical_device_name,
   -- msdb.dbo.backupmediafamily.logical_device_name,
   -- msdb.dbo.backupset.name AS backupset_name, 
   -- msdb.dbo.backupset.description,
   msdb.dbo.backupset.is_copy_only,
   msdb.dbo.backupset.is_snapshot,   
   msdb.dbo.backupset.first_lsn,
   msdb.dbo.backupset.last_lsn,
   msdb.dbo.backupset.database_backup_lsn,
   msdb.dbo.backupset.checkpoint_lsn,
   msdb.dbo.backupset.differential_base_lsn,
   msdb.dbo.backupset.fork_point_lsn,
   msdb.dbo.backupmediaset.name,
   msdb.dbo.backupmediaset.software_name,
   msdb.dbo.backupset.user_name,
   'EOR'

FROM   msdb.dbo.backupmediafamily  
   INNER JOIN msdb.dbo.backupset 
   ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id  
   INNER JOIN msdb.dbo.backupmediaset
   on msdb.dbo.backupmediaset.media_set_id = backupmediafamily.media_set_id


/* ----------------------------------------------------------------------------
        Generic WHERE statement to simplify selection of more WHEREs    
-------------------------------------------------------------------------------*/
WHERE 1 = 1
AND     database_name IN ('<name_of_your_database>')

これにより、バックアップファイルに保存されているLSNがわかります。 msdbには、バックアップ内のすべてのLSNの完全なリストは含まれていませんが、データベースの手動復元に不可欠と見なされている主要なものだけが含まれています。

  • msdb.dbo.backupset.first_lsn
  • msdb.dbo.backupset.last_lsn
  • msdb.dbo.backupset.database_backup_lsn
  • msdb.dbo.backupset.checkpoint_lsn
  • msdb.dbo.backupset.differential_base_lsn
  • msdb.dbo.backupset.fork_point_lsn

これらの列の説明は、公式Microsoftドキュメントの backupset テーブルにあります。

StackExchangeデータベースの出力例

database_name  backup_start_date  backup_finish_date                           backup_type physical_device_name                                                    is_copy_only   is_snapshot  first_lsn            last_lsn            database_backup_lsn  checkpoint_lsn     differential_base_lsn  fork_point_lsn  name  software_name       user_name                  (No column name)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
StackExchange  2018-09-15         16:15:01.000        2018-09-15 16:15:01.000  Log         C:\SQL\Backup\StackExchange\LOG\StackExchange_LOG_20180915_161501.trn   0              0             286000001068100001  286000001068400001  286000001016900037  286000001063000002  NULL                  NULL            NULL  Microsoft SQL Server  NT SERVICE\SQLSERVERAGENT  EOR
StackExchange  2018-09-15         17:15:01.000        2018-09-15 17:15:01.000  Log         C:\SQL\Backup\StackExchange\LOG\StackExchange_LOG_20180915_171501.trn   0              0             286000001068400001  286000001068700001  286000001016900037  286000001063000002  NULL                  NULL            NULL  Microsoft SQL Server  NT SERVICE\SQLSERVERAGENT  EOR
StackExchange  2018-09-15         18:15:01.000        2018-09-15 18:15:01.000  Log         C:\SQL\Backup\StackExchange\LOG\StackExchange_LOG_20180915_181501.trn   0              0             286000001068700001  286000001069000001  286000001016900037  286000001063000002  NULL                  NULL            NULL  Microsoft SQL Server  NT SERVICE\SQLSERVERAGENT  EOR
StackExchange  2018-09-15         19:15:01.000        2018-09-15 19:15:01.000  Log         C:\SQL\Backup\StackExchange\LOG\StackExchange_LOG_20180915_191501.trn   0              0             286000001069000001  286000001069300001  286000001016900037  286000001063000002  NULL                  NULL            NULL  Microsoft SQL Server  NT SERVICE\SQLSERVERAGENT  EOR
StackExchange  2018-09-15         20:15:01.000        2018-09-15 20:15:01.000  Log         C:\SQL\Backup\StackExchange\LOG\StackExchange_LOG_20180915_201501.trn   0              0             286000001069300001  286000001069600001  286000001016900037  286000001063000002  NULL                  NULL            NULL  Microsoft SQL Server  NT SERVICE\SQLSERVERAGENT  EOR
StackExchange  2018-09-15         21:15:01.000        2018-09-15 21:15:01.000  Log         C:\SQL\Backup\StackExchange\LOG\StackExchange_LOG_20180915_211501.trn   0              0             286000001069600001  286000001070800001  286000001016900037  286000001070100001  NULL                  NULL            NULL  Microsoft SQL Server  NT SERVICE\SQLSERVERAGENT  EOR
StackExchange  2018-09-15         22:15:01.000        2018-09-15 22:15:01.000  Log         C:\SQL\Backup\StackExchange\LOG\StackExchange_LOG_20180915_221501.trn   0              0             286000001070800001  286000001071100001  286000001016900037  286000001070100001  NULL                  NULL            NULL  Microsoft SQL Server  NT SERVICE\SQLSERVERAGENT  EOR
StackExchange  2018-09-15         22:30:06.000        2018-09-15 22:30:06.000  Full        C:\SQL\Backup\StackExchange\FULL\StackExchange_FULL_20180915_223006.bak 0              0             286000001071600037  286000001073300001  286000001016900037  286000001071600037  NULL                  NULL            NULL  Microsoft SQL Server  NT SERVICE\SQLSERVERAGENT  EOR

正確なLSNはバックアップファイル自体に保存され、サードパーティのツールを使用して取得できます。

質問に答える

... SMSSの場合

復元プロセスを開始すると、いくつかのステートメントがバックグラウンドで実行されます。その結果、GUIには、データベースを一貫した状態に戻すために必要なFULL、DIFF、およびTLOGバックアップの概要が表示されます。実際のRESTORE DATABASE ...およびRESTORE LOG ...は、前述のドキュメントに従って、データベースを整合性のある状態に戻すために必要な対応するバックアップファイルの部分を決定します。

... Transact-SQLの場合

データベースを手動で復元する必要がある場合は、msdbデータベースを調べて(おそらくスクリプトを使用して)、データベースを整合性のある状態に戻すために必要なファイルを特定する必要があります。実際のRESTORE DATABASE ...およびRESTORE LOG ...は、前述のドキュメントに従って、データベースを整合性のある状態に戻すために必要な対応するバックアップファイルの部分を決定します。

概要

魔法は、バックアップファイルに格納されたLSNと、Microsoftによってコード化された復元プロセスにあります。

ライセンスを取得すると、バックアップファイルから詳細情報を読み取ることができるさまざまなAPIにプラグインできます。そのためには、Microsoftの担当者に連絡する必要があります。

3

リカバリ中に、システムは、ログファイルの特定の部分(1PMより後[10AMから1PMを除く])のみを再生する必要があることをどのようにして知るのですか?

すべての復元操作は、データベースをいくつかのLSNに残します。ログバックアップを復元する場合、LSNが復元中のデータベースのLSNより小さいログレコードはスキップされます。