本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
InnoDB 歷史記錄清單長度顯著增加
從日期
到 db-instance
的長度
,針對資料列變更的歷史記錄清單長度皆顯著增加。這會影響查詢和資料庫關閉效能。
支援的引擎版本
所有版本的 Aurora MySQL 都支援此洞察資訊。
Context
InnoDB 交易系統會維護多版本並行控制 (MVCC)。修改資料列時,修改前的版本會在還原日誌中儲存為還原記錄。每個還原記錄都有對先前重做記錄的參照,進而形成一份連結清單。
InnoDB 歷史記錄清單是已提交交易的還原記錄全域清單。交易不再需要歷史記錄時,MySQL 會用歷史記錄清單來清除記錄和日誌頁面。歷史記錄清單長度是清單中所有修改項目的還原記錄總數。每個日誌都包含一個或多個修改項目。若 InnoDB 歷史記錄清單長度太長,表示該清單具有過多舊資料列版本,導致查詢和資料庫關閉變慢。
造成此問題的可能原因
歷史記錄清單過長的典型原因包括:
-
長時間執行的交易 (讀取或寫入)
-
繁重的寫入負載
動作
根據洞察的原因,我們會建議不同的動作。
在 InnoDB 歷史記錄清單減少之前,請不要開始任何涉及資料庫關閉的操作
InnoDB 歷史記錄清單過長會降低資料庫關閉速度,因此請在啟動涉及資料庫關閉的操作之前減少清單大小。這些操作包括主要版本資料庫升級。
找出並關閉長時間執行的交易
您可以透過查詢 information_schema.innodb_trx
,找出長時間執行的交易。
注意
也請務必在僅供讀取複本上尋找長時間執行的交易。
若要找出並關閉長時間執行的交易
-
在您的 SQL 用戶端執行下列查詢:
SELECT a.trx_id, a.trx_state, a.trx_started, TIMESTAMPDIFF(SECOND,a.trx_started, now()) as "Seconds Transaction Has Been Open", a.trx_rows_modified, b.USER, b.host, b.db, b.command, b.time, b.state FROM information_schema.innodb_trx a, information_schema.processlist b WHERE a.trx_mysql_thread_id=b.id AND TIMESTAMPDIFF(SECOND,a.trx_started, now()) > 10 ORDER BY trx_started
-
使用
COMMIT
或ROLLBACK
命令,關閉每個長時間執行的交易。
使用績效詳情,找出最高主機和最高使用者。
最佳化交易,以立即遞交大量已修改的資料列。
相關指標
下列指標與此洞察相關:
-
trx_rseg_history_len
如需詳細資訊,請參閱《MySQL 5.7 參考手冊》中的 InnoDB INFORMATION_SCHEMA 指標資料表
。