RDS MySQL執行個體由於慢SQL、插入資料多等原因導致執行個體空間滿,為避免資料丟失,RDS會對執行個體進行自動鎖定,鎖定之後,將無法進行寫入操作。您可以參照本文清理資料檔案、臨時檔案、Binlog檔案、undo檔案和general_log檔案,解決儲存空間問題。
問題描述
阿里雲RDS MySQL版執行個體由於慢SQL、插入資料多等原因導致執行個體磁碟空間滿,為避免資料丟失,執行個體會自動鎖定,且無法進行寫入操作,導致在執行個體詳情頁面的運行狀態為鎖定中。
常見原因
造成執行個體空間滿的主要原因有以下幾種:
資料檔案磁碟空間佔用高。
記錄檔磁碟空間佔用高。
在沒有正確設定記錄備份策略時,可能會由於大事務SQL導致日誌增長較快。
臨時檔案磁碟空間佔用高。
通常導致臨時檔案佔用高的原因是由於查詢語句的排序、分組、關聯表產生的暫存資料表檔案,或者大事務未提交前產生的日誌快取檔案。
系統檔案磁碟空間佔用高。
系統檔案過大主要是由於undo檔案過大。當存在對InnoDB表長時間不結束的查詢語句,而且在查詢過程中表有大量的資料變化時,系統會產生大量的undo資訊,佔用大量儲存空間。
說明對於RDS MySQL 8.0,系統會自動清理undo檔案,不會出現此問題。
general_log檔案磁碟佔用高。
當RDS MySQL開啟了general_log後,該檔案記錄了使用者的所有操作,包括每條SQL語句的執行細節,無論是查詢、插入、更新還是刪除操作。當訪問量大或者長時間不清理general_log檔案時,會佔用大量的儲存空間,導致儲存空間耗盡。您可以通過如下方法確認general_log檔案大小。
查看執行個體儲存空間使用量,判斷sys_data_size檔案是否過大。詳情請參見查看監控資訊。
查看執行個體是否已開啟general_log(運行參數值為ON)。詳情請參見查看執行個體參數。
串連RDS MySQL執行個體並執行如下語句,查詢general_log檔案大小。串連執行個體的詳細請參見串連RDS MySQL執行個體。
SELECT table_schema AS '資料庫', table_name,SUM(data_length + index_length + data_free)/1024/1024 AS "表大小MB",SUM(DATA_FREE)/1024/1024 AS "片段大小MB" FROM information_schema.TABLES WHERE table_name='general_log'
說明此SQL語句會從
information_schema
資料庫的TABLES
表中檢索mysql.general_log
表的資料,然後將其轉換成以MB為單位的大小。此SQL語句獲得的資料為抽樣資料,和實際資料存在一定誤差。