SQL Server中结备份尾日志的两种方法

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:\TEST\MC67_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:\TEST\MC67.MDF', MOVE 'MC67_LOG' TO 'F:\TEST\MC67_LOG.LDF' GO RESTORE LOG MC67_NEW FROM DISK='F:\MC67_LOG.TRN' WITH NORECOVERY GO RESTORE LOG MC67_NEW FROM DISK='F:\TEST\MC67_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:希望你在日常的工作中,不会用到这招.....

 

posted @ 2015-10-08 10:54  咕-咚  阅读(4118)  评论(0编辑  收藏  举报