设为首页 加入收藏

TOP

SQL Server中的事务日志管理(5/9):完整恢复模式里的日志管理(二)
2015-11-21 01:40:55 来源: 作者: 【 】 浏览:1
Tags:SQL Server 事务 日志 管理 5/9 完整 恢复 模式
有很多方法中断日志链,如果你有意这样做,你只能恢复数据库到日志中断事件前进行的日志备份的时间点。简单来说,如果你在意恢复你数据的能力,中断日志链不是个好方法。最常见的中断日志链的2个方法包括:
?
事务日志备份文件丢失或损坏——你只能恢复到上一次正确的日志备份。日志链会在下一个正确的完整或差异备份开始。
?
切换到简单恢复模式——如果你从完整切换到简单恢复模式,这回中断日志链,因为检查点被触发,事务日志会立即截断。当你切换回完整模式,你要进行另一个完整备份来重启日志链。事实上,在你进行完整备份前,数据库还是自动截断模式,你不能备份日志文件。
?
在SQL Server 2008以前,有2个命令,叫做BACKUP LOG WITH NO_LOG和BACKUP LOG WITH TRUNCATE_ONLY(功能是一样的),当被执行时,会强制日志文件截断来中断日志链。你不应该在任何版本的SQL Server里执行这些命令,但我这里提起它们是因为当处理“失控的日志文件“时,没有理解它们会影响数据库的恢复,它们会被不小心使用。我们会在第8篇——救命,我的日志满了里详细讨论。
?
尾日志备份
?
只要你有最近的一个完整备份和一个完整的日志链,你可以恢复你的数据库到任何灾难前,存在的最后日志备份的状态。但是,假设你进行的是每小时备份一次事务日志,整点备份,当灾难发生在下午1:45。你会丢失45分钟的数据;当然,如果灾难太毁灭性,备份的事务日志不能挽回,那你会丢失大量的数据。
?
但是,有时备份的日志还是可用的,即使数据文件已损坏,如果事务文件在独立、专门的硬盘上。如果是这样的话,你应该备份现在的事务日志,例如进行自上次日志备份后,生成日志记录的最后备份。这会捕获当前日志文件里剩余日志记录,直到灾难点。这称为尾日志备份(tail log backup),是开始恢复和还原操作前的最后应该做的操作。
?
尾日志备份和最小化日志操作
?
如果由于数据库灾难,数据文件不可用,日志尾包含最小化日志操作,那是可以进行尾日志备份,因为这需要访问在数据文件里扩展的数据修改。这在第6篇——大容量日志模式里的日志管理里会详谈。
?
如果你想恢复的数据库是在线的,那尾日志备份如下:
?
1 BACKUP LOG DatabaseNameTO DISK ='FileLocation\DatabaseName_Log.bak'WITH NORECOVERY
?
NORECOVERY选项把数据库放入恢复状态并假设你下一个操作是还原。如果数据库是离线就不会开始,你还是应该尝试如刚介绍的尾日志备份(尽管NOCOVERY选项可以忽略,因为没有处理中的事务)。
?
如果你确认日式文件已损坏,微软文档建议,作为最后的方法,你用下列方法尝试进行尾日志备份:
?
1 BACKUP LOG DatabaseNameTO DISK ='FileLocation\DatabaseName_Log.bak'WITH CONTINUE_AFTER_ERROR
?
如果master数据库和数据文件已损坏,但是日志还是可用的,微软建议重建master数据库然后备份最后活动日志。但这些话题已经在这个系列文章的话题之外,我给你个文档做进一步的参考:https://msdn.microsoft.com/zh-cn/library/ms190952.aspx
?
进行恢复和还原
?
进行完尾日志备份,如果可能的话,下一步是恢复最后一次完整备份(随后是差异备份,如果需要的话),然后恢复所有一系列的备份日志文件,包括尾日志备份。对这一一系列恢复操作的基本语法如下:
?
1 RESTORE {DATABASE | LOG} DatabaseNameFROM DISK ='FileLocation\FileName.bak'WITH NORECOVERY;
?
当你恢复时如果你忽略WITH NORECOVERY选项,那么默认RESTORE命令会用WITH RECOVERY命令继续。换句话说,SQL Server会尝试数据和日志文件的一致,前滚完成的事务,然后回滚未完成的事务如果需要的话。通过指定WITH NORECOVERY,我们命令SQL Server我们进入一个还原步骤,在我们进行任何回滚前,很多操作需要前滚。在还原步骤里,恢复最后一次备份后,数据库可以如下进行恢复:
?
1 RESTORE DATABASE DatabaseName WITH RECOVERY
?
通常需要把数据库恢复到一个不同的位置,这样在恢复过程中你可以移动文件,如这里所介绍的:https://msdn.microsoft.com/zh-cn/library/ms190255.aspx
?
数据库崩溃后恢复
?
下面例子介绍如何对灾难数据库恢复的响应,数据文件已经不能访问。
?
完整恢复到失败点
?
假设由硬件导致数据库灾难后,当前日志还可以访问,那么理论上是可以把你的数据库恢复到灾难前的时间点,使用下列步骤:
?
备份尾日志
?
恢复最近的完整备份(加上差异备份,如何合适的话)
?
逐个恢复完整(或差异)备份后的每个事务日志备份,直到灾难前
?
恢复尾日志备份
?
恢复数据库上线
?
在线帮助可以找到很多从一个备份集恢复和还原演示的例子,换句话说是备份和还原在一个”设备“。实际上,这表示当备份到磁盘时,备份设备是那个磁盘上的某个.bak文件。
?
因此,例如下面代码展示的是使用包含一个备份文件和一个事务日志备份的备份,如何进行完整恢复。为了执行这个代码,首先你需要定位到TestDB数据库,再插入几条数据(方便起见,用脚本来做。)。你还需要在你的数据库服务器的本地C盘上创建”Backup“目录,或者修改到合适的文件路径。
 1 -- Perform a full backup of the Test database
 2 -- The WITH FORMAT option starts a new backup set
 3 -- Be careful, as it will overwrite any existing sets
 4 -- The full backup becomes the first file in the set
 5 BACKUP DATABASE TestDB
 6 TO DISK = 'C:\Backups\TestDB.bak'
 7 WITH FORMAT;
 8 GO
 9 
10 -- Perform a transaction log backup of the Test database
11 -- This is the second file in the set
12 BACKUP Log TestDB
13 TO DISK = 'C:\Backups\TestDB.bak'
14 GO
15 
16 -- ........
17 
18 -- The RESTORE HEADERONLY command is optional.
19 -- It simply confirms the files that comprise 
20 -- the
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SQL从入门到基础 - 02 SQLServer.. 下一篇SQL从入门到基础?03 SQLServer基..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: