完全バックアップでは、トランザクションログファイルは切り捨てられません。
同様に、別のシナリオで、午前10時にフルバックアップを行い、次に午後12時にトランザクションログのバックアップを取るとします。トランザクションログには、午後12時までのすべてのトランザクションが含まれます(データベースが10AMより前に存在し、以前のトランザクションログバックアップがなかったと仮定すると、10AMより前でも)。
さて、フルバックアップを復元してからトランザクションログバックアップを適用すると、システムは、ログポスト10AMのトランザクションのみを再生する必要があることをどのようにして知るのでしょうか。 10AMより前のものはすべて、フルバックアップリストアの一部としてすでに存在しているためです。タイムスタンプまたはLSNを介してチェックされますか?
すべての復元操作は(一部では)バックアップと共に内部で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の完全なリストは含まれていませんが、データベースの手動復元に不可欠と見なされている主要なものだけが含まれています。
これらの列の説明は、公式Microsoftドキュメントの backupset
テーブルにあります。
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はバックアップファイル自体に保存され、サードパーティのツールを使用して取得できます。
復元プロセスを開始すると、いくつかのステートメントがバックグラウンドで実行されます。その結果、GUIには、データベースを一貫した状態に戻すために必要なFULL、DIFF、およびTLOGバックアップの概要が表示されます。実際のRESTORE DATABASE ...
およびRESTORE LOG ...
は、前述のドキュメントに従って、データベースを整合性のある状態に戻すために必要な対応するバックアップファイルの部分を決定します。
データベースを手動で復元する必要がある場合は、msdb
データベースを調べて(おそらくスクリプトを使用して)、データベースを整合性のある状態に戻すために必要なファイルを特定する必要があります。実際のRESTORE DATABASE ...
およびRESTORE LOG ...
は、前述のドキュメントに従って、データベースを整合性のある状態に戻すために必要な対応するバックアップファイルの部分を決定します。
魔法は、バックアップファイルに格納されたLSNと、Microsoftによってコード化された復元プロセスにあります。
ライセンスを取得すると、バックアップファイルから詳細情報を読み取ることができるさまざまなAPIにプラグインできます。そのためには、Microsoftの担当者に連絡する必要があります。
リカバリ中に、システムは、ログファイルの特定の部分(1PMより後[10AMから1PMを除く])のみを再生する必要があることをどのようにして知るのですか?
すべての復元操作は、データベースをいくつかのLSNに残します。ログバックアップを復元する場合、LSNが復元中のデータベースのLSNより小さいログレコードはスキップされます。