

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 CloudWatch Database Insights 分析 Amazon Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 的鎖定樹
<a name="Database-Insights-Lock-Analysis"></a>

若要對鎖定造成的效能問題進行故障診斷，您可以使用下列方法，使用 CloudWatch Database Insights 分析 Amazon Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 資料庫的鎖定樹。
+ **配量依據**下拉式清單 – 在**資料庫負載**圖表中，選擇**封鎖物件**、**封鎖工作階段**或**封鎖 SQL** 維度，以檢視主要阻礙因子如何隨時間推移影響資料庫負載。使用資料庫負載圖表，您可以分析主要阻礙因子是恆定存在還是頻繁變動。然後，可以對阻礙因子進行疑難排解。  
![\[在配量依據下拉式清單中選取封鎖工作階段的主要 SQL 資料表\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/images/DBInsights_TopSQLBlocking.png)
+ **鎖分析**索引標籤 – 選擇**資料庫負載分析**，然後選擇**鎖分析**索引標籤，以檢視資料庫中的鎖爭用資訊。  
![\[資料庫載入儀表板中的鎖樹狀目錄資料表\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/images/DBInsights_LoadLockAnalysis.png)

**注意**  
CloudWatch Database Insights 支援所有 Aurora PostgreSQL 版本的鎖分析。若要分析鎖樹狀目錄，必須啟用 Database Insights 進階模式。如需如何開啟進階模式的資訊，請參閱 [Turning on the Advanced mode of Database Insights for Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_DatabaseInsights.TurningOnAdvanced.html) 和 [Turning on the Advanced mode of Database Insights for Amazon Relational Database Service](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DatabaseInsights.TurningOnAdvanced.html)

鎖分析索引標籤提供有關資料庫鎖爭用情況的資訊。鎖樹狀目錄視覺化圖形顯示來自不同工作階段的鎖請求之間的關係與相依項。

Database Insights 每 15 秒擷取一次快照。快照顯示某個時間點的資料庫鎖資料。

**注意**  
當 CloudWatch 偵測到高鎖定時，CloudWatch 會在**鎖分析**索引標籤上顯示**偵測到的高鎖定**橫幅。如果 CloudWatch 連續 15 分鐘每 15 秒拍攝鎖快照，CloudWatch 會偵測到高鎖定現象。

樹狀目錄中的每個節點代表特定工作階段。父節點是封鎖其子節點的工作階段。

若要分析鎖樹狀目錄，請依循下列程序。

**分析鎖樹狀目錄**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 選擇 **Insights**。

1. 選擇 **Database Insights**。

1. 選擇**資料庫執行個體**檢視。

1. 選擇資料庫執行個體。

1. 選擇**資料庫負載分析**索引標籤。

1. 選擇**鎖分析**索引標籤。

   若要檢視資料庫執行個體的鎖資料，請將期間設定為 1 天或更短時間。

1. 選擇快照視窗。依預設， Database Insights 會選擇具有最多封鎖工作階段的快照視窗。  
![\[鎖分析資料表\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/images/dbi_lock-analysis.png)

1. 若要檢視快照的鎖資料，請選擇 Database Insights 拍攝快照的時間。

1. 若要展開鎖樹狀目錄，請選擇工作階段 ID 旁的箭頭。  
![\[已展開鎖樹狀目錄\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudWatch/latest/monitoring/images/dbi_lock-analysis-expand.png)

## 鎖快照資料
<a name="Database-Insights-Lock-Analysis-snapshot-data"></a>

Database Insights 為每個鎖請求提供以下資訊。若要檢視預設未啟用的欄位，請選擇**鎖樹狀目錄**資料表**的設定**圖示，並啟用其他欄位。


| 欄名稱 | 定義  | 預設欄位 | 備註 | 
| --- | --- | --- | --- | 
|  `session_id`  | 唯一的工作階段識別符。 |  是  | `session_id` 衍生自 `HEX(pg_stat_activity.backend_start).HEX(pg_locks.pid)`。 | 
|  `pid`  | 此後端的 PID。 |  是  | `pg_locks.pid` | 
|  `blocked_sessions_count`  | 此鎖封鎖的工作階段數目。 |  是  | `blocked_sessions_count` 衍生自此鎖封鎖的工作階段 ID 數目。 | 
|  `last_query_executed`  | 此工作階段執行的最後一個查詢。對於封鎖程式來說，可能不是將鎖封鎖的查詢。 |  是  | `pg_stat_activity.query` | 
|  `wait_event`  | 如果後端目前正在等待，則為等待事件名稱，否則值為 NULL。 |  是  | `pg_stat_activity.wait_event` | 
|  `blocking_time_(In Seconds)`  | 此鎖定啟動以來經過的時間 (以秒為單位)。 |  是  | `blocking_time_(In Seconds)` 衍生自首位等待者等待交易 (`pg_locks.waitstart`) 的開始時間。 | 
|  `blocking_mode`  | 封鎖工作階段保留的鎖模式。 |  否  | `pg_locks.mode` | 
|  `waiting_mode`  | 等待工作階段請求的鎖模式。 |  否  | `pg_locks.mode` | 
|  `application`  | 連線至後端的應用程式名稱。 |  否  | `pg_stat_activity.application_name` | 
|  `blocking_txn_start_time`  | 封鎖交易的開始時間，如果沒有作用中的交易，則為 null。 |  否  | `pg_stat_activity.xact_start` | 
|  `waiting_start_time`  | 等待中的使用者工作階段開始等待此鎖的時間，如果保留鎖，則為 null。 |  否  | `pg_locks.waitstart` | 
|  `session_start_time`  | 使用者工作階段開始的時間。 |  否  | `pg_stat_activity.backend_start` | 
|  `state`  | 後端的狀態。 |  否  | `pg_stat_activity.state` | 
|  `wait_event_type`  | 此工作階段正在等待的等待事件類型。 |  否  | `pg_stat_activity.wait_event_type` | 
|  `last_query_exec_time`  | 上次查詢開始的時間。 |  否  | `pg_stat_activity.query_start` | 
|  `user`  | 登入此後端之使用者的名稱。 |  否  | `pg_stat_activity.usename` | 
|  `host`  | 透過對 `client_addr` 執行反向 DNS 查詢所報告的、已連線用戶端的主機名稱。此欄位僅針對 IP 連線時為非空值，且僅在 [log\$1hostname](https://www.postgresql.org/docs/current/runtime-config-logging.html#GUC-LOG-HOSTNAME) 啟用時生效。 |  否  | `pg_stat_activity.client_hostname` | 
|  `port`  | 用戶端用於與此後端通訊的 TCP 連接埠號碼；如果使用 Unix 通訊端，則為 `-1`。如果此欄位為 null，表示這是內部伺服器程序。 |  否  | `pg_stat_activity.client_port` | 
|  `client_address`  | 連線到此後端之用戶端的 IP 位址。如果此欄位為 null，表示用戶端是透過伺服器機器上的 Unix 通訊端連線，或者這是自動清空等內部程序。 |  否  | `pg_stat_activity.client_addr` | 
|  `granted`  | 如果保留鎖，值為 true；如果等待鎖，則值為 false。 |  否  | `pg_locks.granted` | 
|  `waiting_tuple`  |  頁面內鎖針對的元組編號，若目標不是元組，則為 null。  |  否  | `pg_locks.tuple` | 
|  `waiting_page`  | 關係中鎖針對的頁碼，如果目標不是關係頁面或元組，則為 null。 |  否  | `pg_locks.page` | 
|  `waiting_transaction_id`  | 鎖針對的交易的 ID，如果目標不是交易 ID，則為 null。 |  否  | `pg_locks.transactionid` | 
|  `waiting_relation`  | 鎖針對的關係的 OID，如果目標不是關係或關係的一部分，則為 null。 |  否  | `pg_locks.relation` | 
|  `waiting_object_id`  | 鎖目標在其系統目錄內的 OID，如果目標不是一般資料庫物件，則為 null。 |  否  | `pg_locks.objid` | 
|  `waiting_database_id`  | 鎖目標所在之資料庫的 OID；如果目標是共用物件，值為零；如果目標是交易 ID，則為 null。 |  否  | `pg_locks.database` | 
|  `waiting_database_name`  | 鎖目標所在之資料庫的名稱。 |  否  | `pg_stat_activity.datname` | 
|  `waiting_locktype`  | 可鎖物件的類型：relation、extend、frozenid、page、tuple、transactionid、virtualxid、spectoken、object、userlock、advisory 或 applytransaction。 |  否  | `pg_locks.locktype` | 
|  `is_fastpath`  | 若鎖是以快速路徑取得，值為 true；若鎖是從主鎖資料表取得，則值為 false。 |  否  | `pg_locks.fastpath` | 

如需 `pg_stat_activity` 和 `pg_locks` 檢視中值的詳細資訊，請參閱 PostgreSQL 文件中的下列主題。
+ [pg\$1locks](https://www.postgresql.org/docs/current/view-pg-locks.html)
+ [pg\$1stat\$1activity](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW)