データベースログを復元しようとしていますが、次のメッセージが表示されます。
メッセージ4305、レベル16、状態1、行3
このバックアップセットのログはLSN 76120000013549400001から始まりますが、これはデータベースに適用するには最新ではありません。 LSN 75428000036693300001を含む以前のログバックアップを復元できます。
メッセージ3013、レベル16、状態1、行3
RESTORE LOGが異常終了しています。
LSNとは何ですか?
どのバックアップに正しいLSNが含まれているかをどのように判断できますか?
このクエリは、インスタンスでホストされているすべてのデータベースに対して適切な復元チェーンを生成します。これにより、適切なステートメントが適切な順序で提供されます。ステートメントをRestoreStatementフィールドからコピーして、新しいクエリウィンドウに貼り付けるだけです。
WITH BackupHist
AS
(
SELECT
s.server_name
, d.name AS database_name
, m.physical_device_name
, CASE m.device_type
WHEN 2 THEN 'Disk'
WHEN 102 THEN 'Backup Device (Disk)'
WHEN 5 THEN 'Tape'
WHEN 105 THEN 'Backup Device (Tape)'
WHEN 7 THEN 'Virtual Device'
END AS device_type
, CAST (s.backup_size / 1048576.0 AS FLOAT) AS backup_size_mb
, CAST (s.compressed_backup_size / 1048576.0 AS FLOAT) AS compressed_backup_size_mb
, s.backup_start_date
, s.first_lsn
, s.backup_finish_date
, s.database_backup_lsn
, CASE s.[type]
WHEN 'D' THEN 'Database (Full)'
WHEN 'I' THEN 'Database (Differential)'
WHEN 'L' THEN 'Transaction Log'
WHEN 'F' THEN 'File or Filegroup (Full)'
WHEN 'G' THEN 'File or Filegroup (DIfferential)'
WHEN 'P' THEN 'Partial (Full)'
WHEN 'Q' THEN 'Partial (Differential)'
END AS backup_type
, s.recovery_model
, ROW_NUMBER () OVER (PARTITION BY s.database_name, s.database_backup_lsn ORDER BY s.backup_start_date) AS Row
FROM msdb.dbo.backupset s INNER JOIN msdb.dbo.backupmediafamily m
ON s.media_set_id = m.media_set_id
RIGHT OUTER JOIN sys.databases d
ON s.database_name = d.name
AND s.recovery_model = d.recovery_model_desc
COLLATE SQL_Latin1_General_CP1_CI_AS
), BackupHistFullIterations AS
(
SELECT database_name
, backup_finish_date
, first_lsn
, ROW_NUMBER() OVER (PARTITION BY database_name ORDER BY backup_finish_date DESC) AS BackupIteration
FROM BackupHist
WHERE backup_type = 'Database (Full)'
)
SELECT bh.server_name
, bh.database_name
, bh.backup_finish_date
, bh.backup_type
, CASE backup_type WHEN 'Database (Full)' THEN 'RESTORE DATABASE [' + bh.database_name + '] FROM DISK = N''' + bh.physical_device_name + ''' WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 5'
WHEN 'Transaction Log' THEN 'RESTORE LOG [' + bh.database_name + '] FROM DISK = N''' + bh.physical_device_name + ''' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10'
ELSE ''
END AS RestoreStatement
FROM BackupHist bh INNER JOIN
(
SELECT *
FROM BackupHistFullIterations
WHERE BackupIteration = 1 -- Show the X most recent iteration(s)
) bhfi
ON bh.database_name = bhfi.database_name
AND (bh.database_backup_lsn >= bhfi.first_lsn
OR bh.first_lsn = bhfi.first_lsn)
AND (bh.backup_finish_date >= bhfi.backup_finish_date) -- used in case db was rebuilt/lsn reset
ORDER BY 1, 2, 3
一部の一般的な免責事項、このスクリプトには、MOVE
句やその他のカスタマイズ(ストライプバックアップセットからの復元など)は含まれていません。これはTLogの復元では問題になりませんが、ニーズに合わせて完全(および場合によっては差分)バックアップ復元ステートメントを調整する必要がある場合があります。新しいサーバーをAGレプリカとして設定する場合、サーバー間のファイルパスを一致させて作業を容易にする必要があるため、これをよく使用します。
エラーは非常に明確で、必要なログバックアップが作成されたときに復元されていません。 full/diffが作成された後、正しい順序でそれぞれを復元する必要があります。
LSN =ログシーケンス番号。
実際のLSNと混同するのではなく、trnの作成日を見て、復元の順序と順序に従ってください。
バックアップは次の順序で復元する必要があります
これらのいずれかを見逃した場合(別名、完全復元)、該当する差分なしでトランザクションログを復元しようとすると、LSNが一致せず、ロードを拒否します。
エラーを読んでいると、そのバックアップに対して最新でないインストールにバックアップをロードしようとしているように見えます(別名、完全/差分/トランザクションログのリストのいずれかのリストアが欠落しています)。
バックアップの作成方法は、以前のバックアップを処理する必要があることを意味します(差分は、最後のフル以降のすべての差分です)トランザクションログ(およびテールログ)は、データがない場合のトランザクションのログとまったく同じです存在し、そのトランザクションが適用されたときの状態であった場合、それは失敗するため、SQLはそれを許可しません。
LSNとは何ですか?
どのバックアップに正しいLSNが含まれているかをどのように判断できますか?
LSN、ログシーケンス番号は、トランザクションログ内のログレコードを一意に識別するものです。詳細については、こちらをご覧ください ログシーケンス番号の概要
すべてのバックアップにはログレコードが含まれます(はい、ログバックアップだけでなく、完全バックアップと差分バックアップも復元されます。これは、完全バックアップまたは差分バックアップから復元されたデータベースが一貫している必要があるためです。詳細については、こちらをご覧ください。 Paul SによるSQL Serverバックアップの理解。ランダム )
したがって、すべてのバックアップには、それ自体に関する情報( RESTORE HEADERONLY を使用して表示できます)と、msdb..backupset
などのバックアップに関連するmsdbテーブルがあり、最初のLSNを保護する情報を見つけることができます。最後のLSN、つまり、このバックアップに含まれるログレコードの最小LSNおよび最大LSN.
すべてのバックアップを他のバックアップに関連付けることができるため、この情報は非常に役立ちます。 コピーのみのバックアップ が存在する可能性があるため、ログバックアップチェーンと対応する完全バックアップまたは差分バックアップはbackup_finish_dateに基づいて決定されませんが、すべてLSNに基づいて決定されます。
バックアップごとに異なるLSNが記録されます。最も単純なのはログバックアップLSNです。連続するすべてのログバックアップには、最初のLSNが最後のLSN前のものの。たとえば、エラーを受け取った場合、このバックアップはFist LSNが76120000013549400001であることを示し、バックアップチェーンを復元するには、以前のチェーンを復元する必要があります(最後のLSN = 76120000013549400001)。
このエラーは、LSN = 75428000036693300001を含むログバックアップを見つける必要があることを示しています。これは、最後に復元したバックアップにLast LSN = 75428000036693300001があったためです。このすべての情報サーバーは、最初のLSNから、最後に復元されたバックアップヘッダーを取得します。最後のLSN。
どうやって見つけることができますか?最も簡単な方法はmsdb..backupset
を使用することですが、バックアップファイルのみが与えられており、元のサーバーにアクセスできない場合は、バックアップファイルからすべての情報を1つのテーブルに収集できます(テーブルを作成し、そこに挿入します) exec( 'restore headeronly from disk = ...'))
Msdbからこの情報を取得するためのコードを提供します。
select top 1 b1.[type],
b1.first_lsn,
b1.last_lsn,
b3.physical_device_name
from msdb..backupset as b1
join msdb..backupmediaset as b2
on b1.media_set_id = b2.media_set_id
join msdb..backupmediafamily as b3
on b2.media_set_id = b3.media_set_id
where database_name = 'your_db' and (last_lsn) < 76120000013549400001
order by last_lsn desc;
このコードは以前のバックアップを提供しますが、以前の以前のものを取得したい場合は、トップ2、eccを使用します。
すべてのバックアップレコード、たとえば、すべての差分バックアップが、どのフルバックアップにその差分ベース、対応するフルバックアップのCheckpointLSNへの差分ポイントのフィールドDatabaseBackupLSNが含まれるかを「認識」する他の有用なLSNがあります。しかし、これは別の話です。私は短く書こうとしましたが、この議論は幅広いので、私があなたの質問に答えることを願っています。