数据库快照

简介

数据库快照,正如其名称所示那样,是数据库在某一时间点的视图。快照设计最开始的目的是为了报表服务。比如我需要出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),意思是在复制一个对象时并不是真正把对象复制到另一个位置,而是在新的对象中映射一个指针,指向原对象的位置。这样当对新对象执行读操作时,直接指向原对象。而在对新的对象执行写操作时,将改变部分对象的指针指向到新的地址中。并修改映射表到新的位置中。

使用快照的限制

使用快照存在诸多限制,由于列表太长(详细请参考MSDN:http://msdn.microsoft.com/zh-cn/library/ms175158.aspx#LimitationsRequirements),我只概括的说一下主要限制。

  •     当使用快照恢复数据库时,首先要删除其他快照
  • 快照在创建时的时间点上没有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.由于快照会拖累数据库性能,所以数据库不宜存在过多快照。

总结

本文简单讲述了数据库快照的概念,原理以及使用。数据库快照可以在很多场景下使用,无论是用于报表,还是和镜像配合提供负载,以及利用快照恢复数据库,使用得当的话,快照将会是一把利器。

转载于http://www.cnblogs.com/CareySon/archive/2012/03/30/2424880.html

时间: 2024-10-19 19:58:25

数据库快照的相关文章

[整理]数据库镜像与数据库快照

http://wuxinaiaman928.blog.163.com/blog/static/64932144200861035432565 在SQL Server2005课程中提到了数据库快照与数据库镜像的问题,这两个功能都是在SQL2005中增加的新特性,由于上课时间有限,没有时间进行详细的阐述,现将相关资料发布在上面,希望学员能够认真学习,加以领会.   数据库镜像是SQL Server 2005的一个新特性,它允许你将一个SQL Server中的数据库内容镜像到另一个SQL Server

使用MSSQL同步&发布数据库快照遇到错误:对路径“xxxxx”访问被拒绝的解决方法

使用MSSQL同步 数据库同步做后后测试:先在同步那台服务器(服务器A)数据库里修改里面数据库,然后再去被同步那台服务器(服务器B)看下数据有没被同步过去 发布数据库快照遇到错误:对路径"xxxxx"访问被拒绝的解决方法 打开SQL Server 配置管理器 -> 在左边栏选择"SQL Server服 务"->在右侧面板中"SQL Server 代理"一行上右击,选择"属性", 在弹出的对话框中选择"内置

SQL SERVER 数据库快照

什么是数据库快照? 数据库快照是当前数据库的只读静态视图. 数据库快照的工作原理? 一旦创建了一个数据快照,数据库快照就会分配到一个空闲文件.当数据库原始页发生改变时,数据库原始页移动到数据库快照中. 图片来自网络 创建快照: CREATE DATADASE database_snapshot_name  ----服务器存储名 ON ( name =  logical_snapshot_name, -----本地存储名 filename = 'd:\snapshot_name    -----本

数据库快照的使用

1.  --查询csiday数据库下usr表中的内容  select * from csiday.dbo.usr 2.  --创建CSIDAY数据库快照 create database csiday_dbss on (name=csiday,filename='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\usr_dbss.ss')as snapshot of csiday 3.--更新csiday

11、SQL Server 视图、数据库快照

SQL Server 视图 什么是视图? 视图是一个虚拟的表,内容源于查询的结果集.只有当视图上建立了索引后,才会具体化. 视图可以筛选和处理数据,而不是直接访问基础表.如:创建一个视图,只展示源表中的几列数据,无需授予用户访问基础表的权限,取而代之的是授予视图访问权限. 为什么用视图? 1.如果是比较复杂的多表联查,可以将这些复杂的语句放在视图中完成,而我们只需要使用简单的语句查询视图即可. 2.保护基础表,敏感列无法被检索出. 3.对视图添加索引,可以提高效率. 创建视图 1.可以使用SSM

SQL基础之数据库快照

1.认识快照 如名字一样,数据库快照就可以理解为数据库某一时刻的照片,它记录了此时数据库的数据信息.如果要认识快照的本质,那就要了解快照的工作原理.当我们执行t-sql创建快照后,此时就会创建一个或多个稀疏文件.稀疏文件的个数与数据库数据文件的个数相等且一定要相等,否则会报错.此时,稀疏文件只是一个空文件并没有在磁盘上分配空间存储用户数据,如果数据库没有任何更新那快照也将一直是空文件.快照唯一的一次写数据,仅发生在第一次更新数据库的数据页,这时快照会将数据页中的数据复制到快照中并在磁盘上真真的分

创建数据库快照

use master if exists(select * from sysdatabases where name = '学生管理系统') drop database 学生管理系统 Create DataBase 学生管理系统 on ( name = '学生管理系统_DATA', filename = 'E:\临时数据库\学生管理系统_DATA.mdf', size = 10MB, filegrowth = 1MB ) log on ( name = '学生管理系统_LOG', filenam

数据库快照、游标、锁

sqlserver数据库快照: 具体可参考链接:http://www.cnblogs.com/CareySon/archive/2012/03/30/2424880.html sqlserver数据库游标: 具体可参考链接:http://www.cnblogs.com/CareySon/archive/2011/11/01/2231381.html sqlserver数据库锁: 具体可参考链接:http://www.cnblogs.com/CareySon/archive/2012/03/22/

SQL Server 创建数据库快照

创建数据库快照: 必须在create database 命令中包括源数据库的每一个数据文件,原始逻辑名,新物理名与路径, 不能指定其他属性 create database db_snapshot_name on (....)[,(....)....] as snapshot of db_name; ------------------------------- 例子: create database studio_snapshot      on(name = 'studio',filename