

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

# 使用 Amazon DevOps Guru 主動洞察，調校 RDS for PostgreSQL
<a name="PostgreSQL.Tuning_proactive_insights"></a>

DevOps Guru 主動洞察會偵測可能在 RDS for PostgreSQL 資料庫執行個體 上造成問題的狀況，並在發生問題前即讓您了解狀況。主動式洞察可以提醒您交易連線中長時間執行的閒置。如需在交易連線中對長時間執行閒置進行疑難排解的詳細資訊，請參閱 [資料庫在交易連線中長時間閒置](#proactive-insights.idle-txn)

DevOps Guru 可以執行下列動作：
+ 透過交叉檢查一般建議設定與您的資料庫設定，避免許多常見的資料庫問題。
+ 警告您機群內的重大問題，若未勾選，可能導致更嚴重的問題。
+ 提醒您新發現的問題。

每個主動洞察都包含問題原因分析和修正動作建議。

如需 Amazon DevOps Guru for Amazon RDS 的詳細資訊，請參閱 [使用 Amazon DevOps Guru for Amazon RDS 分析效能異常](devops-guru-for-rds.md)。

## 資料庫在交易連線中長時間閒置
<a name="proactive-insights.idle-txn"></a>

資料庫的連線已經超過 1800 秒都處在 `idle in transaction` 狀態。

**Topics**
+ [支援的引擎版本](#proactive-insights.idle-txn.context.supported)
+ [Context](#proactive-insights.idle-txn.context)
+ [造成此問題的可能原因](#proactive-insights.idle-txn.causes)
+ [動作](#proactive-insights.idle-txn.actions)
+ [相關指標](#proactive-insights.idle-txn.metrics)

### 支援的引擎版本
<a name="proactive-insights.idle-txn.context.supported"></a>

所有版本的 RDS for PostgreSQL 皆支援此洞察資訊。

### Context
<a name="proactive-insights.idle-txn.context"></a>

`idle in transaction` 狀態的交易可以擁有封鎖其他查詢的鎖定。也可以防止 `VACUUM` (包含自動清空) 清理無效資料列，導致索引或資料表膨脹，或導致交易 ID 包圍。

### 造成此問題的可能原因
<a name="proactive-insights.idle-txn.causes"></a>

尚未使用 COMMIT、ROLLBACK 或 END 命令，關閉以 BEGIN 或 START TRANSACTION 在互動式工作階段中啟動的交易。這會導致交易移至 `idle in transaction` 狀態。

### 動作
<a name="proactive-insights.idle-txn.actions"></a>

您可以透過查詢 `pg_stat_activity`，找出閒置的交易。

請在您的 SQL 用戶端中執行下列查詢，以列出 `idle in transaction` 狀態的所有連線，並按持續時間排序：

```
SELECT now() - state_change as idle_in_transaction_duration, now() - xact_start as xact_duration,* 
FROM  pg_stat_activity 
WHERE state  = 'idle in transaction'
AND   xact_start is not null
ORDER BY 1 DESC;
```

根據洞察的原因，我們會建議不同的動作。

**Topics**
+ [End 交易](#proactive-insights.idle-txn.actions.end-txn)
+ [終止連線](#proactive-insights.idle-txn.actions.end-connection)
+ [設定 idle\$1in\$1transaction\$1session\$1timeout 參數](#proactive-insights.idle-txn.actions.parameter)
+ [檢查 AUTOCOMMIT 狀態](#proactive-insights.idle-txn.actions.autocommit)
+ [檢查應用程式程式碼中的交易邏輯](#proactive-insights.idle-txn.actions.app-logic)

#### End 交易
<a name="proactive-insights.idle-txn.actions.end-txn"></a>

使用 BEGIN 或 START TRANSACTION 在互動式工作階段中啟動交易時，該筆交易會移至 `idle in transaction` 狀態。交易會保持在此狀態，直到您發出 COMMIT、ROLLBACK、END 命令結束交易，或完全斷開連線以轉返結束交易。

#### 終止連線
<a name="proactive-insights.idle-txn.actions.end-connection"></a>

使用以下查詢，終止與閒置交易的連線：

```
SELECT pg_terminate_backend(pid);
```

pid 是連線的程序 ID。

#### 設定 idle\$1in\$1transaction\$1session\$1timeout 參數
<a name="proactive-insights.idle-txn.actions.parameter"></a>

在新的參數群組中設定 `idle_in_transaction_session_timeout` 參數。設定此參數的優點在於，不需要手動介入即可終止長時間閒置的交易。如需此參數的詳細資訊，請參閱 [PostgreSQL 文件](https://www.postgresql.org/docs/current/runtime-config-client.html)。

當交易處於 idle\$1in\$1transaction 狀態超過指定時間時，PostgreSQL 日誌檔會在連線終止之後報告下列訊息。

```
FATAL: terminating connection due to idle in transaction timeout
```

#### 檢查 AUTOCOMMIT 狀態
<a name="proactive-insights.idle-txn.actions.autocommit"></a>

根據預設，AUTOCOMMIT 為啟用狀態。但是，若客戶端意外將其關閉，請確認重啟。
+ 在 psql 用戶端執行下列命令：

  ```
  postgres=> \set AUTOCOMMIT on
  ```
+ 在 pgadmin 中，從向下箭頭選擇 AUTOCOMMIT 選項以將其開啟。  
![\[在 pgadmin 中，選擇 AUTOCOMMIT 將其開啟。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/apg-insight-pgadmin-autocommit.png)

#### 檢查應用程式程式碼中的交易邏輯
<a name="proactive-insights.idle-txn.actions.app-logic"></a>

調查應用程式邏輯，找出可能的問題。考慮下列動作：
+ 檢查 JDBC 自動遞交是否在您的應用程式中設為 true。另外，請考慮在程式碼中使用明確的 `COMMIT` 命令。
+ 檢查錯誤處理邏輯，確認其是否會在發生錯誤後關閉交易。
+ 檢查交易開啟時，您的應用程式是否需要長時間處理查詢傳回的資料列。若是如此，請考慮對應用程式進行編碼，在處理資料列之前關閉交易。
+ 檢查交易是否包含許多長時間執行的操作。若是如此，請將單一交易分割為多筆交易。

### 相關指標
<a name="proactive-insights.idle-txn.metrics"></a>

下列 PI 指標與此洞察相關：
+ idle\$1in\$1transaction\$1count - 處於 `idle in transaction` 狀態的工作階段數量。
+ idle\$1in\$1transaction\$1max\$1time - 處於 `idle in transaction` 狀態的最長時間執行交易。