我们有一组相当复杂的存储过程,它们以全天候计划处理事务队列。这些脚本使用许多打印语句来记录正在执行的操作以帮助调试。
我想在生产中运行时保留此信息(作为 SQL Server 代理作业),以帮助在出现问题时进行故障排除。我看过这个网站,它有一个相当好的保存打印输出的方法,但它也有一些缺点(在脚本完成之前输出不可用等)。它还需要我没有经验的 SSIS 或 DTS。
我想过将所有打印语句更改为将语句插入到日志表中。问题是我们需要调试信息的大部分工作都在事务控制之下,如果出现错误,所有日志信息都将与实际事务一起回滚。
有没有人有更好的解决方案或如何使用我在上面看到的任何一个解决方案的想法?
我们正在运行 SQL Server 2016 企业版,我正在进行一些故障排除,以了解为什么我的警报不起作用(结果是有人在 SQL Server 启动中添加了 -n 参数)。在故障排除过程中,我注意到许多具有高严重性(> = 18)的内置消息未设置为记录到事件日志中。
use master;
select * from sys.messages
where severity >= 18 and language_id = 1033 and is_event_logged = 0
Run Code Online (Sandbox Code Playgroud)
消息ID | 语言_id | 严重程度 | 已记录事件 | 文本 |
---|---|---|---|---|
21 | 1033 | 20 | 0 | 警告:致命错误 %d 于 %S_DATE 发生。请记下错误和时间,并联系您的系统管理员。 |
565 | 1033 | 18 | 0 | 编译查询时服务器中发生堆栈溢出。请简化查询。 |
613 | 1033 | 21 | 0 | 在数据库 %d 中找不到分区 ID 为 %I64d 的工作表行集条目。 |
669 | 1033 | 22 | 0 | 行对象不一致。请重新运行查询。 |
683 | 1033 | 22 | 0 | 尝试在可变长度和固定长度十进制格式之间进行转换时发生内部错误。运行 DBCC CHECKDB 以检查是否有任何数据库损坏。 |
684 | 1033 | 22 | 0 | 尝试在压缩和未压缩存储格式之间进行转换时发生内部错误。运行 DBCC CHECKDB … |