不可不知的SQL Server还原过程

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
日志服务 SLS,月写入数据量 50GB 1个月
简介:
为何要对数据库的还原过程进行“长篇大论”?
如果一个数据库还原的时间远超日常均值,眼看时间一分分过去,但还未结束,更严重的是,你不知道什么时候能结束,出了焦急等待,你可能会这么做:
  1. 还原假死了,我要停止这次还原,重新还原一次;
  2. 备份文件有问题,换个备份文件再试一次(尽管会有数据丢失);
然而你以为的解决方法并没有出现预期的效果,而浪费在这些方法上的时间让业务系统恢复变得更加遥不可及。
如果你熟知还原的过程,你就能跟踪还原的进度,而当你看到进度在变化时,让你至少能看到业务恢复的时间在一步步靠近。

数据库还原有3个阶段
阶段1:复制文件的阶段
在阶段1中,SQL Server将备份文件中的所有的数据、日志、索引拷贝到还原后的数据库文件中。
此时,你在数据库的日志文件里,可以看到数据库start的记录,同时该数据库会被标记为restoring。
如下视图可以帮助你查看复制的进度:
select percent_complete,last_wait_type,* from sys.dm_exec_requests 
阶段2:redo 阶段2是还原的redo阶段,
SQL Server根据日志文件对已提交的事务进行redo,将数据库恢复到recovery point,但此时,日志文件中因存在未提交的事务需回滚,因此,此时数据库还处于不可用状态。
进入此阶段时,你会在数据库的日志中看到数据库会再次starting一次,且能看到百分比显示的redo进度,注意,此时如果你查看 sys.dm_exec_requests视图中percent_complete字段,你会发现一直显示100%,这是正常的,因为redo的进度并不会在 sys.dm_exec_requests中显示。所以切记不要以为还原卡死了而结束还原。
阶段3:回滚
阶段3是还原的回滚阶段,
SQL Server对日志文件中未提交的事务进行回滚,从而保证数据的一致性。数据库只有在回滚完成后,才会变得可用。
如果备份文件的事务日志中存在大量未提交的事务,那回滚的过程就会很长,还原的时间可能远超日常的均值。
笔者曾经遇到这样的场景:数据库的备份文件中包含了一个执行了10天没有完的事务(死循环)的日志,当我在进行还原时,整整还原了2天,客户的业务系统也停了2天。
这个阶段的还原进度也只能在SQL Server的错误日志中才能看到,当你看到进度为100%日志时,SQL Server会执行一个checkpoint操作,它会将内存中的脏数据固化到磁盘。
checkpoint执行时间的长短取决于内存中脏数据的大小,保守的估算方法是:假设内存的大小就是脏数据的大小,
checkpoint执行时间= 内存大小/数据文件(mdf)的写入速率
其中写入的速率可以在资源监视器(win2012及以上的系统)中可以详细看到。
当checkpint完成是时,在SQL Server的错误日志中可以看到还原完成的记录。此时数据库就可以正常使用了。

总结
看完了上述的还原的完整过程,当你再次碰到数据库还原的时间远超日常均值你就不会心慌了,起码你知道这是正常的还原过程,甚至你还能通过这个现象来判断该数据库很可能运行了非正常的SQL在序,需要进行治理。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
6月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
3月前
|
关系型数据库 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)")
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
127 13
|
5月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
5月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
66 6
|
5月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
432 1
|
5月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
354 3
|
4月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
523 0
|
5月前
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。
|
5月前
|
SQL 存储 关系型数据库
关系型数据库SQL Server学习
【7月更文挑战第4天】
83 2