一、问题描述:
测试环境always on集群事务日志文件撑爆了磁盘空间,SQL Server 数据库引擎 发出
9002 错误,导致数据库无法正常提供服务,那么事务日志不会像Oracle或者MySQL那样循环复写吗?原来sqlserver的在完整恢复模式下事务日志管理方式类似Oracle的归档日志,或者MySQL的binlog日志,不会自动删除;
如果SQL Server的某个数据库没有备份过事务日志,并且处于完整恢复模式或大容量日志恢复模式下,事务日志文件可能会持续增长。为了释放磁盘空间,需要进行事务日志备份,事务日志备份后,会进行事务日志截断,一旦事务日志被截断,这些空间就可以在逻辑上被复用,事务日志被截断后才可以循环复用;
如果事务日志已满,则 SQL Server 数据库引擎 会发出
9002 错误。 如果日志在数据库处于联机状态时已满,则该数据库仍会保持联机状态,但只能读取,不能更新。
事务日志文件满的原因如下所示:
- 日志未截断
- 磁盘卷已满
- 日志大小设置为固定的最大值或禁用自动增长
- 无法完成复制或可用性组同步
二、问题原因:
在完整恢复模式或大容量日志恢复模式下,事务日志的截断通常发生在事务日志备份之后。备份过程中,SQL Server会记录当前活动的日志部分,并将剩余的部分标记为可截断。
因为是测试环境,并且处于完整恢复模式,没有定期进行事务日志备份,所以事务日志不会进行截断,会一直增大,最终撑爆磁盘空间;
接下来重点介绍下事务事务日志截断和收缩;
三、处理办法:
1、备份日志
在 FULL 或 BULK_LOGGED 恢复模式下,如果最近尚未备份事务日志,则请立即进行备份以便于触发日志截断。 必须备份事务日志,以允许释放日志记录并截断日志。 如果从未备份日志,则
必须创建两个日志备份
,以允许 数据库引擎 将日志截断到上次的备份点。 截断日志可释放逻辑空间以供新的日志记录使用。 若要防止日志再次填满,请定期且更频繁地执行日志备份;
因为测试环境从来没有对事务日志进程备份,所以需要创建两个事务日志备份,以允许 数据库引擎 将日志截断到上次的备份点;
完成事务日志备份的两种方式:注意需要进行两次事务日志备份
1)命令行方式:
备份日志并截断
BACKUP LOG [数据库名] TO DISK = '备份路径' #备份事务日志,然后才能截断
2)图形化方式:
2、事务日志截断
日志截断将释放日志文件的空间(不会释放磁盘空间),以便由事务日志重新使用。 必须定期截断事务日志,防止占满分配的空间。
日志截断从 SQL Server 数据库的逻辑事务日志中删除不活动的
虚拟日志文件 (VLF),释放逻辑日志中的空间以便物理事务日志重用这些空间。 如果事务日志从不截断,它最终将填满分配给物理日志文件的所有磁盘空间。
为了避免空间不足,除非由于某些原因延迟日志截断,否则将在以下事件后自动进行截断:
- 简单恢复模式下,在检查点之后发生。每次事务提交后,不活跃的事务日志部分都会自动被截断
- 在完整恢复模式或大容量日志恢复模式下,如果自上一次备份后生成检查点,则在日志备份后进行截断(除非是仅复制日志备份)。
- 第一次使用 FULL 恢复模式创建数据库时,事务日志将根据需要重复使用(类似于 SIMPLE 恢复数据库),直到创建完整数据库备份为止。
注意:日志截断并不减小物理日志文件的大小。 若要减少物理日志文件的物理大小,则必须收缩日志文件。
3、事务日志文件收缩:
收缩事务日志文件可以减小事务日志文件使用的磁盘大小,在备份事务日志后,收缩事务日志文件,从而释放未使用的空间。但是,请注意,频繁地收缩文件可能会对性能产生负面影响
要释放由截断操作产生的未使用空间回操作系统,通常需要执行收缩操作。在SQL Server中,收缩日志文件或数据文件,从而释放不再需要的物理磁盘空间。
收缩日志文件的两种方式:
1)命令行:
USE YourDatabaseName;
GO
DBCC SHRINKFILE(YourLogFileName, TargetSize);
GO
备注:
YourDatabaseName应替换为您的数据库名称
YourLogFileName应替换为您要收缩的日志文件名称,
TargetSize应替换为您希望日志文件收缩到的大小(以MB为单位)
2)图形化:
选中需要收缩的数据库,右击选择任务---收缩----文件

选择文件类型为日志,然后选择希望收缩到的大小

总结:
1、sqlserver数据库事务日志截断:
1)简单恢复模式下,在检查点之后发生。每次事务提交后,不活跃的事务日志部分都会自动被截断;
2)完整恢复模式或大容量日志恢复模式下,如果自上一次备份后生成检查点,则在日志备份后进行截断,也就是说两次备份事务日志即可实现事务日志截断的目的;
2、事务日志截断和收缩的关系:
1)事务日志截断后,空间就可以在逻辑上被复用,事务日志被截断后才可以循环复用;
2)事务日志收缩后,事务日志文件占用的磁盘物理空间可以降低,但是只可以收缩被截断后的可以被复用的空间;
相关链接: