前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL Server巡检

SQL Server巡检

作者头像
保持热爱奔赴山海
发布2023-07-05 11:05:57
2530
发布2023-07-05 11:05:57
举报
文章被收录于专栏:数据库相关

之前有几台sql server 只有最基础的主机监控,db层面的监控基本为0。

这里简单的补充几个,用python包装一下即可集成到数据库巡检任务平台。

查询锁等待

代码语言:javascript
复制
        use master;
        WITH CTE_SID ( BSID, SID, sql_handle,name )        
            AS ( SELECT a.[Blocking_Session_ID],
                        a.[Session_ID] ,
                                a.sql_handle,
                                bb.name
                        FROM     sys.dm_exec_requests a inner join sys.sysdatabases bb on a.database_id = bb.dbid
                        WHERE    a.[Blocking_Session_ID] <> 0
                        UNION ALL
                        SELECT   A.[Blocking_Session_ID] ,
                                A.[Session_ID] ,
                                A.sql_handle,
                                bb.name
                        FROM     sys.dm_exec_requests A inner join sys.sysdatabases bb on a.database_id = bb.dbid
                                JOIN CTE_SID B ON A.[Session_ID] = B.BSID
                )
            SELECT C.BSID,
                    C.SID ,
                    S.login_name ,
                    S.host_name ,
                    S.status ,
                    S.cpu_time ,
                    S.memory_usage ,
                    S.last_request_start_time ,
                    S.last_request_end_time ,
                    S.logical_reads ,
                    S.row_count ,
                    q.text,
                    c.name
            FROM CTE_SID C
                    JOIN sys.dm_exec_sessions S ON C.sid = s.[Session_ID]
                    CROSS APPLY sys.dm_exec_sql_text(C.sql_handle) Q
            ORDER BY sid ;
            
            
一些列含义的说明:
BSID  # 持有锁的sessionID
SID    # 等待锁的sessionID
login_name   # 被阻塞的用户名
host_name  # 被阻塞的用户地址
text =  # 具体的被阻塞的SQL
dbname =  # 阻塞发生的数据库           

查询锁等待的根因会话:

代码语言:javascript
复制
select CN.*,ST.text 
from sys.dm_exec_connections CN 
CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST 
where CN.session_id = ${上一步查出来的BSID}

用python处理下,大致这样,还可以优化下通过钉钉告警出来:

SQL Server巡检_sql server
SQL Server巡检_sql server

长事务巡检:

代码语言:javascript
复制
SELECT  
        SS.session_id,
        SS.login_time,
        SS.program_name,
        ST.transaction_id AS TransactionID ,  
                DB_NAME(DT.database_id) AS DatabaseName ,  
                AT.transaction_begin_time AS TransactionStartTime ,  
                DATEDIFF(minute, AT.transaction_begin_time, GETDATE()) AS Tran_run_minutes ,  
                CASE AT.transaction_type  
                    WHEN 1 THEN 'Read/Write Transaction'  
                    WHEN 2 THEN 'Read-Only Transaction'  
                    WHEN 3 THEN 'System Transaction'  
                    WHEN 4 THEN 'Distributed Transaction'  
                END AS TransactionType ,  
                CASE AT.transaction_state  
                    WHEN 0 THEN 'Transaction Not Initialized'  
                    WHEN 1 THEN 'Transaction Initialized & Not Started'  
                    WHEN 2 THEN 'Active Transaction'  
                    WHEN 3 THEN 'Transaction Ended'  
                    WHEN 4 THEN 'Distributed Transaction Initiated Commit Process'  
                    WHEN 5 THEN 'Transaction in Prepared State & Waiting Resolution'  
                    WHEN 6 THEN 'Transaction Committed'  
                    WHEN 7 THEN 'Transaction Rolling Back'  
                    WHEN 8 THEN 'Transaction Rolled Back'  
                END AS TransactionState  
        FROM    sys.dm_tran_session_transactions AS ST  
                INNER JOIN sys.dm_tran_active_transactions AS AT ON ST.transaction_id = AT.transaction_id  
                INNER JOIN sys.dm_tran_database_transactions AS DT ON ST.transaction_id = DT.transaction_id  
                INNER join sys.dm_exec_sessions AS SS on SS.session_id = ST.session_id
        WHERE DATEDIFF(minute, AT.transaction_begin_time, GETDATE())> 5 -- 找出运行时间大于5分钟的事务
        ORDER BY TransactionStartTime  

用python处理下,大致这样,还可以优化下通过钉钉告警出来:

SQL Server巡检_锁等待_02
SQL Server巡检_锁等待_02
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档