SQL Server 的事务日志是会不断的增加的,所以为了提高数据库运行效率并且节省数据库所在服务器的存储空间,需要定期来清理和收缩数据库的事务日志。
手动收缩日志的操作有些繁琐和不可控,可以用数据库的作业来定时执行收缩脚本。

脚本

在 SQL Server 2008 及其更高的版本中日志就必须在 简单模式 下进行,等清除动作完毕再调回到 完全模式

  1. USE [master]
  2. GO
  3. ALTER DATABASE 数据库名 SET RECOVERY SIMPLE WITH NO_WAIT
  4. GO
  5. -- 简单模式
  6. ALTER DATABASE 数据库名 SET RECOVERY SIMPLE
  7. GO
  8. USE 数据库名
  9. GO
  10. -- 收缩日志
  11. -- test_demo_log 为数据库日志文件逻辑名
  12. DBCC SHRINKFILE(N'test_demo_log' , 10, TRUNCATEONLY)
  13. GO
  14. USE [master]
  15. GO
  16. ALTER DATABASE 数据库名 SET RECOVERY FULL WITH NO_WAIT
  17. GO
  18. -- 还原为完全模式
  19. ALTER DATABASE 数据库名 SET RECOVERY FULL
  20. GO

作业

新建作业

image.png

添加步骤

image.png

添加计划

image.png

查看作业

新增成功后,可以看到在作业里面有对应名称的作业(如下图)
image.png

调试执行

右击选择“作业开始步骤”,作业立刻执行,如下图
image.png
当作业执行成功后,查看对应数据库的属性,在【文件】页下(如下图),可以看到对应数据库日志文件已经收缩成功。
image.png

问题

日志文件异常大无法收缩

如果日志文件异常大,且收缩的时候无法收缩,这个时候,需要查看是否有未提交或者回滚的事务。
执行DBCC OPENTRAN 命令,查看是否有很早运行的事务(消息中显示的有事务开始时间),显示出来的都表示该事务没有提交或回滚所以一直导致MinLSN无法前滚。
如果有这种的话,可以两种方法,一通过信息显示的进程号,杀掉该进程。kill 进程号;(当然重启SQL服务也行,如果允许停机操作的话);
如果没有长时间未关闭的事务, 简单模式: 先备份数据库,然后执行BACKUP LOG 数据库名称 WITH NO_LOG 完整模式: 如果没有进行过完整备份,先进行一次完整备份,然后再备份日志文件,最后执行 DBCC SHRINKFILE (N’日志文件逻辑名称’ , 0, TRUNCATEONLY)只收缩日志文件。