DO’s&DONT’s #16: やってはいけないこと - ログ配布プライマリデータベースのログバックアップ

神谷 雅紀
Escalation Engineer

ログ配布 (Log Shipping) のプライマリデータベースに対して、ログ配布バックアップジョブ以外のトランザクションログバックアップは行ってはいけません。

なぜ?

COPY_ONLY オプション (もしくは NO_TRUNCATE オプション) を指定しないトランザクションログバックアップは、トランザクションログをバックアップすると同時に、バックアップしたトランザクションログレコードを切り捨てます。ログ配布のバックアップジョブ以外がトランザクションログバックアップを行った時にトランザクションログが切り捨てられてしまうことで、ログ配布によりバックアップされるトランザクションログの連続性が失われます。その結果、セカンダリサーバーでは、ログ配布により配信されたトランザクションログバックアップをリストアすることができなくなります。

例えば、以下の例では、ログ配布以外によりバックアップ A が作成されています。ログ配布コピージョブによりバックアップ A がセカンダリーサーバーにコピーされない場合、セカンダリーサーバーでは、バックアップ 3 の前にリストアすべきバックアップ A があるため、ログ配布リストアジョブは、バックアップ A がコピーされてくるのを待ちます。バックアップ 3 はリストアされません。

 

logshipping

上の状況が発生し、長期間同期していない場合に警告を発するように設定している場合、エラーログやイベントログには以下の警告が記録されるようになります。

 

エラー: 14421、重大度: 16、状態: 1。
The log shipping secondary database SERVER\INSTANCE.DATANASE has restore threshold of XXX minutes and is out of sync. No restore was performed for XXX minutes. Restored latency is XXX minutes. Check agent log and logshipping monitor information.
ログ配布のセカンダリ データベース SERVER\INSTANCE.DATANASE は復元のしきい値が XXX 分間ですが、同期されていません。復元は XXX 分間実行されていません。復元される待機時間は XXX 分間です。エージェント ログおよびログ配布モニターの情報を調べてください。

 

ログ配布モニタの履歴には、コピー済みのトランザクションログをスキップした旨が記録されるようになります。上の例では、バックアップ A がセカンダリサーバーでリストアされるまでは、バックアップ 3 はスキップされ、リストアされません。

 

ログ バックアップ ファイルがスキップされました。セカンダリ DB: 'DATABASE'、ファイル: 'DBName-YYYYMMDDSS.trn'

 

バックアップの連続性の確認方法

バックアップが作成されると、エラーログおよびイベントログには、記録が残ります。以下は、エラーログに記録されるバックアップに関するメッセージのサンプルです。

バックアップの連続性を確認する場合、LSN を確認します。first LSN は、直前のバックアップの last LSN と同じ値になります。last LSN は、直後のバックアップの first LSN と同じ値になります。

 

2012-12-17 15:48:08.12 バックアップ Log was backed up. Database: AdventureWorks, creation date(time): 2011/10/28(14:39:10), first LSN: 43:3510:1, last LSN: 43:3601:1, number of dump devices: 1, device information: (FILE=1, TYPE=DISK: {'C:\Program Files\Microsoft SQL Server\MSSQL10_50.KJ1\MSSQL\Backup\AdventureWorks_normal_log1.bak'}). This is an informational message only. No user action is required. 2012-12-17 15:48:08.30 バックアップ Log was backed up. Database: AdventureWorks, creation date(time): 2011/10/28(14:39:10), first LSN: 43:3601:1, last LSN: 43:3606:1, number of dump devices: 1, device information: (FILE=1, TYPE=DISK: {'C:\Program Files\Microsoft SQL Server\MSSQL10_50.KJ1\MSSQL\Backup\AdventureWorks_normal_log2.bak'}). This is an informational message only. No user action is required. 2012-12-17 15:48:08.53 バックアップ Log was backed up. Database: AdventureWorks, creation date(time): 2011/10/28(14:39:10), first LSN: 43:3606:1, last LSN: 43:3607:1, number of dump devices: 1, device information: (FILE=1, TYPE=DISK: {'C:\Program Files\Microsoft SQL Server\MSSQL10_50.KJ1\MSSQL\Backup\AdventureWorks_normal_log3.bak'}). This is an informational message only. No user action is required.

 

エラーログに記録されているメッセージの各項目の意味は以下の通りです。

 

yyyy-mm-dd hh:mm:ss.mm バックアップ完了時の日時。
Log was backed up. ログがバックアップされたことを示します。データベースの場合は “Database was backed up.” となります。
Database バックアップ対象データベース名。
creation date(time) バックアップ対象データベースが作成された日時。
first LSN このバックアップに含まれる最初の LSN。
last LSN このバックアップに含まれる最後の LSN。
number of dump devices バックアップデバイス (ファイルやテープ) の数。バックアップは複数のバックアップデバイスに分散格納することが可能。
device information バックアップデバイス内のバックアップ格納位置、デバイスタイプ (DISK, TAPE)、デバイス名 (ファイル名)。例えば、ひとつのファイルに複数のバックアップを格納していて、先頭から 3 番目の位置にバックアップされた場合は、FILE = 3 となる。

 

※ LSN (Log Sequence Number) : トランザクションログレコードに付与される番号

 

first/last LSN は、バックアップヘッダーにも格納されているため、RESTORE HEADERONLY ステートメントによりバックアップヘッダーを確認することでも、バックアップの連続性を確認することができます。

 

lsn