本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
io /重做日誌沖洗
當工作階段將持久性資料寫入至 Amazon Aurora 儲存體時,io/redo_log_flush
事件便會發生。
支援的引擎版本
下列引擎版本支援這個等待事件資訊:
-
Aurora 我的SQL版本 3
Context
該io/redo_log_flush
事件用於 Aurora My SQL 中的寫入輸入/輸出(I/O)操作。
注意
在 Aurora 我的SQL版本 2 中,此等待事件名為 IO/極光redo_log_flush。
等待時間增加的可能原因
對於資料持久性,遞交需要持久寫入至穩定的儲存。如果資料庫執行太多的遞交,寫入輸入/輸出作業上會有等待事件,即 io/redo_log_flush
等待事件。
如需此等待事件行為的範例,請參閱io/aurora_redo_log_flush。
動作
根據等待事件的原因,我們會建議不同的動作。
識別有問題的工作階段和查詢
如果您的資料庫執行個體遭遇瓶頸,您的第一項任務是尋找造成瓶頸的工作階段和查詢。如需有用的 AWS 資料庫部落格文章,請參閱使用 Perfor mance Insights 分析 Amazon Aurora 我的SQL工作負載
識別造成瓶頸的工作階段和查詢
登錄 AWS Management Console 並在打開 Amazon RDS 控制台https://console.aws.amazon.com/rds/
。 -
在導覽窗格中,選擇 Performance Insights (績效詳情)。
-
選擇資料庫執行個體。
-
在 Database load (資料庫負載) 中,選擇 Slice by wait (依等待建立配量)。
-
在頁面底部,選擇 [頂端] SQL。
清單頂端的查詢對資料庫造成最高負載。
將您的寫入作業分組
下列範例會觸發 io/redo_log_flush
等待事件。(系統會開啟自動遞交)。
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); .... INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx; .... UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; .... DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
若要減少等待 io/redo_log_flush
等待事件所花費的時間,將您的寫入作業邏輯分組為單一遞交,以減少持續呼叫儲存。
關閉自動遞交
在進行不在交易內的大規模變更之前,請先關閉自動遞交,如下列範例所示。
SET SESSION AUTOCOMMIT=OFF; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx; UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx; .... UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx; -- Other DML statements here COMMIT; SET SESSION AUTOCOMMIT=ON;
使用交易
您可以使用交易,如下列範例所示。
BEGIN INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); .... INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'); DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; .... DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx; -- Other DML statements here END
使用批次
您也可以批次進行變更,如下列範例所示。不過,使用過大的批次可能會造成效能問題,尤其是在僅供讀取複本或執行 point-in-time 復原時 (PITR)。
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx'),('xxxx','xxxxx'),...,('xxxx','xxxxx'),('xxxx','xxxxx'); UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1 BETWEEN xx AND xxx; DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1<xx;