SQL Server误区30日谈-Day20-破坏日志备份链之后,需要一个完整备份来重新开始日志链

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
日志服务 SLS,月写入数据量 50GB 1个月
简介:
 本系列文章是我在sqlskill.com的PAUL的博客看到的,很多误区都比较具有典型性和代表性,原文来自T-SQL Tuesday #11: Misconceptions about.... EVERYTHING!!,经过我们团队的翻译和整理发布在AgileSharp上。希望对大家有所帮助。

 

误区 #20:在破坏日志备份链之后,需要一个完整备份来重新开始日志链

错误

 

    事务日志备份会备份自上次事务日志备份以来所有的事务日志(如果从来没有过日志备份的话,那就从上一次完整备份开始)。有好几种类型的操作会中断事务日志的连续性,也就是说除非重新开始新的日志链,SQL Server无法再进行日志备份。下面这几种操作都有可能引起日志链断裂:

    由完整恢复模式或大容量事务日志恢复模式转为简单恢复模式
    从数据库镜像进行恢复
    备份日志时指定了NO_LOG 或 WITH TRUNCATE_ONLY(还好在SQL Server 2008中这个选项被取消了)
 

   更多请看:post BACKUP LOG WITH NO_LOG - use, abuse, and undocumented trace flags to stop it

 

    通过下面的例子对此进行阐述:

CREATE DATABASE LogChainTest; 
GO 
ALTER DATABASE LogChainTest SET RECOVERY FULL; 
GO 
BACKUP DATABASE LogChainTest TO DISK = 'C:\SQLskills\LogChainTest.bck' WITH INIT; 
GO 
BACKUP LOG LogChainTest TO DISK = 'C:\SQLskills\LogChainTest_log1.bck' WITH INIT; 
GO 
ALTER DATABASE LogChainTest SET RECOVERY SIMPLE; 
GO 
ALTER DATABASE LogChainTest SET RECOVERY FULL; 
GO

 

    结果是:

已为数据库 'LogChainTest',文件 'LogChainTest' (位于文件 1 上)处理了 168 页。 
已为数据库 'LogChainTest',文件 'LogChainTest_log' (位于文件 1 上)处理了 2 页。 
BACKUP DATABASE 成功处理了 170 页,花费 0.224 秒(5.916 MB/秒)。 
已为数据库 'LogChainTest',文件 'LogChainTest_log' (位于文件 1 上)处理了 3 页。 
BACKUP LOG 成功处理了 3 页,花费 0.121 秒(0.137 MB/秒)。 

 

    我首先创建了一个数据库,将其设置为完整恢复模式,这个是日志链的起点,然后转为简单恢复模式,再转为完整恢复模式。

    下面我再尝试进行日志备份

BACKUP LOG LogChainTest TO DISK = 'C:\SQLskills\LogChainTest_log2.bck' WITH INIT; 
GO

 

    则会得到如下报错信息:

消息 4214,级别 16,状态 1,第 1 行 
无法执行 BACKUP LOG,因为当前没有数据库备份。 
消息 3013,级别 16,状态 1,第 1 行 
BACKUP LOG 正在异常终止。 

    SQL Server已经记录了我破坏日志链的操作以及与进行日志 备份无法备份自上次日志备份以来所有的日志,所以SQL Server不允许我进行日志备份。

    这个误区是说此时就需要完整备份才能恢复日志链,但实际上,我只需要做一个差异备份(这个差异备份的跨度超过日志链断裂的间隙),代码如下:

BACKUP DATABASE LogChainTest TO DISK = 'd:\Test_bak\LogChainTest_log1.bck' WITH INIT, DIFFERENTIAL; 
GO 
BACKUP LOG LogChainTest TO DISK = 'd:\Test_bak\LogChainTest_log1.bck' WITH INIT; 
GO

 

    得到的结果:

已为数据库 'LogChainTest',文件 'LogChainTest' (位于文件 1 上)处理了 64 页。 
已为数据库 'LogChainTest',文件 'LogChainTest_log' (位于文件 1 上)处理了 1 页。 
BACKUP DATABASE WITH DIFFERENTIAL 成功处理了 65 页,花费 0.119 秒(4.267 MB/秒)。 
已为数据库 'LogChainTest',文件 'LogChainTest_log' (位于文件 1 上)处理了 1 页。 
BACKUP LOG 成功处理了 1 页,花费 0.052 秒(0.150 MB/秒)。 

    不得不说这种方式更Cool一些,因为你不再需要一个完整备份才能继续进行日志备份。

    如果你的备份策略中包含了文件或是文件组的备份,你甚至只需要单个文件的差异备份就能继续进行日志备份。但前提是这个备份的跨度超过了断裂LSN的程度,当然这是更深的话题了。

    又揭穿了一个误区!

分类: SQL Server DBA误区

本文转自CareySon博客园博客,原文链接http://www.cnblogs.com/CareySon/archive/2013/01/16/2862280.html,如需转载请自行联系原作者




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6天前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
2月前
|
SQL 数据库
Microsoft SQL Server 2014如何来备份数据库
Microsoft SQL Server 2014如何来备份数据库
110 3
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
59 0
|
2月前
|
SQL 存储 数据库
SQL Server 中的备份类型详解
【8月更文挑战第31天】
46 0
|
2月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
38 0
|
2月前
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
48 0
|
2月前
|
SQL JavaScript 前端开发
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
|
5月前
|
SQL 存储 数据库
数据安全无忧,SQL Server 2014数据库定时备份解密
数据安全无忧,SQL Server 2014数据库定时备份解密
|
SQL 数据库
sql定时备份
    老规矩,直接上代码: declare @name varchar(250) set @name='C:\Backup\MyStudy_'+ convert(varchar(50),getdate(),112)+'.bak' BACKUP DATABASE[MyStudy]TO DISK=@name WITH NOFORMAT, NOINIT, NAME = N'MyStudy-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD     上面sql写到一个定时作业里即可定时备份,文件名称是库名+杠+时间(年月日)。
862 0
下一篇
无影云桌面