当事务日志截断已多次排队但由于某些原因(可能是打开的事务、复制、当前正在运行完整备份)无法截断日志时,有什么方法可以主动通知 DBA。
考虑到客户端应用程序使用 BEGIN TRAN 启动事务并执行大量更新的场景,它未能在设定时间内获取必要的锁(因为另一个事务正在阻塞)并且超时(在 .net commandtimeout 中设置为默认 30秒并且在客户端应用程序中没有错误处理)并在 SQL Server 上留下一个打开的事务,这反过来防止日志截断。现在每次运行日志备份时,它都无法截断日志,因为您有一个打开的(已处理的)事务。我承认我们可以通过多种方式订阅日志增长事件,但想知道是否有内置于 SQL Server 中的东西在日志截断已多次排队但无法截断时发出通知。
我会从不同的角度来处理这个问题,并监控长期运行的交易。您可以使用 DMV 查询打开的交易(sys.dm_tran_active_transactions应该显示它)。这是一个查询(从Gail Shaw借用和修改),它将向您显示当前正在运行的事务:
从这里开始,我将针对 DMV 设置一个轮询作业,并在交易保持开放的时间超过可接受的时间段时提醒我。这段时间取决于您的环境。
我想我宁愿在事务日志增长时使用通知事件来使用自动增长通知,以确保它是由打开的事务引起的。