

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

# 故障診斷 Aurora MySQL 資料庫記憶體不足的問題
<a name="AuroraMySQLOOM"></a>

當 Aurora MySQL 資料庫執行個體的記憶體嚴重不足時，作業系統可以終止資料庫程序，導致意外重新啟動。為了協助防止這些重新啟動，Aurora MySQL 包含記憶體管理功能，可監控系統記憶體，並在記憶體不足時採取自動復原動作。這些動作有助於防止資料庫因記憶體耗盡而無法使用。

下列參數控制此行為：
+ `aurora_enable_memory_management` – 僅適用於 Aurora MySQL 8.4。
  + 當 `ON`（預設） 時，Aurora 會自動管理記憶體復原動作，並忽略 `aurora_oom_response` 參數。
  + 設定為 `OFF`以透過 手動控制復原動作`aurora_oom_response`。
+ `aurora_oom_response` – 以逗號分隔的復原動作清單。空字串會停用所有動作。適用於 Aurora MySQL 第 3 版。也可在 Aurora MySQL 8.4 中使用，但只有在 `aurora_enable_memory_management` 設定為 時才會考慮。 `OFF`

## OOM 回應動作
<a name="AuroraMySQLOOM.actions"></a>

下列動作可以包含在 中`aurora_oom_response`，列出從最低到最積極的動作。


