web-dev-qa-db-ja.com

SQL Serverはコピーのみのバックアップでトランザクションログを切り捨てます

「完全」復旧モードに設定されているデータベースがあります。データベースには、トランザクションログのバックアップが作成されたことは示されません。 _backup_finish_date_がログにnullを表示します。

データベースのバックアップを毎晩フル(コピーのみ)します。バックアップはトランザクションログを切り捨てているように見えます。トランザクションログは約40GBです。バックアップ前は、75%使用されています。バックアップを実行すると、1%しか使用されません。 DBCC SQLPERF(logspace)を使用します。

_sys.databases_は、_recovery_model_desc FULL_、_log_reuse_wait 0_、_log_reuse_wait_desc NOTHING_を示しています。

別のサーバーに同じデータベースのデータベースのコピーがありますが、トランザクションログが切り捨てられません。ちょうど成長しています。

コピーの_sys.database_は、FULL、_2_、_LOG_BACKUP_を示しています。これは私が期待することです。

私のデータベースのコピーは、物事が機能する方法であることを理解しています。しかし、ログがなぜ/どのように本番環境で切り捨てられるのか知りたいのですが。

ミラーリングなし、トランザクションログ配布なし。

7
Bob Larsen

既存の2つの回答のいずれかでコードを使用して、tログが取得されていないことを確認することをお勧めします。ユーザーのアクセス権によっては、誰かがあなたの知らないうちにバックアップを取っている可能性があります。

Pseudo-Simple SQL Server Recovery Model について話しているDenis Rubashkinによるコメントとリンクがありました。本質的に、完全なリカバリを行っており、完全なバックアップを行ったことがない場合(またはその他の方法でLSNチェーンを破壊した場合)、SQLは回復する方法がないことを認識しており、tログを保存しません。

しかし、あなたの説明を考えると:

バックアップはトランザクションログを切り捨てているように見えます。トランザクションログは約40GBです。バックアップ前は、75%使用されています。バックアップを実行すると、1%しか使用されません。

上記の2つの可能性のいずれかが問題の原因であるとは思いません。

プロセスのある時点で、バックアップジョブがデータベースをSIMPLEリカバリに設定していると思われます。これにより、tログがクリアされます。次に、データベースをFULLリカバリに戻します。このシナリオでは、表示されている症状が発生します。

バックアップコードを確認します。SIMPLEへの変更とFULLへの変更が発生している場合は、何かを変更する必要があります。データベースを常にSIMPLEリカバリ状態のままにするか、定期的なt-logバックアップを作成してください。どちらを選択するかは、回復の目的に応じて、ビジネス上の決定です。

T-logバックアップをとっていない場合、完全に回復する必要はありません。

編集質問の別の手がかりに気づきました。

データベースの夜間フル(コピーのみ)。

なぜFull (Copy Only)バックアップを取っているのですか?これを行う唯一の理由は、単一のバックアップを作成していて、回復のために差分バックアップに依存しているときにバックアップチェーンを保持したいということです。 Copy-Only Backups を参照してください

この手がかりは、気づいていないフルバックアップ、差分バックアップ、およびt-logバックアップが発生していることを示唆しています。copy onlyが差分を認識しており、バックアップチェーンを保持したかったため、夜間のバックアップジョブを書いた人が誰かを示唆しています。これが事実である場合、私はt-logが1日に数回取得されることを期待します。通常のシナリオはFullsが週に1回、Differentialsが他の6日間、そしてt-logが1日を通して定期的に行われます。

または、SIMPLEに変更を加えてFULLに戻した人がcopy onlyの理由や影響を知らなかったため、ランダムに追加しただけの可能性もあります。

11
James Jenkins

バックアップと復元の開始時間と終了時間を取得する方法 に対する私の回答には、SQL Serverインスタンス上のすべてのデータベースのバックアップ情報を取得するスクリプトが含まれています。

--------------------------------------------------------------------------------- 
--      Database Backups for all databases For Previous Week 
--------------------------------------------------------------------------------- 
SELECT  

/* Columns for retrieving information */

   -- CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS SRVNAME, 
   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 msdb.dbo.backupset.database_name = 'YOUR_DATABASE'
ORDER BY  
          2 desc, -- backup start
          1,      -- database name
          3 desc  -- backup end

YOUR_DATABASEをデータベースの名前に置き換えます。

このスクリプトをSQL Serverインスタンスに対して実行します。追加のWHERE条件を追加して、データベースやその他の情報の検索を制限できます。

msdb.dbo.backupmediafamily.physical_device_name列にcopy_onlyバックアップに使用しているデバイス以外の情報が含まれている場合、それは他のソリューションがバックアップを実行していることを示しています。

本番環境では、287899b2-d08e-40c3-a83d-677d898b6671(仮想テープドライブのバックアップソリューション識別子)に似たエンタープライズソリューションのエントリが表示されると思います。

一部のツールはmsdb.dbo.backupset.description列にコメントを配置し、何が起こっているかについてのヒントを提供する場合があります。

バックアップ履歴から何を取得できるかを確認します。

5

確かに実行中のログのバックアップがあります。完全復旧モードでは、ログがディスクに空きがなくなるポイントまで増加します。以下のスクリプトを使用して、データベースのログバックアップを見つけてください。

select a.database_name,a.backup_size,backup_start_date,backup_finish_date,b.physical_device_name,a.type from msdb..backupset a  
inner join msdb..backupmediafamily b on a.media_set_id = b.media_set_id
where a.database_name = 'YourDatabaseName' and a.type = 'L'
order by backup_start_date desc
3