問題描述
阿里云云數據庫RDS MySQL實例由于臨時文件占用磁盤空間較多,導致實例的運行狀態為“鎖定中”。
問題原因
MySQL實例可能會由于查詢語句的排序、分組、關聯表產生的臨時表文件,或者大事務未提交前產生的binlog cache文件,導致實例磁盤空間滿。為避免數據丟失,RDS會將實例鎖定,在鎖定之后,將無法進行寫入操作。
解決方案
在緊急情況下建議擴容實例存儲空間,擴容后需要耐心等待一段時間(5分鐘左右),方可解鎖實例,關于如何升級實例配置,請參見變更配置。
若您無法擴容實例存儲空間,根據版本不同按照以下方法處理:
- MySQL 5.7及以下大版本:重啟實例。
- MySQL 8.0大版本:鎖定時會結束所有用戶會話,會話被結束后會自動開始回滾,回滾根據當時正在執行的查詢不同需要消耗不同的時間,實例空間會在事務回滾完成后自行釋放。如果長時間不能自動解鎖,請參考以下操作處理:
- 通過DMS連接實例。
- 執行以下SQL語句,查看數據庫的會話。
show processlist
- 單擊顯示結果中的State,進行狀態排序,在狀態欄查看是否有大量“Copy to tmp table”、“Sending data”等信息,然后記錄該會話的ID值。
- 執行以下SQL語句,終止會話。
kill [$ID];
說明 [$ID]為上一步獲取的ID值,注意確認終止該會話不會影響業務。
后續維護
若鎖定問題已解決,請參考以下步驟,預防再次出現鎖定問題:
- 在資源不足時,實例自動擴容存儲空間,詳情請參見設置存儲空間自動擴容。
- 針對查詢產生的臨時文件,應該優化SQL語句,避免頻繁使用order by、group by操作,可以適當的將tmp_table_size和max_heap_table_size值調大,但是為了減少磁盤使用而調高tmp_table_size和max_heap_table_size并不明智,因為內存資源遠比磁盤資源寶貴。您可以通過explain加SQL語句查看是否使用內部臨時表,示例如下,在Extra字段中有“Using temporary”字樣,則代表會使用內部臨時表。
explain select * from alarm group by created_on order by default;
系統顯示類似如下。 - 針對binlog cache,應該減少執行大事務的情況,尤其應該減少在多個連接同時執行大事務的情況,如果大事務比較多,可以適當將binlog_cache_size值調大,但是同樣不建議為了節省磁盤空間調整這個參數,建議使用短連接執行大事務,降低臨時空間開銷。
- 建議您監控磁盤使用率,及時清理數據或進行數據拆分,使磁盤使用率不超過80%。
更多信息
若您暫時無法清理臨時文件進行解鎖,您可以清理其他類型的文件,降低磁盤空間使用率,如下所示:
常見問題
Q:如果實例基本信息頁中,重啟實例按鈕不可用,該如何處理?
A:您可以通過如下方式觸發實例重啟:
- 訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
- 在左側導航欄單擊參數設置。
- 在可修改參數標簽頁,查看是否重啟列,找到一個該列取值為是的參數進行修改。
文檔內容是否對您有幫助?