分析VLF以及利用日志备份还原数据库到指定时间
本文原整理于2012-09
一备份链
USEMASTER;
GO
CREATEDATABASElogtest
运行如下语句
USElogtest
go
DBCCloginfo
图1-1
运行如下语句可以看到产生很多VTL
USElogtest
go
SELECTTOP 10000 *INTOt1
FROMAdventureWorks.Sales.SalesOrderHeader
DBCCloginfo
图1-2
运行如下语句可以看到日志被截断,标记为可重用状态(status=0)
USElogtest
BACKUPDATABASElogtestTODISK='c:\logtest_full.bak'
DBCCloginfo
图1-3
重新插入一个新表,可以看到VTL又将处于活动状态
--at 21:59
SELECTTOP 10000 *INTOt2
FROMAdventureWorks.Sales.SalesOrderHeader
DBCCloginfo
图1-4
--at 22:03
BACKUPDATABASElogtestTODISK='c:\logtest_diff.bak'WITHdifferential
DBCCloginfo
图1-5
--at 22:04
SELECTTOP 10000 *INTOt3
FROMAdventureWorks.Sales.SalesOrderHeader
DBCCloginfo
图1-6
--at 22:10
BACKUPLOGlogtestTODISK='c:\logtest_log201209192210'--注意不要加bak后缀
DBCCloginfo--可以看到VTL被标记为可复用状态(satus=0)
图1-7
--at 22:15 误删t3的数据表
DELETEFROMt3
DBCCloginfo
图1-8
二利用备份链还原数据库
--需将数据库恢复到22:15之前数据被删除的状态
--1 首先备份尾部日志
--at 22:22
BACKUPLOGlogtestTODISK='c:\logtest_log_tail'
DBCCloginfo --
VTL将变为可复用
图2-1
--2.还原数据库到指定时间(被删前的时间 22:15以前)
--at 22:31
USEmaster
restore DATABASE logtest FROM DISK='c:\logtest_full.bak'WITH REPLACE,norecovery
restore DATABASE logtest FROM DISK='c:\logtest_diff.bak'WITH REPLACE,norecovery--该步也可忽略,前提是日志备份链完整
RESTORE LOG logtest FROM DISK='c:\logtest_log201209192210'WITH REPLACE,norecovery
RESTORE LOG logtest FROM DISK='c:\logtest_log_tail'WITH REPLACE,RECOVERY,STOPAT='2012-09-19 22:15:00'
USElogtest
SELECT*FROMt3
—可以看到数据库恢复到指定时间成功如下图
图2-2
3.还原到指定的日志备份集
USEmaster
restore DATABASE logtest FROM DISK='c:\logtest_full.bak'WITH REPLACE,norecovery
restore DATABASE logtest FROM DISK='c:\logtest_diff.bak'WITH REPLACE,NORECOVERY--该步也可忽略,前提是日志备份链完整
RESTORE LOG logtest FROM DISK='c:\logtest_log201209192210'WITH REPLACE,RECOVERY
USElogtest
SELECT*FROMt3
图2-3
三利用备份链复制出一个新数据库,并且将数据回退到22:15前的状态
RESTOREDATABASE[logtest_bk]FROMDISK=N'c:\logtest_full.bak'WITHFILE= 1,
MOVEN'logtest'TON'D:\$SQLDatabase$\logtest_bk.mdf',
MOVEN'logtest_log'TON'D:\$SQLDatabase$\logtest_bk.LDF',NORECOVERY,NOUNLOAD,STATS= 10
GO
RESTOREDATABASE[logtest_bk]FROMDISK=N'c:\logtest_diff.bak'WITHFILE= 1,
MOVEN'logtest'TON'D:\$SQLDatabase$\logtest_bk.mdf',
MOVEN'logtest_log'TON'D:\$SQLDatabase$\logtest_bk.LDF',NORECOVERY,NOUNLOAD,STATS= 10
GO
RESTORELOG[logtest_bk]FROMDISK=N'c:\logtest_log201209192210'WITHFILE= 1,NORECOVERY,NOUNLOAD,STATS= 10
GO
RESTORELOG[logtest_bk]FROMDISK=N'c:\logtest_log_tail'WITHFILE= 1,NOUNLOAD,STATS= 10,STOPAT='2012-09-19 22:15:00'
GO
USElogtest_bk
SELECT*FROMt3
图3-1
四注意事项
1还原数据库前必须先备份日志尾巴
2.利用日志或者差异备份还原之前,必须在还原链上先还原全备。
否则会报"无法还原日志备份或差异备份,因为没有文件可用于前滚。"