MS SQL Server 中的数据库快照






4.63/5 (19投票s)
MS SQL Server 中数据库快照功能的介绍。 它是用于生成报告数据的重要工具之一。
引言
微笑,茄子,咔嚓一下! 快照已点击。 以后任何时候我看到它,都会让我想起点击快照的时间。 我真希望有一台时光机可以带我回到过去。 可惜,生活中没有带倒带按钮的时光机。 但数据库中不是这样。 数据库快照是人们渴望的功能; 它使数据库的生活变得精彩。 快照可以被认为是实时的时间点恢复选项,它拍摄数据库的图像。 稍后,可以使用此图像/快照将数据库恢复到拍摄快照时的状态。
在许多情况下,快照都是理想的选择
- 快照是只读的,是用于报告目的的非常好的选择。 所有与报告相关的访问都可以在快照上进行,而不是在实际数据库上进行,从而可以最大限度地减少活动数据库上的负担。 此外,由于快照是只读的,因此可以避免订阅者(为报告等读取数据)进行任何不需要的更新。
- 快照可用于保存财务统计/分析的数据。 例如,特定产品的年度快照数据可用于执行统计分析并预测其市场增长。
- 如果需要,快照也可用于将当前数据库恢复到拍摄快照时的状态。 它将执行非常快速的时间点数据库恢复。
最初,拍摄快照时,它只是指向实际数据库的指针,也就是说,当我查询快照时,它会从实际数据库检索数据。 但这只会发生在实际数据库上的数据页尚未更改之前。 一旦对数据库进行了更改,原始页面就会放置到快照中,然后对数据库上的页面进行更改。 这确保了快照保持图像的完整性。 在快照处于活动状态之前,无法删除实际数据库。 要能够删除数据库,必须首先删除快照,然后才能删除数据库。 快照占用非常少的磁盘空间。 快照占用的空间只是更改的数据页。 对于未更改的页面,它仍然从实际数据库获取数据。
创建快照
在创建快照之前,让我们创建一个数据库、一个表,并将一些记录插入到表中。
USE master
CREATE DATABASE TEST
USE TEST
CREATE TABLE Student(ID INT,Name VARCHAR(15),SECTION CHAR(1))
INSERT INTO Student VALUES
(1,'Keshav','A'),
(2,'Sachin','B'),
(3,'Rahul','C')
SELECT * FROM dbo.Student
ID Name SECTION
----------- --------------- -------
1 Keshav A
2 Sachin B
3 Rahul C
(3 row(s) affected)
让我们记下数据库的大小。
USE TEST
EXEC sp_spaceused
database_name database_size unallocated space
----------------- --------------- ------------------
TEST 1.87 MB 0.11 MB
reserved data index_size unused
------------------ ------------------ ------------- -------
1296 KB 512 KB 640 KB 144 KB
还有.MDF 文件的大小,位于C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\TEST.mdf。
接下来,我们将创建数据库的快照。
USE master
CREATE DATABASE TEST_SS
ON
(NAME=TEST,
FILENAME='C:\Program Files\Microsoft SQL Server\
MSSQL10_50.MSSQLSERVER\MSSQL\DATA\TEST_SS.ss'
)
AS SNAPSHOT OF TEST
上面的查询创建一个测试数据库的快照,该快照在对象资源管理器中可见。
让我们记下数据库的大小。
USE TEST_SS
EXEC sp_spaceused
database_name database_size unallocated space
----------------- --------------- ------------------
TEST_SS 1.87 MB 0.11 MB
reserved data index_size unused
------------------ ------------------ ------------------ ------------------
1296 KB 512 KB 640 KB 144 KB
上面显示的空间使用详细信息是快照指向的“Test”数据库的信息,为了确认观察结果,如果我们转到C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\TEST_SS.ss 并右键单击以查看属性,我们将看到如下所示的内容。 快照实际占用的空间仅为 192 KB。
接下来,让我们在 TEST 数据库的 Student 表中插入一些记录。
USE TEST
INSERT INTO Student VALUES
(4,'Rohit','A'),
(5,'Saumya','B')
Now if we query the snapshot:
USE TEST_SS
SELECT * FROM dbo.Student
ID Name SECTION
----------- --------------- -------
1 Keshav A
2 Sachin B
3 Rahul C
(3 row(s) affected)
快照中仍然有相同数量的记录。
此外,让我们尝试获取快照的大小。
我们观察到快照的大小增加了; 这是由于页面被复制到快照中。 当我们向其中添加两条额外的记录时,包含 Student 表的三条记录的页面被复制到快照中。
接下来,让我们尝试对快照数据执行更新。
UPDATE TEST_SS.dbo.Student SET Name='XXX'
WHERE ID=1
------------------------
Msg 3906, Level 16, State 1, Line 1
Failed to update database "TEST_SS" because the database is read-only.
任何 DML 都是不可能的,因为快照始终是只读的。
接下来,让我们尝试删除 TEST 数据库。
DROP DATABASE TEST
Msg 3709, Level 16, State 2, Line 1
Cannot drop the database while the database snapshot
"TEST_SS" refers to it. Drop that database first.
从快照还原
正如我之前所说,使用数据库快照,我们可以将数据库恢复到拍摄快照时的状态。 这可以通过从快照还原数据库来完成。
数据库快照具有正在修改的页面; 它们在原始数据库中更新之前被复制到快照中,因此快照包含未修改的页面,而原始数据库包含修改后的页面。 现在,当我们从快照还原数据库时,快照存储的未修改页面只是复制到实际数据库中,并且事务日志也被覆盖和重建。
我们可以借助快照执行常规备份吗? 我们可以将快照还原到不同的服务器吗? 我们可以将主机服务器上的快照数据库复制到另一个服务器上吗?
上述所有问题的答案都是否定的。 由于数据库快照是不完整的数据库副本,因此它不适合执行任何常规备份。 它可以被认为是实时的时间点恢复选项。
USE master
RESTORE DATABASE TEST
FROM DATABASE_SNAPSHOT = 'TEST_SS'