SQL Server 使用仅复制备份截断事务日志

Bob*_*sen 7 sql-server transaction-log

我有一个设置为“完整”恢复模式的数据库。数据库没有显示曾经备份过事务日志。 backup_finish_date我的日志显示为空。

我每晚都备份完整的数据库(仅复制)。备份似乎会截断事务日志。事务日志大约40GB。在备份之前,它已满 75%。备份运行时,只有 1% 已满。使用DBCC SQLPERF(logspace).

sys.databases显示:recovery_model_desc FULLlog_reuse_wait 0log_reuse_wait_desc NOTHING

我在另一台服务器上有一个该数据库的副本,设置相同,但事务日志没有被截断。只是成长。

sys.database副本上的表演FULL2LOG_BACKUP。这是我所期望的。

我知道我的数据库副本是事情应该工作的方式。但想知道为什么/如何在我的生产环境中截断日志。

无镜像,无事务日志传送。

Jam*_*ins 11

我建议您使用两个现有答案之一中的代码来验证是否未采用 t-log。根据您用户的访问权限,有人可能会在您不知情的情况下进行备份。

丹尼斯·鲁巴什金 (Denis Rubashkin) 发表了一条评论和链接,谈论伪简单 SQL Server 恢复模型本质上,它说如果您处于完全恢复状态并且从未进行过完全备份(或以其他方式破坏 LSN 链),SQL 知道没有办法恢复,它不保存 t 日志。

但是根据你的描述:

备份似乎截断了事务日志。事务日志大约40GB。在备份之前,它已满 75%。当备份运行时,它只有 1% 已满。

我认为上述两种可能性中的任何一种都不是您问题的原因。

我怀疑您的备份作业SIMPLE在此过程中的某个时刻将数据库设置为恢复,这将清除 t 日志。然后它将数据库设置回FULL恢复状态。这种情况会产生您所看到的症状。

查看备份代码,如果您发现正在发生更改SIMPLE和返回FULL,您将想要更改某些内容。要么让数据库一直处于SIMPLE恢复状态,要么定期进行 t-log 备份。您做出的选择是一项业务决策,取决于您的恢复目标。

如果您不进行 t-log 备份,则没有充分的理由进行完全恢复。

编辑我刚刚注意到你的问题中的另一个线索。

每晚数据库已满(仅复制)。

你为什么要Full (Copy Only)备份?这样做的唯一原因是当您依靠差异备份进行恢复时,您正在执行单个备份并希望保留备份链。请参阅仅复制备份

这条线索表明存在您不知道的完整、差异和 t-log 备份,这表明编写您的夜间备份作业的copy only人知道差异并希望保留备份链。如果是这种情况,我希望每天记录数次 t-log,正常情况是每周一次 Fulls,每周其他 6 天的差异,以及全天定期记录 t-log。

或者这可能意味着更改SIMPLE和返回更改的人FULL只是随机添加它,因为他们不知道其中copy only任何一个的原因或影响。


Joh*_* N. 5

我对如何获取备份和恢复开始和结束时间的回答包含一个脚本,该脚本将检索 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
Run Code Online (Sandbox Code Playgroud)

替换YOUR_DATABASE为您的数据库名称。

针对您的 SQL Server 实例运行此脚本。您可以添加附加WHERE条件来限制搜索您的数据库和其他信息。

现在,如果该msdb.dbo.backupmediafamily.physical_device_name列包含除您用于copy_only备份的设备之外的其他信息,则表明其他解决方案正在执行备份。

在生产环境中,我希望看到类似于287899b2-d08e-40c3-a83d-677d898b6671(这是虚拟磁带驱动器的备份解决方案标识符)的企业解决方案条目。

一些工具会在msdb.dbo.backupset.description列中放置注释,这可能会提示正在发生的事情。

查看您可以从备份历史记录中检索的内容。