SQL Server 的事务日志是会不断的增加的,所以为了提高数据库运行效率并且节省数据库所在服务器的存储空间,需要定期来清理和收缩数据库的事务日志。
手动收缩日志的操作有些繁琐和不可控,可以用数据库的作业来定时执行收缩脚本。
脚本
在 SQL Server 2008 及其更高的版本中日志就必须在 简单模式 下进行,等清除动作完毕再调回到 完全模式 。
USE [master]
GO
ALTER DATABASE 数据库名 SET RECOVERY SIMPLE WITH NO_WAIT
GO
-- 简单模式
ALTER DATABASE 数据库名 SET RECOVERY SIMPLE
GO
USE 数据库名
GO
-- 收缩日志
-- test_demo_log 为数据库日志文件逻辑名
DBCC SHRINKFILE(N'test_demo_log' , 10, TRUNCATEONLY)
GO
USE [master]
GO
ALTER DATABASE 数据库名 SET RECOVERY FULL WITH NO_WAIT
GO
-- 还原为完全模式
ALTER DATABASE 数据库名 SET RECOVERY FULL
GO
作业
新建作业
添加步骤
添加计划
查看作业
调试执行
右击选择“作业开始步骤”,作业立刻执行,如下图
当作业执行成功后,查看对应数据库的属性,在【文件】页下(如下图),可以看到对应数据库日志文件已经收缩成功。
问题
日志文件异常大无法收缩
如果日志文件异常大,且收缩的时候无法收缩,这个时候,需要查看是否有未提交或者回滚的事务。
执行DBCC OPENTRAN 命令,查看是否有很早运行的事务(消息中显示的有事务开始时间),显示出来的都表示该事务没有提交或回滚所以一直导致MinLSN无法前滚。
如果有这种的话,可以两种方法,一通过信息显示的进程号,杀掉该进程。kill 进程号;(当然重启SQL服务也行,如果允许停机操作的话);
如果没有长时间未关闭的事务, 简单模式: 先备份数据库,然后执行BACKUP LOG 数据库名称 WITH NO_LOG 完整模式: 如果没有进行过完整备份,先进行一次完整备份,然后再备份日志文件,最后执行 DBCC SHRINKFILE (N’日志文件逻辑名称’ , 0, TRUNCATEONLY)只收缩日志文件。