尾日志备份

尾日志备份


原文:
http://www.sqlskills.com/BLOGS/PAUL/post/Disaster-recovery-101-backing-up-the-tail-of-the-log.aspx
一旦你的数据库受损,而且你准备进行还原时,你要做的第一件事便是备份尾日志。
尾日志包含自上次日志备份以来所产生的事务日志。如果你想将你的数据库恢复至灾难发生时,你必须要获得这些日志记录,在后面的恢复中要用到。
这里需要考虑两种情况:1)服务仍然可用;2)服务已不可用。对于第一种情况,你只需要进行正规的尾日志备份即可;对于第二种情况,你需要“假载”(hack-attach)这个日志文件到其他服务上以进行尾日志备份。


情况1:服务仍然可用时备份尾日志
如果数据库受损但是服务仍然可用时,进行尾日志备份非常简单。一个例外是使用大容量日志恢复模型时,若自上次日志备份以来发生过大容量日志操作,则不能进行尾日志备份,这样你将失去自上次日志备份以来的所有的日志记录(译注:此时必须保证数据文件亦完整才能进行尾日志备份)。详细情况可以参看博文:A SQL Server DBA myth a day: (28/30) BULK_LOGGED recovery model
当数据文件受损时,如果你还是试图像平常那样备份日志,那么一定会报错。
比如,我创建一个数据库,然后进行一些事务:
CREATE DATABASE DBMaint2008;
GO
USE DBMaint2008;
GO
CREATE TABLE TestTable (C1 INT IDENTITY, C2 CHAR (100));
GO
-- 进行一次完整备份
BACKUP DATABASE DBMaint2008 TO DISK = 'D:/SQLskills/DemoBackups/DBMaint_Full.bck' WITH INIT;
GO
-- 插入一些行
INSERT INTO TestTable VALUES ('Transaction 1');
INSERT INTO TestTable VALUES ('Transaction 2');
GO
-- 进行一次日志备份
BACKUP LOG DBMaint2008 TO DISK = 'D:/SQLskills/DemoBackups/DBMaint_Log1.bck' WITH INIT;
GO
-- 再插入一些行
INSERT INTO TestTable VALUES ('Transaction 3');
INSERT INTO TestTable VALUES ('Transaction 4');
GO
现在灾难即将来临——我将执行下面的步骤来模拟灾难:
1.置数据库脱机(ALTER DATABASE DBMaint2008 SET OFFLINE )
2.删除数据文件
此时,如果试图读取数据库(置数据库联机),你会得到:
ALTER DATABASE DBMaint2008 SET ONLINE;
GO
Msg 5120, Level 16, State 101, Line 1
Unable to open the physical file "C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/DATA/DBMaint2008.mdf". Operating system error 2: "2(The system cannot find the file specified.)".
Msg 945, Level 14, State 2, Line 1
Database 'DBMaint2008' cannot be opened due to inaccessible files or insufficient memory or disk space.  See the SQL Server errorlog for details.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
现在,我像以前进行正常的日志备份:
BACKUP LOG DBMaint2008 TO DISK = 'D:/SQLskills/DemoBackups/DBMaint_Log_Tail.bck' WITH INIT;
GO
Msg 945, Level 14, State 2, Line 1
Database 'DBMaint2008' cannot be opened due to inaccessible files or insufficient memory or disk space.  See the SQL Server errorlog for details.
Msg 3013, Level 16, State 1, Line 1
BACKUP LOG is terminating abnormally.
出错了——因为数据文件已经不能存取了。这里的技巧就是使用NO_TRUNCATE选项,即使数据文件不存在也能进行日志备份。
BACKUP LOG DBMaint2008 TO DISK = 'D:/SQLskills/DemoBackups/DBMaint_Log_Tail.bck' WITH INIT, NO_TRUNCATE;
GO
Processed 2 pages for database 'DBMaint2008', file 'DBMaint2008_log' on file 1.
BACKUP LOG successfully processed 2 pages in 0.010 seconds (0.972 MB/sec).
现在,我就可以在恢复的最后阶段使用上面的尾日志,这能恢复出事务3和4。你自己试试。


情况2:服务已不可用时备份尾日志
这种情况下服务发生崩溃,且不能启动了。如果你此时还能够读取数据库的所有的数据文件和日志文件,那么你可以将这些文件附加到另外的服务上,那么灾难恢复便会自动启动了。如果你只能读取日志文件,那么就需要一些另外的步骤来备份尾日志——我称这些步骤为“假载”。
假定我还是运行上面的脚本来创建一个数据库,这次我执行下面的步骤来模拟灾难:
1.置数据库脱机(ALTER DATABASE DBMaint2008 SET OFFLINE )
2.删除数据文件
3.拷贝日志文件到其他地方
4.删除数据库(DROP DATABASE DBMaint2008 )
现在,我有一些备份文件和一个日志文件。我需要将这个日志文件附加到SQL Server数据库中以便能进行尾日志备份。步骤如下:
1.创建一个同名的“哑”数据库
2.置数据库脱机(或者关闭服务)
3.删除“哑”数据库中的所有文件。
4.将日志文件替换进来。
步骤1和2,如下:
CREATE DATABASE DBMaint2008;
GO
ALTER DATABASE DBMaint2008 SET OFFLINE;
GO
现在进行步骤3和4,此时我需要将数据库联机:
ALTER DATABASE DBMaint2008 SET ONLINE;
GO
Msg 5120, Level 16, State 101, Line 1
Unable to open the physical file "C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/DATA/DBMaint2008.mdf". Operating system error 2: "2(The system cannot find the file specified.)".
Msg 945, Level 14, State 2, Line 1
Database 'DBMaint2008' cannot be opened due to inaccessible files or insufficient memory or disk space.  See the SQL Server errorlog for details.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
现在我又可以像前面那样备份尾日志,用这个尾日志可以将数据恢复至灾难发生时。
注意 :如果我用一个较新版本的SQL Server来进行“假载”过程并不能起作用。我试着将2005的日志附加到2008数据库中,然后能正常的备份尾日志,但是这个尾日志并不能和以前的2005的备份一起使用。这是因为备份好的尾日志中的版本为655(SQL SERVER 2008),而以前备份的版本为611(SQL SERVER 2005)。当在2008上进行恢复时,要直到恢复完成才会升级数据库——所以就SQL SERVER 2008来说,我的2008版本的尾日志备份就不能用在实际上还是2005版本的数据库上。希望我已经讲清楚了。

总结
灾难恢复时,检查是否需要进行尾日志备份是非常重要的,而且做起来也不难。不管什么灾难恢复过程,要确保你事先已实践过。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值