天天看點

【巡檢問題分析與最佳實踐】RDS MySQL 執行個體空間問題檢視空間使用情況常見空間的問題

檢視空間使用情況

RDS控制台

RDS MySQL的控制台中提供了多種檢視執行個體空間使用情況的方法:

基本資訊

在RDS控制台的“基本資訊”頁中會顯示執行個體的總存儲空間使用大小,但這裡隻有目前的空間使用總量,沒有具體的各類資料分别占用空間大小的資訊,也沒有空間使用的曆史資訊。

【巡檢問題分析與最佳實踐】RDS MySQL 執行個體空間問題檢視空間使用情況常見空間的問題

監控與報警

在RDS控制台的“監控與報警”頁中的“标準監控”->“資源監控”下,可以檢視執行個體的各類資料占用的磁盤空間大小的資訊,并且會顯示各部分空間大小的曆史變化曲線。

【巡檢問題分析與最佳實踐】RDS MySQL 執行個體空間問題檢視空間使用情況常見空間的問題

其中磁盤空間總體使用量即對應目前執行個體實際已經使用了的所有存儲空間總量,它由如下四個部分組成:

資料空間使用量 資料檔案總大小。
日志空間使用量 日志文總大小
臨時檔案空間使用量 臨時檔案空間的大小
系統檔案空間使用量 共享表空間等檔案的大小

資料庫自治服務

在RDS控制台的“自治服務”->“一鍵診斷”->“空間分析”頁中可以檢視執行個體内更詳細的空間使用情況,包括資料與日志的空間使用對比、空間使用的曆史變化趨勢、Top資料庫和Top表的空間配置設定明細等。

【巡檢問題分析與最佳實踐】RDS MySQL 執行個體空間問題檢視空間使用情況常見空間的問題
【巡檢問題分析與最佳實踐】RDS MySQL 執行個體空間問題檢視空間使用情況常見空間的問題

這個清單中的統計,則是針對資料庫中的表所使用的資料檔案空間。其中“表空間”為“資料空間”、“索引空間”、“未使用空間”三部分之和,它們的具體含義如下:

保留大小 已保留給該表的所有空間總和,包括資料、索引及未使用的部分
資料空間 表中的資料使用的總空間
索引空間 表中的所有索引使用的總空間
未使用空間 已保留給該表但還未配置設定使用的空間

需要注意的是上面清單中的空間大小是從統計資訊中采集的,和真實的空間大小可能會存在誤差。

指令行如何檢視表空間

執行SQL指令:show table status like 'table_name'

常見空間的問題

為什麼空間大

索引太多

一般表上除了主鍵索引,還存在二級索引,二級索引越多,整個表空間越大,同時索引太多也會造成寫入時IO吞吐會放大。

有大字段

如果表結構定義中有blob、text、很長的varchar等大字段,也會占用更大的表空間,建議将資料壓縮以後再插入。

空閑表空間太多

這裡指的是InnoDB表的碎片率高。InnoDB是按Page(16KB)管理表空間的,如果Page寫滿記錄,然後部分記錄又被delete sql删除,後續這些删除的記錄位置又沒有新的記錄插入,就可能造成空間沒有被很好的利用。可以通過SQL語句 show table status like 'table_name' 檢視表上空閑的空間,如果空閑空間特别大,可以執行optimize table table_name語句整理表空間。

臨時表空間或臨時檔案過大

semi join和distinct去重、不走索引的order by /group by等SQL,會使用臨時表來做去重和排序分組,如果涉及的資料量特别大,可能導緻臨時表空間ibtmp1特别大。Select 是否會使用臨時表可以explain檢視執行計劃,看是否包含 Using Temporary。

還有一種情況是DDL重建表空間時,如果表特别大,建立索引排序時産生的臨時檔案也會特别大。對于RDS 5.6和RDS 5.7不支援即時加字段,很多DDL是通過建立新表的實作的,DDL執行結束再删除老表,DDL過程中會同時存在2份表空間,是以對大表DDL需要注意執行個體的空間是否足夠,否則空間不足會造成DDL失敗。

空間優化方案

  1. 雲盤會支援比本地盤執行個體更大的空間。
  2. PolarDB采用分布式存儲也支援非常大的存儲空間,且按需自動擴容。
  3. RDS 建立時選xengine引擎,xengine是支援高壓縮比的存儲引擎。
  4. 采用分析型資料庫等。