原文地址:http://blog.renren.com/share/225531933/1165488758
数据库快照是个什么东西呢?可以这样理解,就是在某个时间点对指定数据库拍了一张快照,所以它是静态的,只读的,但本质上还是一个数据库,只要是数据库我们就是可以从里面取数据的,但是数据库快照这个数据库取数据库的原理是这样的:快照生成之后,如果数据库中任何数据页都没有被修改(insert,delete,update等),这个时候快照的mdf文件是空的,几乎不占用任何磁盘空间,这个时候从数据库快照中取数据库其实还是从源数据库中取。快照生成之后,数据库中的数据发生变动,这个时候数据库快照的mdf文件中就有了数据,但是只限于刚刚被修改之前的数据,举例 : 10 被修改为 100,这个时候数据库快照中存放10,源数据库中存放100.如果从数据库快照中去的数据既有被修改的也有没有被修改的,修改部分从数据库快照的mdf文件中获得,没有被修改的还是从源数据库中获得。有同学问了,数据库快照到底有什么用?
1,通过保存历史数据,可以用来生成报表来和修改之前的数据进行对比
2,可以用数据库快照来恢复数据库,而且它的的恢复速度可比backup文件恢复的快很多。
3,在对数据库做较大操作之前可以达到保护数据库的目的,尤其是在项目测试阶段这个作用很有用。
数据库快照的限制 : 快照的mdf文件必须和源数据库在同一server上,而且所在磁盘必须是NTFS格式的,因为他的mdf文件是以Sparse File格式存放的;如果源数据库由于任何原因损坏了,如源数据库源文件损坏,数据库快照也自然不能使用了,所以不要把数据库快照当作数据库恢复的一个策略;另外对数据库快照进行创建,删除,甚至使用快照来恢复数据库都必须使用SQL语句才能实现,SQL Server 2008不提供UI界面来操作。
创建数据库快照 :
CREATE DATABASE Test_Snapshot_200910270928 ON(
NAME = N'Test',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Test_Snapshot_200910270928.mdf' -- a new physical name) AS
SNAPSHOT OF Test
删除数据库快照 : DROP DATABASE Test_Snapshot_200910270928
用数据库快照恢复源数据库:USE MASTER;RESTORE DATABASE TEST FROM DATABASE_SNAPSHOT = 'Test_Snapshot_200910270928 ' (这里不用指定数据库快照的路径)
还有查看数据库快照提供了UI接口,在Object Explorer树形结构中Databases节点下面就能找到Database Snapshots节点。
忘了提一点:数据库快照和源数据库在系统数据库表sys.databases中是通过source_database_id来进行关联的,即可以通过下面的SQL来找到指定数据库的所有数据库快照,
SELECT NAME FROM sys.databases S
WHERE EXISTS(SELECT * FROM sys.databases P
WHERE P.name = 'Test'
AND P.database_id = S.source_database_id)