RDS MySQL實例系統文件(主要是undo文件)過大,使存儲空間占滿,導致實例自動鎖定時,您可以參照本文的指引來解鎖并清理undo文件。
問題描述
RDS MySQL實例存儲空間滿,實例運行狀態為鎖定中。在監控與報警中,查看實例存儲空間使用量,undo文件過大。
問題原因
系統文件過大主要是由于undo文件過大。當存在對InnoDB表長時間不結束的查詢語句,而且在查詢過程中表有大量的數據變化時,系統會生成大量的undo信息,占用大量存儲空間,導致存儲空間耗盡。為避免數據丟失,RDS會自動鎖定實例,實例運行狀態顯示為鎖定中。
對于RDS MySQL 8.0,系統會自動清理undo文件,不會出現此問題。
解決方法
步驟一:解鎖實例
擴容實例存儲空間后可解鎖實例。擴容存儲空間的詳細操作請參見變更配置。
步驟二:清理undo文件
對于RDS MySQL 5.7:
連接RDS MySQL實例并執行如下語句,查詢
innodb_undo_tablespaces
參數的值。如何連接實例,請參見連接RDS MySQL實例。SHOW VARIABLES LIKE 'innodb_undo_tablespaces';
當
innodb_undo_tablespaces
取值為2時,表示實例允許使用獨立的undo表空間存儲undo數據,可以進行清理。當undo文件大小超過
innodb_max_undo_log_size
參數值且其中的日志不再被任何活動的事務所需要時,系統會對undo文件進行truncate
操作,清理過大的文件并釋放空間。如何開啟參數,請參見設置實例參數。說明innodb_undo_tablespaces
參數只能在實例創建時指定,創建后不再允許修改。因此對于早期已創建的RDS MySQL 5.7實例,由于創建時未指定,此時若innodb_undo_tablespaces=0
則無法通過升級內核小版本切換到獨立undo表空間模式。當
innodb_undo_tablespaces
取值為0時,表示不使用獨立的undo表空間,undo文件存儲在系統表空間ibdata1中,不可以進行清理。如果您希望清理這部分數據,您可以創建新的實例并遷移數據,或者將實例升級至RDS MySQL 8.0版本。詳細操作請參見升級數據庫版本。
對于RDS MySQL 5.5、5.6,不支持清理undo文件,建議將實例升級至RDS MySQL 5.7、8.0版本。詳細操作請參見升級數據庫版本。
如果您計劃將實例升級至RDS MySQL 5.7版本時,請選擇高可用系列。該系列的
innodb_undo_tablespaces
取值為2,允許使用獨立的undo表空間存儲undo數據,可以進行清理。
后續維護
減少并及時優化慢SQL。
盡量在業務低峰期進行索引創建刪除、表結構修改、表維護和表刪除操作。
監控和清理執行時間過長的會話或事務。詳情請參見查看監控信息。
相關文檔
您可以同時排查和清理數據文件、臨時文件、Binlog文件,解決實例存儲空間滿的問題。
開啟自治功能,避免undo文件增長過快導致實例鎖定。