web-dev-qa-db-ja.com

トランザクションログの復元時のエラー

データベースログを復元しようとしていますが、次のメッセージが表示されます。

メッセージ4305、レベル16、状態1、行3
このバックアップセットのログはLSN 76120000013549400001から始まりますが、これはデータベースに適用するには最新ではありません。 LSN 75428000036693300001を含む以前のログバックアップを復元できます。
メッセージ3013、レベル16、状態1、行3
RESTORE LOGが異常終了しています。

LSNとは何ですか?

どのバックアップに正しいLSNが含まれているかをどのように判断できますか?

5
Christian

このクエリは、インスタンスでホストされているすべてのデータベースに対して適切な復元チェーンを生成します。これにより、適切なステートメントが適切な順序で提供されます。ステートメントを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レプリカとして設定する場合、サーバー間のファイルパスを一致させて作業を容易にする必要があるため、これをよく使用します。

3
John Eisbrener

エラーは非常に明確で、必要なログバックアップが作成されたときに復元されていません。 full/diffが作成された後、正しい順序でそれぞれを復元する必要があります。

LSN =ログシーケンス番号。

実際のLSNと混同するのではなく、trnの作成日を見て、復元の順序と順序に従ってください。

2
Henrico Bekker

バックアップは次の順序で復元する必要があります

  1. いっぱい
  2. 完全以降の最後の差分
  3. 差分以降のすべてのトランザクションログバックアップ(ない場合は完全)
  4. テールログのバックアップ

これらのいずれかを見逃した場合(別名、完全復元)、該当する差分なしでトランザクションログを復元しようとすると、LSNが一致せず、ロードを拒否します。

エラーを読んでいると、そのバックアップに対して最新でないインストールにバックアップをロードしようとしているように見えます(別名、完全/差分/トランザクションログのリストのいずれかのリストアが欠落しています)。

バックアップの作成方法は、以前のバックアップを処理する必要があることを意味します(差分は、最後のフル以降のすべての差分です)トランザクションログ(およびテールログ)は、データがない場合のトランザクションのログとまったく同じです存在し、そのトランザクションが適用されたときの状態であった場合、それは失敗するため、SQLはそれを許可しません。

2
Ste Bov

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があります。しかし、これは別の話です。私は短く書こうとしましたが、この議論は幅広いので、私があなたの質問に答えることを願っています。

0
sepupic