SQL Server中结备份尾日志的两种方法
1.概念:
在DB_1处做了完整备份,并且接下来两次分别做了两次日志备份(Log_1和Log_2),在Log_2备份完不久服务器由于数据所在磁盘损坏。这时如果日志文件完 好,则可以通过备份尾部日志(Tail of log)后,从DB_1开始恢复,依次恢复Log_1,Log_2,尾部日志来将数据库恢复到灾难发生时的时间点。理论上可以使数据的损失为0。
2.具体操作
CREATE DATABASE MC67 GO USE MC67 GO CREATE TABLE INFO( ID INT IDENTITY(1,1), CONTENT NVARCHAR(200) ) GO --做一次完整备份 BACKUP DATABASE MC67 TO DISK='F:MC67_FULL.BAK' WITH INIT GO --插入数据 INSERT INTO INFO VALUES('完整备份后插入的数据..') INSERT INTO INFO VALUES('完整备份后插入的数据..') INSERT INTO INFO VALUES('完整备份后插入的数据..') GO --备份事务日志 BACKUP LOG MC67 TO DISK='F:MC67_LOG.TRN' GO --再次插入数据 INSERT INTO INFO VALUES('日志备份后插入的数据..') INSERT INTO INFO VALUES('日志备份后插入的数据..')
突然,就在此时,disaster 发生了,卧槽(我把服务停掉了,删除mdf 主数据库,模拟灾难~~~)
这个时候,你需要做的事情是:冷静,然后继续往往下看
--备份尾部日志。
USE master GO BACKUP LOG MC67 TO DISK='F:TESTMC67_TAIL.TRN' WITH INIT, NO_TRUNCATE --必须指定NO_TRUNCATE,没有这个option,你备份不了 GO --然后依次恢复 RESTORE DATABASE MC67_NEW FROM DISK='F:MC67_FULL.BAK' WITH NORECOVERY, MOVE 'MC67' TO 'F:TESTMC67.MDF', MOVE 'MC67_LOG' TO 'F:TESTMC67_LOG.LDF' GO RESTORE LOG MC67_NEW FROM DISK='F:MC67_LOG.TRN' WITH NORECOVERY GO RESTORE LOG MC67_NEW FROM DISK='F:TESTMC67_TAIL.TRN' WITH RECOVERY --测试 USE MC67_NEW GO SELECT * FROM INFO
结果:终于拨开云雾见天日了……
方法二
更糟糕的事情发生了:
此时由于各种原因,所处的SQL Server实例也崩溃,无法通过T-SQL来备份结尾日志。此时数据库文件损坏,而事务日志文件保持正确
假设情况和上面例子一样,此时我手里有一个完整备份(MC67_FULL.BAK)和一个日志备份(MC67_log1.TRN),还有一个日志文件(ldf)。
解决步骤:
1. 这时我将这几个文件拷贝到其他拥有SQL Server实例的机器上。
2.新建一个和原数据库名一样的数据库。设置为脱机状态。
3. 删除新建数据库的MDF文件。
4.将需要备份的数据库的日志文件替换掉原有的LDF文件。
5.此时直接备份结尾日志
总结:这是小弟看了大牛的博客园后,亲自实践和总结,你可以看我的,也可以看大牛源博客http://www.cnblogs.com/CareySon/archive/2012/02/23/2365006.html
ps:希望你在日常的工作中,不会用到这招.....