我继承了一个带有 80 GB 日志的 10 GB 数据库[根据 DBCC SQLPERF(logspace),只有 3% 正在使用]。可以假设极端的日志增长是由于我被录用很久之前的问题造成的。
主服务器有一个日志传送备份作业,每 15 分钟运行一次。主服务器具有每 15 分钟运行一次的复制和恢复作业。
当我尝试收缩日志时,我得到“无法收缩日志文件 2 (DatabaseName_log),因为位于文件末尾的逻辑日志文件正在使用中。” 我已经重试了几次,间隔 15 分钟甚至几天,但总是得到相同的结果。
DBCC LOGINFO 显示 784 个 VLF,只有前 245 个,最后一个打开,状态为 2。 p_WhoIsActive 显示最长的打开事务已运行不到 2 小时(由于第三方 Microsoft,这里长时间事务并不罕见访问有 ODBC 驱动程序问题的应用程序)。
如何成功缩小此日志(不会为用户造成中断)?
谢谢,马克
解决此问题的最简单方法是将数据库设置为简单恢复,缩小日志,然后将其设置回完全恢复。在 T-SQL 中,这将是:
将数据库更改为简单恢复可能会导致事务停止复制,但如果安排在非工作时间,它应该缩小日志并返回到完全恢复而没有副作用。
如果这是不可接受的,您可以使用 sp_repldone 存储过程手动将事务标记为分布式并重置无效事务的复制状态:
您可能会运行诸如此类的脚本以每分钟尝试一次收缩操作,直到它完成或运行 1,000 次。 与往常一样,使用风险自负 - 并首先在非生产环境中进行测试。
在与网络断开连接的 VM 测试服务器上测试我的备份计划时,我正在运行备份,然后只使用了 shrink 命令。我使用 SIMPLE 恢复模式,但我仍然必须强制将数据库设置为 SIMPLE 模式,然后才能缩小我的 t-logs。结论似乎是,如果您有一个处于 SIMPLE 恢复模式的数据库,但不是 FULL,您仍然需要这些命令: ALTER DATABASE [database] SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE([logfilename], 1)