SQL Server 日志传输还原作业执行缓慢
情景
| IP | 角色 |
|---|---|
| 192.168.1.61 | Primary |
| 192.168.1.59 | Secondary |
为 db1~db6 共 6 个数据库搭建日志传输。日志传输中的每个从库都都设置成 STANDBY 模式,搭建成功后查看 Primary 和 Secondary 实例上的 事务日志传送状态 报表发现,db1~db5 的备份、复制、还原作业工作良好,而 db6 的备份、复制作业正常,但还原作业执行时间过长,延迟长达10多个小时,并且在不断增加。
在定位是何问题前,务必确保已经排除以下因素:
- 当前日志备份大小远超平常值
- Secondary 服务器上的磁盘未达到其瓶颈
- 复制作业工作正常且无延迟,从作业历史记录中可明显看出是还原作业消耗大量的时间
- 还原作业在执行期间未失败、未报错(e.g. Out of Memory etc.)
故障定位
首先,启用以下 trace flags 收集信息,以了解还原工作期间的更多信息,,可参考 How It Works: What is Restore/Backup Doing?
DBCC TRACEON (3004, 3605, -1)
- 3004 - 提供关于 backup 和 restore 作业的更多信息
- 3005 - 将 trace 收集到的信息输出到 error log 中
在日志传输中的 Secondary 上启用 trace flags 之后收集到的日志信息
2018-12-07 11:13:53.57 spid56 RestoreDatabase: Database zktime606`
2018-12-07 11:13:53.58 spid56 Opening backup set
2018-12-07 11:13:53.58 spid56 SetTargetRestoreAge: 0
2018-12-07 11:13:53.59 spid56 Restore: Configuration section loaded
2018-12-07 11:13:53.59 spid56 Restore: Backup set is open
2018-12-07 11:13:53.59 spid56 Restore: Planning begins
2018-12-07 11:13:53.61 spid56 Restore: Planning complete
2018-12-07 11:13:53.61 spid56 Restore: BeginRestore (offline) on zktime606
2018-12-07 11:13:53.62 spid56 Restore: Attached database zktime606 as DBID=17
2018-12-07 11:13:53.62 spid56 Restore: PreparingContainers
2018-12-07 11:13:53.70 spid56 Zeroing F:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\zktime606_0.ldf from page 1 to 96 (0x2000 to 0xc0000)
2018-12-07 11:13:53.70 spid56 Restore: Containers are ready
2018-12-07 11:13:53.70 spid56 Zeroing completed on F:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\zktime606_0.ldf
2018-12-07 11:13:53.75 spid56 Restore: Restoring backup set
2018-12-07 11:13:53.75 spid56 Restore: Transferring data to zktime606
2018-12-07 11:13:56.05 spid56 Restore: Waiting for log zero on zktime606
2018-12-07 11:13:56.08 spid56 Restore: LogZero complete
2018-12-07 11:13:56.08 spid56 SetTargetRestoreAge: 0
2018-12-07 11:13:56.56 spid56 FileHandleCache: 0 files opened. CacheSize: 12
2018-12-07 11:13:56.56 spid56 Restore: Data transfer complete on zktime606
2018-12-07 11:13:56.61 spid56 Restore: Backup set restored
2018-12-07 11:13:56.64 spid56 Starting up database 'zktime606'.
2018-12-07 11:13:56.70 spid56 The database 'zktime606' is marked RESTORING and is in a state that does not allow recovery to be run.
2018-12-07 11:13:56.75 spid56 Restore-Redo begins on database zktime606
2018-12-07 11:13:56.77 spid56 RunOfflineRedo logIter.Init(): FirstLsn(PruId: 0): 0x2e9e:0xa0:0x26
2018-12-07 11:13:56.77 spid56 RunOfflineRedo logIter.Init(): LastLsn(PruId: 0): 0x2e9e:0xc0:0x1
2018-12-07 11:13:56.77 spid56 OfflineRollforward: StopLsn/LastLsn(PruId: 0): 0x2e9e:0xc0:0x1
2018-12-07 11:13:56.79 spid56 Rollforward complete on database zktime606
2018-12-07 11:13:56.90 spid56 Restore: Done with fixups
2018-12-07 11:13:56.99 spid56 Restore: Writing history records
2018-12-07 11:13:56.99 备份 Database was restored: Database: zktime606, creation date(time): 2018/12/05(15:41:54), first LSN: 11934:160:38, last LSN: 11934:192:1, number of dump devices: 1, device information: (FILE=1, TYPE=DISK: {'F:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\FB_zktime.bak'}). Informational message. No user action required.
2018-12-07 11:13:56.99 spid56 Writing backup history records
2018-12-07 11:13:57.02 spid56 Restore: Done with MSDB maintenance
2018-12-07 11:13:57.02 spid56 RestoreDatabase: Finished
从上面的错误日志输出中可得
- 还原过程花费了
2018-12-07 11:13:57.02 - 2018-12-07 11:13:53.57 = 4s - 根据每行日志记录中第一列的时间戳查出该过程中哪个阶段花费时间最长
VLF 对 Restore 的影响
数据库事务日志中虚拟日志文件过多会导致日事务日志还原缓慢,请参考数据库日志文件结构对数据库还原时间的影响,为确定是否是该因素导致的,使用以下命令
dbcc loginfo (dbname) with no_infomsgs
以下信息是为上述命令的输出
1 上述命令输出的行数就是该数据库事务日志文件包含的虚拟日志文件数目

2 在备份日志中需要被还原的 VLFs 的数量由以下公式计算。
first LSN: 11934:160:38, last LSN: 11934:192:1,
last LSN 的第一部分减去 first LSN 的第一部分 = 11934 - 11934
3 基于 FileSize 列计算 VLF 文件的大小
9175040 – 8.75 MB
9437184 – 9 MB
10092544 – 9.62 MB
问题
基于上述输出的信息,有两种可能性
VLF's文件过多从而影响辅助数据库还原性能- 如果模式是
STANDBY,且每个VLF文件都很大,则这是一个值得关注的问题,。
如果存在跨越多个备份的批处理作业或长时间运行的事务(例如,重建索引),则第二个问题更加严重。在这种情况下,重复回滚长期运行的事务,将回滚工作写入 standby 文件(.tuf文件),然后通过下一次日志还原取消所有回滚工作,只为了重新启动进程,将很容易地导致日志传送中的辅助数据库落后。
解决方案
方案1
你得减少VLF的数量。可以通过运行DBCC SHRINKFILE来将LDF减少到较小的大小,从而减少VLFS的数量。
注意:你需要在主数据库上执行该操作。
完成收缩后,通过再次运行DBCC LOGINFO验证 VLF已经减少。一个很好的范围应该在 500-1000 之间。使用单个增长操作将日志文件调整到所需大小。可通过调整初始大小设置来做到这一点,还可以注意LDF文件的自动增长设置。设置太小的增长值可能会导致太多的VLFs。
ALTER DATABASE DBNAME MODIFY FILE (NAME='ldf_logical_name', SIZE=<target>MB)
记得在应用保存了收缩数据库日志操作的日志备份之前,辅助数据库仍然必须先应用在此之前的日志备份。一旦辅助数据库应用完保存了收缩日志操作的日志备份,就可以测量辅助数据库恢复事务日志的时间,以观察是否产生了积极的影响。
方案 2
对于问题 2 的解决方案 2 ,当VLF文件的大小对在STANDBY 模式下的还原造成较大影响时,你将不得不截断事务日志。这意味着日志传输必须中断。可以通过将恢复模型设置为SIMPLE(使用 ALTER DATABASE 命令)来截断主数据库上的TLOG。如果在 SQL 2005或更低版本上,可以使用带有TRUNCATE_ONLY选项的backup log dbName。然后将日志文件自动增长设置为适当的值。 注意你在这里设置的值不要太高,否则事务必须在文件增长时等待或者太低以至于它创建了太多的VLF。 立即进行完整数据库备份,并使用此备份重新设置日志传送。
提示:可以使用
DBCC SQLPERF(LOGSPACE)命令查找日志文件实际使用的百分比。
参考资料
Case Study: Troubleshooting a Slow Log Shipping Restore job
How a log file structure can affect database recovery time
How It Works: What is Restore/Backup Doing?
How a log file structure can affect database recovery time
SQL Server 日志传输还原作业执行缓慢的更多相关文章
- SQL Server日志恢复还原数据
通过日志还原,首先要注意的是: 1,在数据库更新和删除之前有一个完整的备份. 2,在更新和删除之后,做一个日志备份. 3,该日志只能用于还原数据库备份和日志备份时间之间的数据. 下面看整个数据库备份和 ...
- sql 事务日志传输
原文:sql 事务日志传输 概述 可以使用日志传送将事务日志不间断地从一个数据库(主数据库)发送到另一个数据库(辅助数据库).不间断地备份主数据库中的事务日志,然后将它们复制并还原到辅助数据库,这将使 ...
- sql server 用脚本管理作业
转自:https://blog.csdn.net/yunye114105/article/details/6594826 摘要: 在SQL SERVER中用脚本管理作业,在绝大部分场景下,脚本都比UI ...
- sql server日志传送实践(基于server 2008 R2)
SQL Server 2008 R2 主从数据库同步 相关参考:http://blog.itpub.net/30126024/viewspace-2639526/ sql server日志传送(基于s ...
- SQL Server 备份和还原
SQL Server 备份和还原 SQL Server 备份 恢复模式 SQL Server 数据恢复模式分为三种:完整恢复模式.大容量日志恢复模式.简单恢复模式. 完整恢复模式 默认的恢复模式, ...
- SQL Server 备份和还原全攻略
原文:SQL Server 备份和还原全攻略 一.知识点 完全备份: 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件.(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份, ...
- SQL Server 日志传送[转载]
http://jimshu.blog.51cto.com/3171847/590413 SQL Server 2012 日志传送 一.准备: 数据库为完全恢复模式,并事先做一次完全备份. 共享一个文件 ...
- SQL Server 日志和代理的错误日志
本文介绍的日志不是事务日志,而是SQL Server 日志和代理的错误日志,按照主体把错误日志分为SQL Server.SQL Server Agent.Database Mail,以及 Window ...
- SQL Server in Docker - 还原数据库
SQL Server in Docker 还原数据库 上一会演示了如果在Docker环境下安装SQL Server,这次我们来演示下如何还原一个数据库备份文件到数据库实例上. 使用winscp上传ba ...
- SQL Server日志文件庞大收缩方法(实测好用)
原文:SQL Server日志文件庞大收缩方法(实测好用) 这两个命令连续执行,间隔时间越少越明显(可多次运行),直到达到效果 --截断 BACKUP LOG CloudMonitor TO DISK ...
随机推荐
- 修改Win+E映射
!!!!!!此过程需要修改注册表,请谨慎操作 作用 修改后可以实现Win+E快捷打开任意程序 从原始资源管理器到其它应用 注册表路径: HKEY_CLASSES_ROOT\Folder\shell\o ...
- pandas这dataframe结构
认识DataFrame结构 DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以 ...
- Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?
系列文章 Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用,相比 Terraform OSS, 用 ...
- Linux(三)磁盘管理
Linux磁盘管理 Linux中的tree工具 tree可以查看目录的树形结构,前提是需要自行安装 yum install tree -y [root@hadoop100 ~]# tree ./ ./ ...
- Linux(二)文件权限和压缩
1 搜索查找类 1.1 查找定位文件 find <搜索范围.路径> <选项> find将从指定目录下递归地遍历其各个子目录,将满足条件的文件显示在终端. 选项说明 -name: ...
- Python中的print()语句
Python中print()语句的相关使用 介绍 print()函数可以将输出的信息打印出来,即发送给标准输出流.Python中可以直接使用print()函数,将信息展示在控制台 基本使用方法 输出数 ...
- git与github(结合clion操作)
对自己学习git的一个记录,由于刚开始接触git,所以没有对于git做深入解释和说明,仅供参考,如有理解不对的地方或者需要改进的地方敬请指出. 用到的git命令: git init //初始化 g ...
- 2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配一个从 1 到 n 且互不相同的值 另给你一个长度为 m 的数组 queries 你必须在树上执行
2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配一个从 1 到 n 且互不相同的值 另给你一个长度为 m 的数组 queries 你必须在树上执行 ...
- 【python爬虫】bilibili每周必看页面视频图片爬取
此博客仅作为交流学习 对于使用bilibili上学习和娱乐的小伙伴们有时会看到视频博主发布的视频封面好看想要得到,但是苦于没有方法,这次我用python来爬取bilibili每周必看页面视频图片. 首 ...
- [Flink] Flink Job运行状态正常,但日志中偶报“FlinkException: The file LOG does not exist on the TaskExecutor.”
0 序言 Flink : 1.12 job start running time : 2022-12-27 17:40:47 problem throw time : 2023-05-11 16:41 ...