事务日志备份与恢复 3
14.3 产生备份集
通过前面的学习,我们已经知道SQL Server 2005数据库提供了将数据库的状态恢复到故障发生点的功能。但是这些功能的顺利执行需要有一些前提条件,比如联机日志不能损坏,否则将丢失最后一次日志备份完成时刻到故障点的事务。
很多DBA不了解这其中的奥秘,往往会想当然地认为利用已有的备份日志就可以将数据库恢复到故障点,忘记实际上还需要做一次日志备份才能恢复的奥秘。
接下来我们通过一个具体的实例来完成将数据库恢复到故障点的功能。
14.3.1 案例设计
案例的设计和完成的思路如下。
1.案例步骤
(1)新建数据库db_test,数据库工作在完全恢复模型下,新建表t_clusterindextest,向表中录入1001条数据。查询得到数据库的日志文件记录的日志区间。
(2)做一次完整数据库备份。查询得到备份后的数据库的日志区间和备份集中的日志区间。
(3)删除99条数据,产生事务日志,查询得到数据库的日志区间。
(4)第1次完成事务日志备份,按照默认设置就可以,即不是尾日志备份。查询备份后的数据库日志区间和备份集的日志区间。
(5)删除101条数据,产生事务日志,查询得到数据库的日志区间。
(6)第2次完成事务日志备份,按照默认设置就可以,即不是尾日志备份。查询备份后的数据库日志区间和备份集的日志区间。
(7)删除表中的1条记录,删除完毕后模拟故障发生。
(8)备份尾日志,然后尝试进行恢复操作。
案例的步骤可以用图14-8来表示。
图14-8 案例步骤
2.验证思路
在备份过程形成的最后的备份集中,我们可以这样来进行验证。
(1)利用完整数据库备份+日志备份1,可以将数据库恢复到删除99条记录的状态。
(2)利用完整数据库备份+日志备份1+日志备份2,可以恢复到将数据库删除200条记录的状态,而无法将数据库恢复到删除201条记录的状态。
(3)由于有尾日志备份,所以利用完整数据库备份+日志备份1+日志备份2+尾日志备份来将数据库恢复到删除201条记录的状态。
3.结论
通过上述实验步骤,说明尾日志备份在将数据库恢复到故障点时的重要性。读者可以深刻理解联机日志千万不能出故障的根本原因。
14.3.2 产生备份集
接下来介绍如何形成备份集。
1.产生数据库
按照与前面章节同样的办法,创建新的db_test数据库。创建表t_clusterindextest,生成1001条数据。
执行dbcc log命令查询此时数据库的日志情况如图14-9所示。
— 第1条日志记录的Current LSN:0000001d:0000001a:0001。
— 最后1条日志记录的Current LSN:0000001d:00000137:00a2。
图14-9 产生数据库后的日志
2.产生完整数据库备份
(1)按照图14-10所示界面产生完整数据库备份。
图14-10 产生完整数据库备份
(2)执行dbcc log命令查询数据库的日志情况如图14-11所示。
图14-11 产生完整数据库备份后的日志
— 第1条日志记录的Current LSN:0000001d:00000166:00b3。
— 最后1条日志记录的Current LSN:0000001d:000001b5:0003。
(3)执行restore headeronly命令查询备份集中的日志情况如图14-12所示。
图14-12 产生完整数据库备份后的备份集日志
Ø — FirstLSN:29000000035800179。
Ø — LastLSN:29000000043400001。
3.产生第1次日志备份
(1)执行下列代码删除99条记录。
Delete from db_test.dbo.t_clusterindextest
Where t_t_id<=99
光盘代码:\代码\1402.sql。
(2)执行dbcc log命令查询数据库的日志情况,如图14-13所示。
图14-13 删除99条数据库后的数据库日志
— 第1条日志记录的Current LSN:0000001d:00000166:00b3。
— 最后1条日志记录的Current LSN:0000001d:000001ba:0067。
(3)按照图14-14所示默认设置备份数据库的日志。
也可以执行下列代码完成同样的功能,注意,这里不是完成尾日志备份,而是产生了截断。
BACKUP LOG [db_test] TO DISK = N'C:\test2.bak'
WITH NOFORMAT,
NOINIT,
NAME = N'db_test-事务日志备份',
SKIP,
NOREWIND,
NOUNLOAD,
STATS = 10
GO
光盘代码:\代码\1403.sql。
(4)执行dbcc log命令查询备份后的数据库日志如图14-15所示。
— 第1条日志记录的Current LSN:0000001d:00000166:00b3。
— 最后1条日志记录的Current LSN:0000001d:000001ba:0067。
(5)执行restore headeronly命令查询备份集中的日志如图14-16所示。
图14-14 备份事务日志
图14-15 第1次日志备份后的数据库日志
图14-16 产生第1次日志备份后的备份集日志
4.产生第2次日志备份
(1)执行下列代码删除101条记录。
Delete from db_test.dbo.t_clusterindextest
Where t_t_id>99 AND t_t_id<=200
光盘代码:\代码\1404.sql。
(2)执行dbcc log命令查询删除后的数据库日志如图14-17所示。
图14-17 删除101条记录后的数据库日志
— 第1条日志记录的Current LSN:0000001d:00000166:00b3。
— 最后1条日志记录的Current LSN:0000001e:00000010:0008。
(3)第2次备份日志,不备份尾日志。
(4)执行dbcc log命令查询备份后的数据库的日志,如图14-18所示。
— 第1条日志记录的Current LSN:0000001e:00000013:0001。
— 最后1条日志记录的Current LSN:0000001e:00000027:0001。
图14-18 第2次事务日志备份后的数据库日志
(5)执行restore headeronly命令查询备份集中的日志区间如图14-19所示。
图14-19 第2次日志备份后的备份集日志
5.模拟故障发生
(1)执行下列代码删除1条记录。
delete from db_test.dbo.t_clusterindextest
where t_t_id=555
光盘代码:\代码\1405.sql。
(2)执行dbcc log命令查询数据库的日志,如图14-20所示。
图14-20 模拟故障发生时的日志
— 第1条日志记录的Current LSN:0000001e:00000013:0001。
— 最后1条日志记录的Current LSN:0000001e:0000004c:0005。
6.尾日志备份
(1)选择备份日志,在如图14-21所示的选项卡中选择进行尾日志备份。
(2)也可以通过执行1401.sql来完成同样的过程,执行情况如图14-22所示。
7.数据库日志
所有的操作执行完毕后,执行dbcc log命令查询数据库的日志如图14-23所示。
图14-21 备份尾日志
图14-22 执行尾日志备份的情况
图14-23 执行备份完毕后的数据库日志
— 第1条日志记录的Current LSN:0000001e:00000013:0001。
— 最后1条日志记录的Current LSN:0000001e:00000050:0001。
8.最终的备份集日志
查询最终的备份集的日志如图14-24所示。
图14-24 最后的备份集日志