| Action | 它的功能 | 備註 | 
| --- | --- | --- | 
| print | 記錄記憶體密集型查詢和錯誤日誌的連線。不會終止任何查詢或連線。 | 適用於 Aurora MySQL 第 3 版和第 8.4 版。 | 
| tune | 將內部資料表快取 (table\_open\_cache、table\_definition\_cache) 縮減為可用記憶體。當記憶體恢復正常時，快取大小會還原。先前快取的項目不會還原；只有在後續查詢存取項目時才會新增項目。 | 適用於 Aurora MySQL 第 3 版和第 8.4 版。僅限佈建的執行個體 – Serverless v2 不支援。 | 
| tune\_buffer\_pool | 將 InnoDB 緩衝集區縮減為可用記憶體。當記憶體恢復正常時，會還原緩衝集區大小。之前移出的快取頁面不會自動重新載入；只有在後續查詢存取新頁面時，才會快取新頁面。 | 僅限 Aurora MySQL 第 3 版 (3.06 及更高版本） 和 Aurora MySQL 8.4。僅在具有 2 個 vCPUs佈建執行個體上支援。Serverless v2 不支援。 | 
| decline | 記憶體不足時，拒絕出現錯誤的新查詢。 | 適用於 Aurora MySQL 第 3 版和第 8.4 版。 | 
| kill\_query | 終止執行中的SELECT查詢，從最高的記憶體取用者開始，直到記憶體恢復正常為止。DDL、其他 DML 和交易不受影響。 | 適用於 Aurora MySQL 第 3 版和第 8.4 版。互斥 kill\_connect- 如果兩者都設定，則只會kill\_connect啟用 。 | 
| kill\_connect | 終止使用者連線、轉返其作用中的交易，以及終止 DDL 陳述式。 | 請參閱以下版本特定的行為。 | 

**重要**  
您必須在 `aurora_oom_response` 參數值中與 `kill_query` 或 `kill_connect` 配對 `tune_buffer_pool`。如果沒有這些項目，即使`tune_buffer_pool`包含緩衝集區大小，也不會發生緩衝集區大小調整。

### kill\_connect 版本特定的行為
<a name="AuroraMySQLOOM.actions.kill_connect"></a>


| Aurora MySQL version | Behavior (行為) | 
| --- | --- | 
| Aurora MySQL 3.04 – Aurora MySQL 3.10 | 終止使用者連線以釋出足夠的記憶體，讓資料庫從記憶體壓力中復原。 | 
| Aurora MySQL 3.11\+、Aurora MySQL 8.4 | 終止使用者連線以釋出足夠的記憶體，讓資料庫從記憶體壓力中復原。也會終止嘗試在記憶體壓力期間配置記憶體的任何使用者連線。 | 

在 Serverless v2 上，Aurora 會先擴展 ACUs 來回應記憶體壓力，以提供額外的記憶體。如果擴展進行中時記憶體壓力持續存在，Aurora 可能會終止現有的連線以復原記憶體。只有在執行個體已達到其設定的最大 ACU 限制且無法再進一步擴展時，才會終止嘗試配置記憶體的連線。

## 依版本的預設值
<a name="AuroraMySQLOOM.defaults"></a>

Aurora MySQL `aurora_oom_response`會根據引擎版本、執行個體類型和可用的記憶體自動設定 。

在 Aurora MySQL 8.4 中，當 `aurora_enable_memory_management`為 `ON`（預設值） 時，Aurora 會自動管理記憶體復原動作，而且不會使用 `aurora_oom_response`值。設為 時`OFF`，Aurora 會直接使用 值，該`aurora_oom_response`值預設為空白 – 表示除非您明確設定，否則不會採取任何復原動作。下列預設值資料表僅適用於 Aurora MySQL 第 3 版。

**小型執行個體閾值：**3.04 和 3.05 版為 ≤2 GiB。3.06 版和更新版本 ≤4 GiB。

**大型執行個體閾值：**3.04 和 3.05 版 >2 GiB。3.06 版和更新版本 >4 GiB。


| 版本 | 執行個體大小 | 佈建 | 無伺服器 v2 | 
| --- | --- | --- | --- | 
| Aurora MySQL 3.04–Aurora MySQL 3.05 | 小型 | print,tune | print | 
|  | 大型 | 已停用 | 已停用 | 
| Aurora MySQL 3.06 | 小型 | print,tune,decline,kill\_connect | print | 
|  | 大型 | 已停用 | 已停用 | 
| Aurora MySQL 3.07 | 小型 | print,tune,decline,kill\_connect | print | 
|  | 大型 | print | print | 
| Aurora MySQL 3.08 | 小型 | print,tune,tune\_buffer\_pool,decline,kill\_connect | print | 
|  | 大型 | print | print | 
| Aurora MySQL 3.09–Aurora MySQL 3.10 | 小型 | print,tune,tune\_buffer\_pool,decline,kill\_connect | print | 
|  | 大型 | print,decline,kill\_connect | print,decline,kill\_connect | 
| Aurora MySQL 3.11\+ | 小型 | print,tune,tune\_buffer\_pool,decline,kill\_connect | print,decline,kill\_connect | 
|  | 大型 | print,decline,kill\_connect | print,decline,kill\_connect | 

## Aurora Serverless v2
<a name="AuroraMySQLOOM.serverless"></a>

Aurora Serverless v2 不支援 `tune`和 `tune_buffer_pool`動作。所有其他動作的運作方式與佈建的執行個體相同。

記憶體閾值會隨著執行個體擴展其 ACUs而動態調整。上述預設值表中的 Serverless v2 欄會顯示每個版本的有效預設值。

## 監控
<a name="AuroraMySQLOOM.monitoring"></a>

您可以透過下列方法監控 OOM 迴避活動。

### 錯誤日誌
<a name="AuroraMySQLOOM.monitoring.errorlog"></a>

執行記憶體復原動作時，Aurora MySQL 會將訊息寫入資料庫錯誤日誌。訊息字首因版本而異，未來版本可能會變更：
+ **Aurora MySQL 第 3 版：**訊息的字首為 `OOM crash avoidance:`。
+ **Aurora MySQL 8.4 版：**訊息的字首為 `Aurora memory management:`。

這些訊息包括：
+ 偵測到記憶體壓力，並復原具有總記憶體和可用記憶體的通知
+ 因記憶體復原而終止的查詢或連線詳細資訊
+ `print` 動作識別的候選查詢

若要檢視錯誤日誌，請參閱 [Aurora MySQL 錯誤日誌](USER_LogAccess.MySQL.LogFileSize.md#USER_LogAccess.MySQL.Errorlog)。

### Amazon CloudWatch 指標
<a name="AuroraMySQLOOM.monitoring.cloudwatch"></a>

下列 CloudWatch 指標會在執行個體層級追蹤 OOM 迴避活動。


| 指標 | 說明 | 可從 取得 | 單位 | 
| --- | --- | --- | --- | 
| AuroraMemoryHealthState | 表示記憶體運作狀態。 0表示運作狀態良好 （無記憶體壓力）， 5 表示中等記憶體壓力， 10表示關鍵記憶體壓力。 | Aurora MySQL 3.06.1\+、Aurora MySQL 8.4 | 量測計 | 
| AuroraMemoryNumDeclinedSqlTotal | 作為 OOM 避免的一部分而拒絕的查詢增量數量。 | Aurora MySQL 3.06.1\+、Aurora MySQL 8.4 | 計數 | 
| AuroraMemoryNumKillConnTotal | 避免 OOM 期間關閉的連線增量數量。 | Aurora MySQL 3.06.1\+、Aurora MySQL 8.4 | 計數 | 
| AuroraMemoryNumKillQueryTotal | 作為 OOM 避免一部分而終止的查詢增量數量。 | Aurora MySQL 3.06.1\+、Aurora MySQL 8.4 | 計數 | 
| AuroraMillisecondsSpentInOomRecovery | 從記憶體運作狀態下降到低於正常狀態的時間量。 | Aurora MySQL 3.08.0\+、Aurora MySQL 8.4 | 毫秒 | 
| AuroraNumOomRecoverySuccessful | 記憶體運作狀態還原至正常狀態的次數。 | Aurora MySQL 3.08.0\+、Aurora MySQL 8.4 | 計數 | 
| AuroraNumOomRecoveryTriggered | 記憶體運作狀態低於正常狀態的次數。 | Aurora MySQL 3.08.0\+、Aurora MySQL 8.4 | 計數 | 

下列一般 CloudWatch 指標也適用於監控記憶體壓力：


| 指標 | 說明 | 單位 | 
| --- | --- | --- | 
| FreeableMemory | 可用記憶體容量。報告來自 MemAvailable的值/proc/meminfo。 | 位元組 | 
| SwapUsage | 交換空間的量。 | 位元組 | 

如需 Aurora MySQL 執行個體層級指標的完整清單，請參閱 [Amazon Aurora 的執行個體層級指標](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)。

### 全域狀態變數
<a name="AuroraMySQLOOM.monitoring.statusvars"></a>

下列狀態變數提供 OOM 狀態的相關資訊。適用於 Aurora MySQL 3.06.0 版及更新版本。


| 變數 | 說明 | 
| --- | --- | 
| Aurora\_oom\_response | 此資料庫執行個體目前作用中的 OOM 回應動作。 | 
| aurora\_oom\_avoidance\_recovery\_state | OOM 復原是 ACTIVE還是 INACTIVE。 | 
| aurora\_oom\_status | 資料庫目前的記憶體運作狀態：運作狀態良好 （無記憶體壓力）、中等記憶體壓力或嚴重記憶體壓力。僅適用於第 3 版。 | 

若要查詢： `SHOW GLOBAL STATUS LIKE 'aurora_oom%';`

如需 Aurora MySQL 全域狀態變數的完整清單，請參閱 [Aurora MySQL 全域狀態變數](AuroraMySQL.Reference.GlobalStatusVars.md)。

### Performance Insights
<a name="AuroraMySQLOOM.monitoring.pi"></a>

如果績效詳情已啟用，您可以使用作業系統層級記憶體指標來監控記憶體壓力並偵測 OOM 事件。下列指標可在 `os.memory`和 `os.swap`計數器下取得：


| 指標 | 說明 | 
| --- | --- | 
| os.memory.outOfMemoryKillCount | 上次收集間隔的 OOM 數量會終止。非零值表示作業系統因記憶體耗盡而終止程序，這通常會導致資料庫重新啟動。 | 
| os.memory.total | 記憶體總量，以 KB 為單位。 | 
| os.memory.free | 未指派的記憶體數量，以 KB 為單位。 | 
| os.memory.active | 已指派的記憶體數量，以 KB 為單位。 | 
| os.memory.cached | 用於快取檔案系統 I/O 的記憶體量，以 KB 為單位。 | 
| os.memory.dirty | 已修改但尚未寫入儲存體的記憶體頁面數量，以 KB 為單位。 | 
| os.memory.inactive | 使用頻率最低的記憶體分頁數量，以 KB 為單位。 | 
| os.memory.db.residentSetSize | 資料庫程序使用的記憶體量 （共用記憶體除外），以位元組為單位。 | 
| os.memory.db.cache | 資料庫程序用於頁面快取的記憶體量，以位元組為單位。 | 
| os.memory.db.swap | 資料庫程序使用的交換記憶體數量，以位元組為單位。 | 
| os.swap.in | 從磁碟交換的記憶體數量，以 KB 為單位。 | 
| os.swap.out | 換成磁碟的記憶體量，以 KB 為單位。 | 

您可以監控 `os.memory.outOfMemoryKillCount`，以偵測作業系統何時因記憶體不足而終止資料庫程序。如需作業系統計數器的完整清單，請參閱[績效詳情作業系統指標](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights_Counters.html#USER_PerfInsights_Counters.OS)。

### 效能結構描述
<a name="AuroraMySQLOOM.monitoring.perfschema"></a>

如果`performance_schema`已啟用，您可以使用記憶體摘要資料表來識別哪些元件和連線耗用最多記憶體。如需詳細資訊，請參閱[針對 Aurora MySQL 資料庫的記憶體用量問題進行故障診斷](ams-workload-memory.md)。