我刚刚阅读了很多 MSDN 文档,我想我了解不同的恢复模型和备份链的概念。我还有一个问题:
完整数据库备份是否会截断事务日志(使用完整恢复模式)?
如果是:MSDN 中在哪里提到了这一点?我只能找到只有 BACKUP LOG 会截断日志。
如果不是:为什么?既然完整的数据库备份会启动一个新的备份链,那么将完整备份之前完成的事务保持在日志中的意义何在?
我刚刚阅读了很多 MSDN 文档,我想我了解不同的恢复模型和备份链的概念。我还有一个问题:
完整数据库备份是否会截断事务日志(使用完整恢复模式)?
如果是:MSDN 中在哪里提到了这一点?我只能找到只有 BACKUP LOG 会截断日志。
如果不是:为什么?既然完整的数据库备份会启动一个新的备份链,那么将完整备份之前完成的事务保持在日志中的意义何在?
不——绝对不是。唯一允许在 FULL 或 BULK_LOGGED 恢复模型中清除/截断日志的是日志备份 - 没有例外。不久前我有这个论点,并发布了一篇冗长而详细的博客文章,其中包含解释和脚本,您可以在围绕日志和日志备份的误解中向自己证明这一点:如何说服自己。
随时跟进更多问题。顺便说一句 - 另请参阅我为 TechNet 杂志撰写的关于了解 SQL Server 中的日志记录和恢复的长文。
谢谢
完整备份不会截断日志,您必须执行备份日志操作。完整备份不会重新设置日志链——这会完全搞砸复制/日志传送等。
您必须仔细查看 SQL Server 如何进行备份,但要知道备份中不包含运行中/长时间运行的事务(否则备份可能永远不会完成),因此说完整备份一个online-database 保证使下一个日志备份过时。
http://msdn.microsoft.com/en-us/library/ms175477.aspx
据我了解,唯一会截断事务日志的是日志备份。
完整备份仅复制足够多的日志以使其在事务上保持一致,因为备份操作需要一段时间才能完成,并且在此期间,复制的页面可能已更改。
您仍然需要日志备份以进行时间点恢复。
我没有 MSDN 可链接,但我可以将您链接到Paul Randal 的博客,他是 SQL Server 团队的开发人员,编写了 DBCC CHECKDB 和联机丛书的部分内容。
他还在这个论坛上回答了问题,所以这将是一个比我提供的第二/第三手信息更好的权威:)
人们经常对完整备份和日志备份有一个误解。为了使备份在备份恢复模式下工作,必须使用 t-logs,因为在备份期间,数据库中可能仍然存在事务(除非您在关闭数据库时
FULL
执行所谓的备份)。COLD
当数据库处于ARCHIVELOG
模式时,Oracle 使用相同的概念。备份的顺序归结为:这就是为什么 t-logs 在默认情况下不会被截断/收缩的原因,因为它们是备份阶段事务继续的重要部分。
不要将截断日志与缩小日志混淆。
TRUNCATE 是删除日志中最后一个检查点之前的事务(检查点是事务被刷新到数据库本身时)。这是使用 BACKUP 命令完成的。
缩小日志是为了减少实际的日志文件大小。这是使用 DBCC 命令完成的。
基本上您不需要每次都自动缩小事务日志,因为事务日志需要空间才能工作,如果您自动截断,它将保持几乎相同的大小。