如何查看Azure SQL Database异常日志?生产库近72小时查询方案
如何获取Azure SQL Database过去72小时的异常日志(含触发SQL语句)
嘿,我来帮你搞定这个需求——要抓取生产环境Azure SQL Database过去72小时的所有异常日志,包括完整性约束冲突、死锁这类问题,还得带上触发异常的SQL语句对吧?下面给你两种方案,优先推荐用SQL查询直接获取,也给出门户操作的步骤:
一、优先方案:SQL查询直接提取异常日志
Azure SQL Database提供了系统视图和动态管理函数来查询这些事件,分两类场景处理:
1. 通用异常查询(约束冲突、语法错误等)
使用sys.event_log系统视图,它记录了数据库级的错误事件,我们可以筛选过去72小时的错误,并提取关键信息:
SELECT timestamp AS 异常时间戳, event_type AS 事件类型, error_number AS 错误编号, message AS 错误信息, statement AS 引发异常的SQL语句, username AS 执行用户 FROM sys.event_log WHERE event_type = 'error' AND timestamp >= DATEADD(HOUR, -72, GETUTCDATE()) ORDER BY timestamp DESC;
小贴士:
sys.event_log的日志默认保留7天,完全覆盖72小时的需求。如果需要长期留存日志,得提前配置诊断设置,把日志导出到存储账户或Log Analytics工作区。
2. 死锁专项查询
死锁的信息需要用sys.dm_db_deadlock_events动态管理视图,它会记录最近的死锁事件(默认保留约100条),结合sys.dm_exec_sql_text可以提取死锁涉及的SQL语句:
WITH DeadlockInfo AS ( SELECT deadlock_graph, timestamp AS 死锁发生时间 FROM sys.dm_db_deadlock_events WHERE timestamp >= DATEADD(HOUR, -72, GETUTCDATE()) ) SELECT di.死锁发生时间, CAST(di.deadlock_graph AS XML) AS 死锁详细图, st.text AS 死锁涉及的SQL语句 FROM DeadlockInfo di CROSS APPLY sys.dm_exec_sql_text(XML_VALUE(di.deadlock_graph, '//resource-list/object/@objectid')) st ORDER BY di.死锁发生时间 DESC;
小技巧:死锁图是XML格式,你可以把它复制到SQL Server Management Studio(SSMS)的「死锁图」窗口,就能看到可视化的死锁流程,排查起来更直观。
二、备选方案:通过Azure门户查看异常日志
如果不想写SQL,也可以通过Azure门户的日志功能查询:
- 登录Azure门户,找到你的目标Azure SQL Database。
- 在左侧菜单的监控分组下,点击日志(如果还没启用诊断设置,系统会提示你先配置,记得勾选
SQLDatabaseAuditLogs和SQLDatabaseErrorLogs,并选择导出到Log Analytics工作区)。 - 在日志查询编辑器中,输入以下Kusto查询语句筛选过去72小时的异常:
SQLDatabaseErrorLogs | where TimeGenerated >= ago(72h) | where ErrorMessage != "" | project TimeGenerated, ErrorMessage, SqlText, ErrorNumber | order by TimeGenerated desc - 点击「运行」即可看到结果,还可以导出为CSV或Excel格式保存。
针对死锁日志,需要查询
Deadlocks表:Deadlocks | where TimeGenerated >= ago(72h) | project TimeGenerated, DeadlockGraph, AffectedSqlCommands | order by TimeGenerated desc
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

