首页 > 数据库 >大事务导致数据库恢复时间长​

大事务导致数据库恢复时间长​

时间:2023-10-27 13:32:52浏览次数:40  
标签:事务 恢复 数据库 Server 阶段 SQL 日志

背景客户的一套系统从凌晨开始出现运行缓慢,重启SQL Server服务后一个主要的数据库一直处在正在恢复的状态,多次重启SQL Server服务和服务器无果后请我们协助处理。

现象

在SSMS中看到数据库是正在恢复的状态,而且不能被访问。

大事务导致数据库恢复时间长​_数据库


分析

启动SQL Server服务时数据库恢复要经过分析、重做和撤销3个阶段,在阶段2完成后数据库才能提供访问。如果某个阶段运行时间长,在日志里面会记录进度。

查找日志,发现从8:31:45开始阶段1,8:34:30开始阶段2,从进度上看现在已经完成了28%。确保磁盘空间充足后,剩下的工作就是查看进度,等待完成。

大事务导致数据库恢复时间长​_Server_02


9:10:52,看到进度为99%的日志。9:11:11,阶段2完成。在完成阶段2后,数据库就可以访问了。


大事务导致数据库恢复时间长​_Server_03


直到15:21:14时才看到阶段3完成的日志,三个阶段共花费7个小时的时间。

大事务导致数据库恢复时间长​_数据库_04


通过日志记录看到阶段3的时间非常长,说明在停止SQL Server服务时有特别大的事务在运行。通过SQL专家云,在活动会话中找到会话157,从0:36:38时开始执行一个INSERT语句,到4:14:01停止SQL Server服务时还没有执行完,期间造成了大量的阻塞,日志文件从几个G增长到100G。

大事务导致数据库恢复时间长​_SQL_05


大事务导致数据库恢复时间长​_数据库_06


大事务导致数据库恢复时间长​_Server_07


再来分析为什么恢复数据库要这么长时间,根据数据库恢复的流程,忽略掉阶段1的时间,阶段2和阶段3都是要从最早的未提交事务的时间点开始分析事务日志,也就是要从0:36:38开始,要分析处理100G的日志。


大事务导致数据库恢复时间长​_数据库_08


总结

大的INSERT事务(分析后得知因为条件写错了,要插入6000万条数据)执行期间造成了大量的阻塞,影响了系统的其它功能,客户接到故障报警后没有仔细分析原因就直接重启了SQL Server服务。重启后数据库的恢复时间非常长,由于客户不熟悉原理,每次启动服务后等待十几分钟看数据库状态不对便再次重启,如此反复多次,耽误了很长的时间。

SQL Server作为一个成熟的数据库,在每个步骤都会记录下详细的日志,我们要养成看日志分析问题的习惯。另外,从SQL Server 2016开始,增加了数据库恢复进度的扩展事件,可以分析的更详细。具体参考“https://learn.microsoft.com/zh-cn/archive/blogs/sql_server_team/new-extended-events-for-database-recovery-progress”。

大事务导致日志文件增大,磁盘空间撑爆,事务回滚时间长,SQL Server服务异常终止等问题,要尽量避免大事务。

大事务导致的回滚时间长或者异常终止后重启SQL Server服务时数据库恢复时间长是一个非常困扰的问题。在SQL Server 2019新推出的“加速数据库恢复”功能就是解决这个痛点的,但是不成熟,开启这个功能又导致了数据文件增长过大等其它的问题,在SQL Server 2022版本中进行了改进。详细资料参考“https://learn.microsoft.com/zh-cn/sql/relational-databases/accelerated-database-recovery-concepts?view=sql-server-ver16”。

北京格瑞趋势科技有限公司是聚焦于数据服务的高新技术企业,成立于2008年,创始团队及核心技术人员来自微软和雅虎。微软数据平台合作伙伴,卫宁健康数据平台战略合作伙伴。通过产品+服务双轮驱动的业务模式,14年间累计服务4000+客户,覆盖互联网、市政、交通、电信、医疗、教育、电力、制造业等各个领域。

标签:事务,恢复,数据库,Server,阶段,SQL,日志
From: https://blog.51cto.com/u_15934193/8053366

相关文章

  • Revit 自定义事务进行自动管理事务DBTrans实现
    第一步:自定义事务对象自定义事务对象///<summary>///自定义事务///</summary>publicclassDBTrans:IDisposable{#region私有字段privatebooldisposedValue;privatebool_commit;///<summary>......
  • scrapy中爬虫数据如何异步存储mysql数据库jd
    1.SQLCREATETABLE`JDAll`(`shop_id`VARCHAR(16)NOTNULL,//商品ID`url`VARCHAR(255)DEFAULTNULL,//商品url`title`VARCHAR(1024)DEFAULTNULL,//商品标题`brand`VARCHAR(255)DEFAULTNULL,//品牌`brand_url`VARCHAR(1024)DEF......
  • 数据库基础操作3
    今日内容详细python操作MySQL(重要)MySQL本身就是一款C/S架构,有服务端、有客户端,自身带了有客户端:mysql.exepython这门语言成为了MySQL的客户端(对于一个服务端来说,客户端可以有很多)"""SQL的由来"""操作步骤: 1.先链接MySQL host、port、username、password、charset......
  • 事务,python连接mysql 索引等
    1.python连接MySQLMySQL本身就是一款C/S架构,有服务端、有客户端,自身带了有客户端:mysql.exepython这门语言成为了MySQL的客户端(对于一个服务端来说,客户端可以有很多)"""SQL的由来"""操作步骤:1.先链接MySQLhost、port、username、password、charset、库等......
  • 使用NvicatPremium时,Mysql数据库插入数据时,报错1064
    使用navicatPremium新版本时,插入数据,显示错误1064-YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear''choose'('ChooseNo','SNo','CNo','......
  • 数据库查询
    1、连接查询内连接查询与单表查询相似,都是使⽤select语句可以把多张表放到select后边,并⽤逗号隔开还可以结合as取别名,⽅便引⽤如果要查询多个表中的字段,⽆重名的情况下,可以省略表的指定⾮等值连接迪卡尔积--内连接中的非等值链接。select*fromgra......
  • PostGIS安装及空间数据库的创建与shp数据导入
    PostGISisaspatialdatabaseextenderforPostgreSQLobject-relationaldatabase.ItaddssupportforgeographicobjectsallowinglocationqueriestoberuninSQL.PostGIS是空间数据库,是PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象、空间索引、......
  • 徒步恢复指南
    徒步恢复指南长距离徒步后如何能尽快“满血复活”?恢复指南1、到家后补充能量。2、热水澡,但不能热水泡脚。3、用扶他宁按揉酸疼的地方,有肿胀部位不要按摩。4、多抖动身体,不可酗酒。5、睡觉时腿部垫高。6、第二天慢跑积极恢复或游泳放松。7、24小时后开始泡脚或冷热水交叉......
  • golang 获取 mongo 数据库状态
    命令行模式navicatgolangpackagemainimport( "context" "encoding/json" "fmt" "log" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-drive......
  • MySQL建数据库排序规则选择
    MySQL建数据库排序规则选择引言在MySQL数据库中,选择适合的排序规则对于数据的存储和检索非常重要。排序规则决定了字符比较的方式,影响数据库的数据排序和查询结果。本文将介绍MySQL中常见的排序规则,并提供相应的代码示例来帮助读者理解和选择适合自己需求的排序规则。排序规则......