如何使用事务复制对数据库进行一次性日志收缩

Mar*_*man 2 sql-server shrink sql-server-2012 transaction-log log-shipping

我继承了一个带有 80 GB 日志的 10 GB 数据库 [根据 DBCC SQLPERF(logspace),仅使用了 3%]。假设日志的极端增长是由于我被聘用之前很久的问题似乎是安全的。

主节点有一个日志传送备份作业,每 15 分钟运行一次。主节点具有每 15 分钟运行一次的复制和还原作业。

当我尝试缩小日志时,我收到“无法缩小日志文件 2 (DatabaseName_log),因为位于文件末尾的逻辑日志文件正在使用中”。我已经间隔 15 分钟甚至几天重试了几次,但总是得到相同的结果。

DBCC LOGINFO 显示 784 个 VLF,只有前 245 个和最后一个 on,状态为 2。 p_WhoIsActive 显示最长的打开事务已运行不到 2 小时(由于第三方 Microsoft访问具有 ODBC 驱动程序问题的应用程序)。

如何成功缩小此日志(而不为用户造成中断)?

谢谢,马克

dar*_*onw 7

解决此问题的最简单方法是将数据库设置为简单恢复,缩小日志,然后将其设置回完全恢复。在 T-SQL 中,这将是:

ALTER DATABASE [database] SET RECOVERY SIMPLE WITH NO_WAIT
DBCC SHRINKFILE([logfilename], 1)
ALTER DATABASE [database] SET RECOVERY FULL WITH NO_WAIT
Run Code Online (Sandbox Code Playgroud)

将数据库更改为简单恢复可能会导致事务停止复制,但如果安排在非工作时间,它应该缩小日志并返回到没有副作用的完全恢复。

如果这是不可接受的,您可以使用 sp_repldone 存储过程手动将事务标记为分布式并重置无效事务的复制状态:

EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0,    @time = 0, @reset = 1
Run Code Online (Sandbox Code Playgroud)