数据库快照——精选推荐
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库快照
简介
数据库快照,正如其名称所⽰那样,是数据库在某⼀时间点的视图。
快照设计最开始的⽬的是为了报表服务。
⽐如我需要出2011的资产负债表,这需要数据保持在2011年12⽉31⽇零点时的状态,则利⽤快照可以实现这⼀点。
快照还可以和镜像结合来达到读写分离的⽬的。
下⾯我们来看什么是快照。
什么是快照
数据库快照是 SQL Server 数据库(源数据库)的只读静态视图。
换句话说,快照可以理解为⼀个只读的数据库。
利⽤快照,可以提供如下好处:
提供了⼀个静态的视图来为报表提供服务
可以利⽤数据库快照来恢复数据库,相⽐备份恢复来说,这个速度会⼤⼤提⾼(在下⾯我会解释为什么)
和数据库镜像结合使⽤,提供读写分离
作为测试环境或数据变更前的备份,⽐如我要⼤批导⼊或删除数据前,或是将数据提供给测试⼈员进⾏测试前,做⼀个快照,如果出现问题,则可以利⽤快照恢复到快照建⽴时的状态
快照的原理
与备份数据库复制整个数据库不同,快照并不复制整个数据库的页,⽽是仅仅复制在快照建⽴时间点之后改变的页。
因此,当利⽤快照进⾏数据库恢复时,也仅仅将那些做出改变的页恢复到源数据库,这个速度⽆疑会⼤⼤⾼于备份和恢复⽅式。
这个原理如图1所⽰(图摘⾃SQL Server 2008揭秘)。
图1.镜像的原理
由图1可以看出,快照并不是复制整个整个数据库,⽽仅仅利⽤快照存储原始页。
因此可以看出,源数据库上建⽴快照会给IO增加额外负担.当对快照数据库进⾏查询时,快照时间点之后更改的数据会查询数据⽂件,。
这个概念如图2所⽰(图摘⾃SQL Server 2008揭秘)。
图2.查询快照数据库时查询的分布
写⼊时复制(Copy On Writing)和稀疏⽂件(Sparse Flie)
由上图中可以看出,快照数据库的⽂件是基于稀疏⽂件(Sparse File),稀疏⽂件是NTFS⽂件系统的⼀项特性。
所谓的稀疏⽂件,是指⽂件中出现⼤量0的数据,这些数据对我们⽤处并不⼤,却⼀样占⽤着磁盘空间。
因此NTFS对此进⾏了优化,利⽤算法将这个⽂件进⾏压缩。
因此当稀疏⽂件被创建时,稀疏⽂件刚开始⼤⼩会很⼩(甚⾄是空⽂件),⽐如图3所⽰的⽂件就是⼀个稀疏⽂件。
虽然逻辑上占了21M,但⽂件实际上占了128KB磁盘空间。
图3.⼀个稀疏⽂件
对于快照来说,除了通过快照数据库⽂件的属性来看快照的⼤⼩之外,也可以通过DMV来查看,如图4所⽰.
图4.通过DMV查看快照数据库⼤⼩
⽽当快照创建后,随着对源数据库的改变逐渐增多,稀疏⽂件也会慢慢增长,概念如图4所⽰。
图5.随着源数据库的更改越来越多,稀疏⽂件不断增长
所以,通常来说,当稀疏⽂件增长到源数据库⽂件⼤⼩的30%时,就应该考虑重建快照了。
⽽稀疏⽂件的写⼊是利⽤了微软的写⼊时复制技术(Copy-On-Writing),意思是在复制⼀个对象时并不是真正把对象复制到另⼀个位置,⽽是在新的对象中映射⼀个指针,指向原对象的位置。
这样当对新对象执⾏读操作时,直接指向原对象。
⽽在对新的对象执⾏写操作时,将改变部分对象的指针指向到新的地址中。
并修改映射表到新的位置中。
使⽤快照的限制
当使⽤快照恢复数据库时,⾸先要删除其他快照
快照在创建时的时间点上没有commit的数据不会被记⼊快照
快照是快照整个数据库,⽽不是数据库的某⼀部分
快照是只读的,意思是不能在快照上加任何更改,即使是你想加⼀个让报表跑得更快的索引
在利⽤快照恢复数据库时,快照和源数据库都不可⽤
快照和源数据必须在同⼀个实例上
快照数据库的⽂件必须在NTFS格式的盘上
当磁盘不能满⾜快照的增长时,快照数据库会被置为suspect状态
快照上不能存在全⽂索引
其实,虽然限制看上去很多,但只要明⽩快照的原理,⾃然能推测出快照应该有的限制。
快照的创建和使⽤
⽆论是使⽤SSMS或是命令⾏,快照只能通过T-SQL语句创建。
在创建数据库之前,⾸先要知道数据库分布在⼏个⽂件上,因为快照需要对每⼀个⽂件进⾏copy-on-writing。
如图6所⽰。
图6.⾸先查出数据库的⽂件分布
根据图6的数据库分布,我们通过T-SQL创建快照,如图7所⽰。
图7,根据图6的数据库信息创建⼀个数据库快照
当快照数据库创建成功后,就可以像使⽤普通数据库⼀样使⽤快照数据库了,如图8所⽰。
图8.快照数据库和普通数据库⼀样使⽤
通过如下语句可以看到,快照数据库⽂件和源数据库的⽂件貌似并⽆区别,仅仅是快照数据库⽂件是稀疏⽂件,如图9所⽰。
图9.源数据库和快照数据库
⽽删除快照数据库和删除普通数据库并⽆⼆⾄,也仅仅是使⽤DROP语句,如图10所⽰。
图10.删除快照数据库
我们也可以利⽤快照恢复数据库,这个恢复速度要⽐普通的备份-恢复来的快得多,这也可以将数据库呈现给测试⼈员,当测试结束后,恢复数据库到测试之前的状态。
如图11所⽰。
图11.利⽤快照恢复数据库
使⽤快照其他⼀些需要考虑的因素
1.快照数据库的安全设置继承源数据库的安全设置。
也就是说能访问源数据库的⽤户或⾓⾊也能访问快照数据库,当然,因为快照数据库是只读的,所以⽆论任何⾓⾊或⼈都⽆法修改快照数据库。
2.我们由⽂章前⾯图5看出,随着快照存在的时间越来越长,快照会不断增长。
所以推荐在快照达到源数据库⼤⼩30%之前,重新创建快照。
3.由于快照会拖累数据库性能,所以数据库不宜存在过多快照。
总结
本⽂简单讲述了数据库快照的概念,原理以及使⽤。
数据库快照可以在很多场景下使⽤,⽆论是⽤于报表,还是和镜像配合提供负载,以及利⽤快照恢复数据库,使⽤得当的话,快照将会是⼀把利器。