トランザクションログをデータベースに復元していますが、どのトランザクションログから始めるべきかを知る方法が必要です。通常、次のようなものが表示されます。
このバックアップセットのログはLSN103000001633300001で終了しますが、これはデータベースに適用するには時期尚早です。 LSN103000002524300001を含む最新のログバックアップを復元できます。
では、LSN 103000002524300001をプログラムで取得するにはどうすればよいですか?データベースはNORECOVERYモードであるため、DBCCLOGは機能しません。トランザクションログ自体の記録があるので、最初と最後のLSNが何であるかがわかります。データベース自体が現在どこにあるのかわかりません。
この情報は、次のようなクエリで取得できます。
SELECT TOP 1 b.type, b.first_lsn, b.last_lsn, b.checkpoint_lsn, b.database_backup_lsn
FROM msdb..restorehistory a
INNER JOIN msdb..backupset b ON a.backup_set_id = b.backup_set_id
WHERE a.destination_database_name = 'AV_PROD'
ORDER BY restore_date DESC
プログラムでトランザクションログファイルから最初/最後のLSNを取得するかどうかはわかりませんが、リカバリをスクリプト化して、「早すぎる」(DBにすでに存在する)各トランザクションログを順番に適用しようとすることができます。 )はこのエラーで失敗します。残りはきれいに適用する必要があります。
しかし、誰かがより良いアイデアを持っていることを願っています-トランザクションログがたくさんある場合は、最初と最後のLSNが何であるかを判断するためにログ全体をスキャンする必要があるため、待つのは非常に苦痛だと想像できます。
RESTORE HEADERONLY
は、バックアップのFirstLSN
とLastLSN
、および最後の完全バックアップのLSNを含むDatabaseBackupLSN
を返します。これらから、必要な復元順序を再作成できます。データベースLSNを確認する必要はありません。必要な順序は、バックアップメディア自体から常に再作成できます(また、再作成する必要があります)。
Norecoveryにデータベースがあるという事実は、ある種のバックアップをすでに復元していることを意味します。そのバックアップにはヘッダーがあります。それを使用してください。