当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的。你只要确保每个数据库都有正确的备份。当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时。这系列文章会告诉你每个DBA应该知道的具体细节。
这个标题有点用词不当,因为运行在大容量日志恢复模式里的数据库,我们通常是长期不管理日志。但是,DBA会考虑在大容量加载时,短期切换到大容量恢复模式。当数据库在大容量模式里运行时,一些其他例如索引重建的操作会最小化日志(minimally logged),因此在日志里会使用很小的空间。对非常大的表,当重建聚集索引时,或当大容量加载百万行的数据时,在大容量日志恢复模式里运行会减少日志空间的使用,与完整恢复模式比,可以有非常大的区别。
但是,我们应该只在完全理解它对数据库备份和恢复的影响后才使用大容量日志恢复模式。例如,在包含最小化日志操作的日志记录的日志备份,是不能恢复数据库到特定时间点的。另外,如果运行的是最小化日志模式,有尾日志会备份失败的特殊情形,当数据库运行在大容量日志模式里,在事务日志里活动部分存在的记录和数据文件会因灾难而不可用(例如磁盘故障)。
如果你不幸碰到这样的灾难,这些限制会导致数据丢失。检查下对于问题数据库服务级别协议(Service Level Agreement(SLA)),对于数据丢失的可接受级别;如果是零容忍,那是不能使用大容量日志模式,即使用于很短时间,是可接受的。相反,肯定的,如果这样的数据库需要常规的索引维护或大容量加载,那数据库所有者必须理解在完整恢复模式里,进行这些操作对数据库日志空间分配的影响。
对大多数数据库已经提过这个,切换到大容量日志恢复模式能让SQL Server对特定操作最小化日志,在与日志飞速增长的斗争中是非常有用的武器。在大多数情况下,SLA会允许足够余地让使用可接受,使用精密的计划和流程,风险会最小化。
这篇文章会谈到:
“最小化日志”是什么意思
在日志空间使用方面,最小化日志的优势
对于灾难恢复,时间点恢复和尾日志备份,最小化日志的影响
使用大容量日志恢复模式的最佳实践
最小化日志操作当数据库运行在完整恢复模式里,所有的操作都会完整日志。这表示每个日志记录存储着回滚(撤销),前滚(重做)操作描述的足够信息。在给出的完整日志的日志文件里的所有日志记录,我们有在时间轴上对数据库做出修改的完整描述。这就是说,在恢复操作期间,SQL Server可以通过每个日志记录前滚,可以把数据库恢复到日志文件里存在的任何时间点的状态。
当数据库运行在大容量日志(或简单)恢复模式里,SQL Server会最小化特定日志操作。在一些明显最小化日志操作(BULK INSERT,bcp或索引重建)都是,其他不是。例如,在SQL Server 2008和后续版本,INSERT……SELECT在某些情况下会是最小化日志操作。(点击了解更多:https://msdn.microsoft.com/zh-cn/library/ms191244%28v=sql.100%29.aspx)
这里你会找到SQL Server会最小化日志的操作的所有清单:https://msdn.microsoft.com/zh-cn/library/ms191244.aspx 一些更通用的如下:
大容量加载操作——例如通过SSIS,bcp或BULK INSERT
SELECT INTO操作
创建和重建索引
“可以是”最小化日志和“会是”最小化日志是不一样的,SQL Server理论上可以最小化日志,实际还是会完整日志大容量记载操作。取决于索引所在的位置和查询优化器选择的计划。主要是可恢复性需要,SQL Server只最小化日志大容量数据加载的,那是分配新区。例如,如果我们进行大容量加载到已有一些数据的聚集索引,加载会包含增加页,分页,分配新页的混合操作,因此SQL Server不能最小化日志。同理,对SQL Server是可以最小化插入表,但插入非聚集索引是完整日志。来看数据加载性能指导白皮书来进一步了解(https://msdn.microsoft.com/en-us/library/dd425070.aspx)。
在线帮助描述最小化日志为“只记录事务需要恢复的信息,不支持时间点恢复”。同理,Kalen Delaney,在她的书里,《SQL Server 2008内核剖析与故障排除》(第4章,第199页),定义最小化日志操作为“日志只记录事务回滚的足够信息,不不支持时间点恢复”。
为了理解什么是用来“最小化日志”操作的区别,取决于数据库是否使用完整或大容量日志恢复模式。我们来验证下!
数据和备份文件位置