全部產品
Search
文件中心

ApsaraDB RDS:RDS MySQL空間不足問題

更新時間:Oct 13, 2024

RDS MySQL執行個體的空間使用率是日常需要重點關注的監控項之一,如果執行個體的儲存空間不足,會導致嚴重後果,例如資料庫無法寫入、資料庫無法備份、儲存空間擴容任務耗時過長等。本文介紹查看空間使用方式的方式,以及各種空間問題的原因和解決方案。

查看空間使用方式

RDS MySQL執行個體儲存空間包含使用者資料庫資料、系統資料庫資料、各類日誌和暫存資料表檔案等,您可以通過RDS標準監控查看儲存空間使用方式。

  1. 登入RDS控制台,單擊執行個體ID進入執行個體詳情頁。

  2. 監控與警示功能中選擇標準監控,通過MySQL儲存空間使用量視圖查看執行個體儲存空間使用方式。

  3. 您可以單擊視表徵圖題旁的image標誌,查看視圖內各參數含義。詳情請參見查看監控資訊

image

解決方案概述

執行個體儲存空間不足的直接原因是執行個體內各類檔案的堆積。您需要在查看執行個體儲存空間情況時,重點關注以下檔案的空間使用量,根據不同的檔案類型選擇不同的解決方案。

檔案名稱

標準監控中對應參數名

空間分析中對應參數名

解決方案

臨時檔案

temp_file_size

臨時檔案資料量

臨時檔案堆積導致空間不足

Binlog檔案

binlog_size

binlog使用量

Binlog(本地日誌)檔案堆積導致空間不足

undo log檔案

undolog_size

undo log使用量

系統檔案堆積導致空間不足

general log檔案

general_log_size

常規日誌使用量

常規記錄檔堆積導致空間不足

使用者資料檔案

user_data_size

使用者資料庫使用量

使用者資料檔案堆積導致空間不足

除上述檔案之外,您還需關注執行個體的空間片段與資料庫索引:

重要

緊急情況下,建議您優先手動擴容磁碟,儘快解鎖執行個體,業務訪問恢複後再根據檔案堆積情況清理儲存空間。一般情況下,執行個體會在磁碟擴容後五分鐘左右解鎖。

臨時檔案堆積導致空間不足

MySQL執行個體可能會由於查詢語句的排序、分組、關聯表產生的暫存資料表檔案,或者大事務未提交前產生的binlog cache檔案,導致執行個體磁碟空間滿。為避免資料丟失,RDS會將執行個體鎖定,在鎖定之後,將無法進行寫入操作。

解決方案:詳情請參見RDS MySQL臨時檔案堆積解決辦法

  • MySQL 5.7及以下執行個體:建議您重啟執行個體,系統會自動刪除臨時檔案。

  • MySQL 8.0執行個體:執行個體鎖定時會結束所有使用者會話並開始自動復原,系統會在復原結束後自動釋放臨時檔案。

  • 如果執行個體長時間未自動解鎖,您需要通過show processlist命令查看所有工作階段狀態,找到狀態為Copy to tmp tableSending data等的會話,並使用kill命令手動結束。

Binlog(本地日誌)檔案堆積導致空間不足

MySQL執行個體可能會由於大事務快速產生Binlog檔案,導致執行個體空間滿,為避免資料丟失,會對執行個體進行自動鎖定,磁碟鎖定之後,將無法進行寫入操作。

解決方案:詳情請參見MySQL Binlog檔案堆積解決辦法

  • 一鍵上傳Binlog:您可以使用RDS的一鍵上傳Binlog功能,將RDS執行個體儲存空間中的Binlog檔案上傳至OSS中儲存,上傳完成後RDS將自動刪除已上傳的Binlog檔案。

  • 修改本地日誌保留原則:您可以在RDS控制台備份恢複 > 備份設定 > 本地日誌保留原則中修改本地日誌的保留時間長度、最大儲存空間佔有率、可用儲存空間等參數。執行個體中本地日誌儲存量達到設定閾值後,系統將按時間順序從最早的本地日誌開始刪除,直到本地日誌儲存量低於閾值。

空間片段堆積導致空間不足

InnoDB是按頁(Page)管理資料表空間的。當使用deleteupdate語句刪除或更新資料時,該命令只會將記錄的位置或資料頁標記為“可複用”,而磁碟檔案的大小並不會改變,即資料表空間不會直接回收。當原空間無法複用時,會形成執行個體空間片段,佔用執行個體儲存空間。

解決方案:詳情請參見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。

使用者資料檔案堆積導致空間不足

使用者資料檔案長時間未整理或在表結構中使用blobtext和較長的varchar欄位會佔用大量的執行個體儲存空間進而導致儲存空間滿的問題。為避免資料丟失,RDS MySQL會對執行個體進行自動鎖定,鎖定之後將無法進行寫入操作。

解決方案:詳情請參見RDS MySQL資料檔案堆積解決辦法

  • 刪除無用資料:使用droptruncate命令清理無用資料。

  • 壓縮資料:對於一些大欄位資料,您可以先進行資料壓縮,再傳入資料庫儲存,減少儲存空間使用量。

索引檔案堆積導致空間不足

資料庫索引會以檔案形式儲存在磁碟中,當您使用了不合理的索引策略或建立了大量的二級索引,會導致索引檔案過大或堆積,造成執行個體儲存空間不足。

解決方案

  • 選擇合適的欄位建立索引:除主鍵索引外,建議您選擇在被頻繁查詢、需要排序或經常用於表間串連的欄位上建立索引。同時,建議您考慮建立聯合索引而非單列索引,節約磁碟空間。

  • 刪除無用索引:對於長時間不使用的索引或無用索引,可以考慮刪除以節約磁碟空間。同時,也建議您最佳化資料結構,減少二級索引數量。