GBase 8a
运维管理
文章
GBase 8a MPP Cluster—— 按照schema、用户、库的角度统计表大小
发表于2025-06-24 10:15:0729次浏览0个评论
1、整库统计
drop procedure if exists calc_db_size;
DELIMITER //
CREATE PROCEDURE calc_db_size()
BEGIN
DECLARE v_table_schema VARCHAR(64);
DECLARE v_table_name VARCHAR(64);
DECLARE v_table_size BIGINT;
DECLARE total_size BIGINT DEFAULT 0;
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE cur CURSOR FOR
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_schema NOT IN (
'information_schema',
'gbase',
'gclusterdb',
'performance_schema',
'gctmpdb'
);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET @size = 0;
OPEN cur;
read_loop: LOOP
FETCH cur INTO v_table_schema, v_table_name;
IF done THEN
LEAVE read_loop;
END IF;
SET @schema_var = v_table_schema;
SET @table_var = v_table_name;
SET @sql = CONCAT(
'SELECT COALESCE(SUM(TABLE_STORAGE_SIZE),0) INTO @size ',
'FROM information_schema.cluster_table_segments ',
'WHERE table_schema=? AND table_name=?'
);
PREPARE stmt FROM @sql;
EXECUTE stmt USING @schema_var, @table_var;
DEALLOCATE PREPARE stmt;
SET total_size = total_size + @size;
END LOOP;
CLOSE cur;
SELECT total_size AS total_database_size;
END //
DELIMITER ;
2、按照用户统计
drop procedure if exists calc_user_size;
delimiter //
create procedure calc_user_size(username varchar(10))
begin
-- 必须先完成所有DECLARE才能执行其他语句
DECLARE total_size BIGINT DEFAULT 0;
DECLARE v_uid INT; -- 用户UID变量
DECLARE v_schema VARCHAR(64); -- 表所属库名
DECLARE v_table VARCHAR(64); -- 表名变量
DECLARE v_size BIGINT; -- 单个表大小
DECLARE done INT DEFAULT FALSE;-- 游标结束标志
-- 必须在所有DECLARE之后才能声明游标
DECLARE cur_tables CURSOR FOR
SELECT table_schema, table_name
FROM information_schema.tables
WHERE owner_uid = v_uid; -- 通过UID关联用户表
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 现在可以执行SQL语句了
-- 获取用户UID(必须放在DECLARE之后)
SELECT uid INTO v_uid FROM gbase.user WHERE user = username;
OPEN cur_tables;
read_loop: LOOP
FETCH cur_tables INTO v_schema, v_table;
IF done THEN
LEAVE read_loop;
END IF;
-- 精确匹配库名+表名
SELECT SUM(TABLE_STORAGE_SIZE) INTO v_size
FROM information_schema.CLUSTER_TABLE_SEGMENTS
WHERE table_schema = v_schema
AND table_name = v_table;
SET total_size = total_size + COALESCE(v_size, 0);
END LOOP;
CLOSE cur_tables;
SELECT total_size AS user_total_size;
end //
delimiter ;3、按照schema统计
drop procedure if exists calc_schema_size;
delimiter //
create procedure calc_schema_size(schemaname varchar(10))
begin
DECLARE total_size BIGINT DEFAULT 0;
DECLARE tbl_name VARCHAR(64);
DECLARE v_size BIGINT;
DECLARE done INT DEFAULT FALSE;
DECLARE cur_tables CURSOR FOR
SELECT table_name FROM information_schema.tables WHERE table_schema = schemaname;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur_tables;
read_loop: LOOP
FETCH cur_tables INTO tbl_name;
IF done THEN
LEAVE read_loop;
END IF;
SELECT SUM(TABLE_STORAGE_SIZE) INTO v_size
FROM information_schema.CLUSTER_TABLE_SEGMENTS
WHERE table_schema = schemaname AND table_name = tbl_name;
SET total_size = total_size + COALESCE(v_size, 0);
END LOOP;
CLOSE cur_tables;
SELECT total_size AS database_size;
end //
delimiter ;评论
登录后才可以发表评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526