【生产问题】记还原一个很小的BAK文件,但却花了很长时间,分析过程

时间:2022-09-07 21:42:41

【生产问题】还原一个很小的BAK文件,但却花了很长时间?

关键词:备份时事务日志太大会发生什么?还原时,事务日志太大会怎么办?

1、前提

【1.1】原库数据已经丢失,只有这个bak了

【1.2】bak文件只有1.8G大小

2、遇见问题

【2.1】1.8G的bak文件,还原了2个小时还没成功。排查为什么这么慢

  (1)排查请求进度: 查看 sys.dm_exec_requests(查看进度与阻塞)

select status,start_time,command,percent_complete,wait_type,text,
session_id,blocking_session_id
from sys.dm_exec_requests r
cross apply sys.dm_exec_sql_text(r.sql_handle) s

  发现进度已经是100

  【生产问题】记还原一个很小的BAK文件,但却花了很长时间,分析过程

    【生产问题】记还原一个很小的BAK文件,但却花了很长时间,分析过程

  (2)在(1)中找到了我的还原操作,发现其进程的wait_type字段为

    BACKUPTHREAD: 当某任务正在等待备份任务完成时出现。等待时间可能较长,从几分钟到几个小时。如果被等待的任务正处于 I/O 进程中,则该类型不指示发生问题。

  (3)根据(2)中推测可能是因为事务日志太大的原因,导致还原重新写LDF到磁盘非常慢,且还有一个redo、undo的过程。

  (4)然后进行(3)中推断的验证,查看备份文件中的信息(利用RESTORE FILELISTONLY,参考联机丛书

  

--代码演示
declare @bak_path varchar(1000)
set @bak_path = 'E:\Db_Tank_Back\Db_Tank_Copy1.bak'
EXECUTE('RESTORE FILELISTONLY FROM DISK = ''' + @bak_path + '''');

  结果如下图: 

  【生产问题】记还原一个很小的BAK文件,但却花了很长时间,分析过程

  联机丛书中描述,这里的size是以B为单位,所以除以2^30次方,得出以G为单位的大小值。

    【生产问题】记还原一个很小的BAK文件,但却花了很长时间,分析过程

  结果,MDF1.78 G,LDF 107G!!!!!似乎找到原因了,为什么还原这么慢,是因为一个107G的文件,要从备份文件里拷贝出来,需要的时间可想而知。

  【生产问题】记还原一个很小的BAK文件,但却花了很长时间,分析过程

3、分析整个事件情况

【3.1】为什么MDF+LDF这么大,备份出来的文件只有1.8G?

  因为,全备只会复制有效数据,即已经持久化的MDF以及尚在活跃中的ldf段(可以粗略理解成还未提交的事务/已提交但还未持久化的事务)。

  所以,别看ldf那么大,实际上很多都是已经持久化了的,备份文件根本不会去拷贝那些数据(相对而言是无效或者说已经失去时效性的数据)。

  具体可以参考备份还原原理

【3.2】为什么备份文件只有1.8G,还原出来却把整个MDF1.78 G,LDF 107G 都还原出来了??

  这是因为,虽然有效(活跃的事务日志数据)的日志数据不多,大概几百M,但是依然会把整个ldf所占空间给标识出来。

  这个是在全备时,MSSQL对原数据文件大小信息写入了备份文件文件头,还原时也是会申请这么大,虽然可能实际上使用的数据空间并没有这么大。

  数据文件和日志文件都会这样。

  终于,历史2个小时20分钟,还原好了。大致估算,为什么是这么一个值?

  假如:10M/s的复制速度的话,一个1G就要100秒,100G就需要1W秒,综合就是2个多小时,可能复制速度会更快一点吧?

【4】MSSQL的 MDF很大,为什么备份出来很小?

(0)前提,通ldf一样,mdf也会有这样的问题,或者说他们一并拥有这样的问题。

  比如典型的例子就是高水位,数据库MDF用了10G空间,数据库delete之后,有效数据只有5G了。

  但数据库MDF文件仍然是10G,不会主动释放空间给OS,下次再有插入更新等操作就会根据情况优先使用这10G文件里的那5G空闲空间。

  delete后的文件空间具体情况参考:sql server 测试delete后数据空间情况

(1)解密为什么

  mssql 会只拿那5G有效数据塞到备份文件 bak中去。但备份文件的文件头会记录下来 Mdf 的预留空间是多大(就是当前MDF有多大,就是上面说的10G),以便还原的时候给MDF 申请这么多空间。

  由此,bak备份文件因为只存了5G有效数据,它只有5G大小。

  但还原的时候,因为bak备份文件的文件头记录要申请10G空间,所以还原出来的库有10G大小。

(2)LDF也是由此同理

总结

  【1】备份全备时,如果事务日志过大,务必进行截断、收缩。

  【2】日常备份作业中,理应有事务日志备份存在,以便时间点还原以及对事务日志进行截断(截断后即可循环利用空间,除非特殊情况否则不会增长太多,甚至不增长)

【3】无论备份文件多小,但实际还原的时候,系统会申请备份时间点 那一刻那个库文件的空间来进行还原。

【生产问题】记还原一个很小的BAK文件,但却花了很长时间,分析过程的更多相关文章

  1. SQL server 如何附加、还原、分离、备份数据库文件

    No1 : 附加 No2 : 还原            一.(需要 .bak文件)首先建立一个数据库,数据库名称与你的.bak文件名要相同. 当然.这时候的这个数据库还是空的,需要还原回去数据.右键 ...

  2. 很小的一个函数执行时间调试器Timer

    对于函数的执行性能(这里主要考虑执行时间,所耗内存暂不考虑),这里写了一个简单的类Timer,用于量化函数执行所耗时间. 整体思路很简单,就是new Date()的时间差值.我仅仅了做了一层简单的封装 ...

  3. RTTI、虚函数和虚基类的实现方式、开销分析及使用指导(虚函数的开销很小,就2次操作而已)

    白杨 http://baiy.cn “在正确的场合使用恰当的特性” 对称职的C++程序员来说是一个基本标准.想要做到这点,首先要了解语言中每个特性的实现方式及其开销.本文主要讨论相对于传统 C 而言, ...

  4. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...

  5. 用Python设计一个经典小游戏

    这是关于Python的第9篇文章,介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习 ...

  6. 部署用于生产的Exceptionlees(一个强大易用的日志收集服务)

    Exceptionless是一个非常优秀的事件记录服务,目前我们的自部署的Exceptionless已经稳定运行了近一年的时间,收集了千万条事件信息.但Exceptionless官方自宿主部署的文档不 ...

  7. 一个js小游戏----总结

    花了大概一天左右的功夫实现了一个js小游戏的基本功能,类似于“雷电”那样的小游戏,实现了随即怪物发生器,碰撞检测,运动等等都实现了,下一个功能是子弹轨迹,还有其他一些扩展功能,没有用库,也没有用web ...

  8. 【MFC】利用MFC写一个计时器小程序

    1整体设计 创建对话框程序,并且设计对话框相关控件如图 相应的ID和对应的成员变量如图: 我的想法是这样的,只读属性的编辑框添加有CString类型的成员变量(如s_hour),在xxxDlg.h里另 ...

  9. 制作一个 JavaScript 小游戏

    简评: 作者学习了编程两个月,边学边做了一个 JavaScript 小游戏,在文中总结了自己在这个过程中的一些体会,希望能给其他初学者一些帮助. 对于很多想学编程但一直没下定决心的同学来说,最大的问题 ...

随机推荐

  1. 【BZOJ 1038】【ZJOI 2008】瞭望塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=1038 半平面交裸题,求完半平面后在折线段上的每个点竖直向上和半平面上的每个点竖直向下求距离,统计最小 ...

  2. 与你相遇好幸运,Sail.js新建模型控制器

    sails generate api user  创建了user的controller和models sails generate api user index 创建了user的controller和 ...

  3. JAX-WS(一)之使用wsgen从Java创建简单的WebService

    概念 JAX-WS2.0的全称Java API for XML-Based Web Service 2.0.JAX-WS2.0是对JAX-RPC1.0规范的扩展,是JAX-RPC1.1的后续版本,JA ...

  4. 通过获取客户端Json数据字符串,反序列化为实体对象的一段代码

    #region 保存候选人数据 /// <summary> /// 保存候选人数据 /// </summary> /// <param name="entity ...

  5. ZOJ 1914 Arctic Network (POJ 2349) MST

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1914 http://poj.org/problem?id=2349 题目大 ...

  6. 安装Sass的一些注意事项

    文章的内容都来自网络: 1. RubyGems 镜像 2.  compass watch,我们的Sass种如果出现了中文, 就会出现编译错误,我们需要: 找到ruby的安装目录,里面也有sass模块, ...

  7. LayoutInflater&period;inflate&lpar;&rpar; 参数研究

    参考连接:http://blog.csdn.net/lovexieyuan520/article/details/9036673 http://www.2cto.com/kf/201407/31305 ...

  8. 利用crontab定时提交svn遇到的几个问题

    交待下背景...公司开发组只有技术经理有服务器和数据库权限,还只是开发环境的..因为工作安排和权限限制,测试同学上线的时候,需要本人帮开发组的部分同事review代码并把代码提交到trunk.一开始手 ...

  9. Python进阶:迭代器与迭代器切片

    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...

  10. Spark操作dataFrame进行写入mysql,自定义sql的方式

    业务场景: 现在项目中需要通过对spark对原始数据进行计算,然后将计算结果写入到mysql中,但是在写入的时候有个限制: 1.mysql中的目标表事先已经存在,并且当中存在主键,自增长的键id 2. ...