RDS MySQL執行個體的空間使用率是日常需要重點關注的監控項之一,如果執行個體的儲存空間不足,會導致嚴重後果,例如資料庫無法寫入、資料庫無法備份、儲存空間擴容任務耗時過長等。本文介紹查看空間使用方式的方式,以及各種空間問題的原因和解決方案。
查看空間使用方式
RDS MySQL執行個體儲存空間包含使用者資料庫資料、系統資料庫資料、各類日誌和暫存資料表檔案等,您可以通過RDS標準監控查看儲存空間使用方式。
解決方案概述
執行個體儲存空間不足的直接原因是執行個體內各類檔案的堆積。您需要在查看執行個體儲存空間情況時,重點關注以下檔案的空間使用量,根據不同的檔案類型選擇不同的解決方案。
檔案名稱 | 標準監控中對應參數名 | 空間分析中對應參數名 | 解決方案 |
臨時檔案 |
|
| |
Binlog檔案 |
|
| |
undo log檔案 |
|
| |
general log檔案 |
|
| |
使用者資料檔案 |
|
|
除上述檔案之外,您還需關注執行個體的空間片段與資料庫索引:
空間片段堆積也會造成可用儲存空間不足,詳情請參見空間片段堆積導致空間不足。
當資料庫使用了不合理的索引策略時,會造成索引檔案堆積,進而引發執行個體空間不足問題,詳情請參見索引檔案堆積導致空間不足。
緊急情況下,建議您優先手動擴容磁碟,儘快解鎖執行個體,業務訪問恢複後再根據檔案堆積情況清理儲存空間。一般情況下,執行個體會在磁碟擴容後五分鐘左右解鎖。
臨時檔案堆積導致空間不足
MySQL執行個體可能會由於查詢語句的排序、分組、關聯表產生的暫存資料表檔案,或者大事務未提交前產生的binlog cache檔案,導致執行個體磁碟空間滿。為避免資料丟失,RDS會將執行個體鎖定,在鎖定之後,將無法進行寫入操作。
解決方案:詳情請參見RDS MySQL臨時檔案堆積解決辦法。
MySQL 5.7及以下執行個體:建議您重啟執行個體,系統會自動刪除臨時檔案。
MySQL 8.0執行個體:執行個體鎖定時會結束所有使用者會話並開始自動復原,系統會在復原結束後自動釋放臨時檔案。
如果執行個體長時間未自動解鎖,您需要通過
show processlist
命令查看所有工作階段狀態,找到狀態為Copy to tmp table
、Sending data
等的會話,並使用kill
命令手動結束。
Binlog(本地日誌)檔案堆積導致空間不足
MySQL執行個體可能會由於大事務快速產生Binlog檔案,導致執行個體空間滿,為避免資料丟失,會對執行個體進行自動鎖定,磁碟鎖定之後,將無法進行寫入操作。
解決方案:詳情請參見MySQL Binlog檔案堆積解決辦法。
一鍵上傳Binlog:您可以使用RDS的一鍵上傳Binlog功能,將RDS執行個體儲存空間中的Binlog檔案上傳至OSS中儲存,上傳完成後RDS將自動刪除已上傳的Binlog檔案。
修改本地日誌保留原則:您可以在RDS控制台的 中修改本地日誌的保留時間長度、最大儲存空間佔有率、可用儲存空間等參數。執行個體中本地日誌儲存量達到設定閾值後,系統將按時間順序從最早的本地日誌開始刪除,直到本地日誌儲存量低於閾值。
空間片段堆積導致空間不足
InnoDB是按頁(Page)管理資料表空間的。當使用delete
或update
語句刪除或更新資料時,該命令只會將記錄的位置或資料頁標記為“可複用”,而磁碟檔案的大小並不會改變,即資料表空間不會直接回收。當原空間無法複用時,會形成執行個體空間片段,佔用執行個體儲存空間。
解決方案:詳情請參見MySQL空間片段堆積解決辦法。
通過命令列整理空間片段:您可以使用
optimize table
命令整理資料表空間片段。通過DMS最佳化資料表:您可以登入RDS MySQL執行個體,在DMS控制台中按右鍵任意表名並選擇大量操作表,勾選需要空間磁碟重組的表名,並選擇
。開啟空間片段自動回收:您可以在RDS控制台的空間片段自動回收。
中單擊自治功能開關,開啟自治功能後,可以在最佳化和限流頁簽中開啟空間片段自動回收功能,詳情請參見
系統檔案堆積導致空間不足
系統檔案過大主要是由於undo檔案過大。當存在對InnoDB表長時間不結束的查詢語句,而且在查詢過程中表有大量的資料變化時,系統會產生大量的undo資訊,佔用大量儲存空間,導致儲存空間耗盡。為避免資料丟失,RDS會自動鎖定執行個體,執行個體運行狀態顯示為鎖定中。
解決方案:詳情請參見MySQL系統檔案堆積解決辦法。
MySQL 8.0:系統會自動清理undo檔案。
MySQL 5.7:
執行個體
innodb_undo_tablespaces
參數取值為2
時,表示執行個體允許使用獨立的undo資料表空間儲存undo資料,可以進行清理。當undo檔案大小超過innodb_max_undo_log_size
參數值且其中的日誌不再被任何活動的事務所需要時,系統會對undo檔案進行truncate
操作,清理過大的檔案並釋放空間。執行個體
innodb_undo_tablespaces
參數取值為0
時,表示不使用獨立的undo資料表空間,undo檔案儲存體在系統資料表空間ibdata1中,不可以進行清理。您可以建立執行個體並遷移資料或將資料庫版本升級至MySQL 8.0,詳情請參見升級資料庫版本。
MySQL 5.5、MySQL 5.6:不支援清理undo檔案,建議將執行個體升級為MySQL 5.7版本的高可用系列執行個體或MySQL 8.0執行個體。
說明MySQL 5.7高可用系列執行個體的
innodb_undo_tablespaces
參數取值為2,允許使用獨立的undo資料表空間儲存undo資料,可以清理undo檔案。
常規記錄檔堆積導致空間不足
當RDS MySQL開啟了general log後,該檔案記錄了使用者的所有操作,包括每條SQL語句的執行細節,無論是查詢、插入、更新還是刪除操作。當訪問量大或者長時間不清理general log檔案時,會佔用大量的儲存空間,導致儲存空間耗盡。
解決方案:詳情請參見MySQL general log檔案堆積解決辦法。
關閉常規日誌採集:關閉general log(運行參數值設為OFF),以防止產生新的日誌。詳情請參見設定執行個體參數。
刪除常規記錄檔:您可以登入RDS執行個體並執行
TRUNCATE TABLE mysql.general_log;
命令刪除常規日誌。建議只在調試或跟蹤問題時臨時開啟general log,使用完成之後請及時關閉general log。
使用者資料檔案堆積導致空間不足
使用者資料檔案長時間未整理或在表結構中使用blob
、text
和較長的varchar
欄位會佔用大量的執行個體儲存空間進而導致儲存空間滿的問題。為避免資料丟失,RDS MySQL會對執行個體進行自動鎖定,鎖定之後將無法進行寫入操作。
解決方案:詳情請參見RDS MySQL資料檔案堆積解決辦法。
刪除無用資料:使用
drop
或truncate
命令清理無用資料。壓縮資料:對於一些大欄位資料,您可以先進行資料壓縮,再傳入資料庫儲存,減少儲存空間使用量。
索引檔案堆積導致空間不足
資料庫索引會以檔案形式儲存在磁碟中,當您使用了不合理的索引策略或建立了大量的二級索引,會導致索引檔案過大或堆積,造成執行個體儲存空間不足。
解決方案:
選擇合適的欄位建立索引:除主鍵索引外,建議您選擇在被頻繁查詢、需要排序或經常用於表間串連的欄位上建立索引。同時,建議您考慮建立聯合索引而非單列索引,節約磁碟空間。
刪除無用索引:對於長時間不使用的索引或無用索引,可以考慮刪除以節約磁碟空間。同時,也建議您最佳化資料結構,減少二級索引數量。