首页 > 代码库 > 分析VTL以及利用日志备份还原数据库到指定时间

分析VTL以及利用日志备份还原数据库到指定时间

本文原整理于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-3

 

 

--at 22:03

BACKUPDATABASElogtestTODISK=‘c:\logtest_diff.bak‘WITHdifferential

DBCCloginfo

1-4

 

 

--at 22:04

SELECTTOP 10000 *INTOt3

FROMAdventureWorks.Sales.SalesOrderHeader

DBCCloginfo

1-5

 

 

 

 

--at 22:10

BACKUPLOGlogtestTODISK=‘c:\logtest_log201209192210‘--注意不要加bak后缀

DBCCloginfo--可以看到VTL被标记为可复用状态(satus=0)

1-6

 

--at 22:15 误删t3的数据表

DELETEFROMt3

DBCCloginfo

1-7

 

二利用备份链还原数据库

--需将数据库恢复到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

2-4

四附件

本次实验用sql脚本如下:

 

 

五注意事项

1还原数据库前必须先备份日志尾巴

2.利用日志或者差异备份还原之前,必须在还原链上先还原全备。

否则会报"无法还原日志备份或差异备份,因为没有文件可用于前滚。"

 

 

 

分析VTL以及利用日志备份还原数据库到指定时间