1. 背景
TDengine 之前版本一直沒有通過 SQL 命令查看數據庫占用的磁盤空間大小,從 3.3.5.0 開始,增加了這個方便且實用的小功能,這里詳細介紹下。
2. SQL 基本語法
select expr from information_schema.ins_disk_usage [where condtion]
行為說明: 查看各個vgroup 的各個組件磁盤占用情況,并且可以通過查詢語句計算壓縮率等。
示例:
taos> select * from ins_disk_usage where db_name = "test";
db_name|vgroup_id|wal|data1|data2|data3|cache_rdb|table_meta|
s3|raw_data|
=========================================================
test|13 | 112 | 256 | 2000| 3000| 4000| 8000| 9000| 10000
Query OK, 1 row(s) in set (0.003510s)
3. 快捷命令
快捷命令是比較短的可快速查看信息的命令,查看磁盤空間的命令是:
show disk_info;
示例:
taos> show disk_info;
_db_usage? ? ? ? ? ? ? ?|
=================================
Compress_radio: 23%? ? ?|
Disk_occupied: 400M? ? ?|
Query OK, 2 row(s) in set (0.013209s)
行為說明:?
- compression_ratio: 類型為double 類型,代表當前庫的壓縮率, 如果估算出來 raw_data 的size 小于1k, 則顯示為NULL。
- disk_occupied: 類型為整數類型,代表當前用戶數據占用大小。
命令等同于:
select
? ? sum(data1 + data2 + data3)/sum(raw_data),
? ? sum(data1 + data2 + data3)
from information_schema.ins_disk_usage
? ? where db_name="dbname"
4. 新增系統表
本功能需新增系統表,在 information_schema 中新增 ins_disk_usage 表,各字段含義如下:
字段 | 含義 | 類型 | 單位 | 備注 |
db_name | Db 的名稱 | Varchar | 無 | 準確值 |
vgroup_id | Vgroup 的ID號 | 整數類型 | 無 | 準確值 |
wal | wal 的大小 | 長整數類型 | K | 準確值 |
data1 | 一級存儲上磁盤占用大小 | 長整數類型 | K | 同上, 不包含WAL 值 |
data2 | 二級存儲上磁盤占用大小 | 長整數類型 | K | 準確值,不包含WAL值 |
data3 | 三級存儲上磁盤占用大小 | 長整數類型 | K | 準確值, |
cache_rdb | last/last_row占用磁盤的大小 | 長整數類型 | K | 同上 |
table_meta | Table Meta 占用磁盤大小 | 長整數類型 | K | 同上 |
s3 | s3 上占用的數據的大小 | 長整數類型 | K | 相對準確值 |
raw_data | 預估出來的真實數據的大小,不含mem table | 長整數類型 | k | 估算值 |
5. 性能
命令資源消耗大:
需要到各?vnode 獲取其基本磁盤占用、表數量、行數,行數統計等信息,需要讀 header block 信息?IO 使用多。
執行時間:
?預估為秒級,性能和?show table distributed stableName?
類似, 如果 DB 上超級表或者普通表的數目為 N, 執行單個 show table distributed table?
時間為 T,那么執行該查詢的時間則為 N * T。
6. 約束和限制
約束: 本質上是一個運維工具, 且資源消耗比較大,不建議頻繁調用,
限制:
-
如果有大量的刪表、刪數據行為,不能準確計算得到壓縮率等信息,需要等到完全compact 完全結束之后,才能得到一個相對準確的壓縮率,如果在compact 還沒有結束時,查詢得到的磁盤占用可能過大。
-
本實現統計是按實際文件占用進行統計且忽略了目錄本身的大小, 因此和用 `du ` 命令直接統計目錄的大小存在一定的區別,兩者差距一般小于1M。
-
多副本情況下,只統計單副本的DB的占用大小
-
如果要統計單個DB 實際的磁盤占用可以用
select sum(data1+data2+data3+wal+cache_rdb + table_meta) from ins_disk_usage where dbname = "test"
-
文件大小的磁盤占用大小