全部產品
Search
文件中心

ApsaraDB RDS:如何快速解決RDS SQL Server的阻塞問題

更新時間:Jul 17, 2024
重要

本文為阻塞問題的快速解決方案,適合緊急情況下的快速應對。如果需要從根本上解決問題,建議您確認和分析下發生阻塞的原因,根據原因制定方案解決問題。一般常見原因是缺失索引或者大事務,導致事務執行時間長,持有鎖的時間也會增加,從而引起了大量阻塞的情況。具體詳情,請參見如何處理RDS SQL Server阻塞問題

問題描述

在雲資料庫RDS SQL Server中出現阻塞情況。

問題原因

事務之間鎖資源爭搶導致出現阻塞情況。

解決方案

  1. RDS SQL Server發生鎖現象時,通過執行下面的指令碼,擷取詳細的鎖和阻塞資訊。

    SELECT dtl.request_session_id AS waitSID,
           der.blocking_session_id AS blockSID,
           dowt.resource_description,
           der.wait_type,
           dowt.wait_duration_ms,
           DB_NAME(dtl.resource_database_id) AS DB,
           dtl.resource_associated_entity_id AS waitingAssociatedEntity,
           dtl.resource_type AS waitResType,
           dtl.request_type AS waitReqType,
           dest.[text] AS waitSQL,
           dtl1.request_type AS blockReqType,
           dest1.[text] AS blockingSQL
    FROM sys.dm_tran_locks dtl
    JOIN sys.dm_os_waiting_tasks dowt ON dowt.resource_address=dtl.lock_owner_address
    JOIN sys.dm_exec_requests der ON der.session_id=dtl.request_session_id CROSS apply sys.dm_exec_sql_text(der.sql_handle) dest
    LEFT JOIN sys.dm_exec_requests der1 ON der.session_id=dowt.blocking_session_id OUTER apply sys.dm_exec_sql_text(der1.sql_handle) dest1
    LEFT JOIN sys.dm_tran_locks dtl1 ON dtl1.request_session_id=der1.session_id
  2. 執行以下命令,擷取到鎖資源資訊。

    SELECT OBJECT_NAME(i.object_id) obj,
           i.name
    FROM sys.partitions p
    JOIN sys.indexes i ON i.object_id=p.object_id
    AND i.index_id=p.index_id
    WHERE p.partition_id=[$Waiting_Associate_Entity]
    說明

    [$Waiting_Associate_Entity]為等待的資源參數值。

  3. 通過擷取的資源資訊,使用kill命令,終止掉阻塞源的會話。