资源管理之Schema空间管控
1、Schema空间管控简介
GaussDB(DWS)存储资源管理上提供了Schema级别的空间管控能力,一方面可以实现单实例上的空间管控,避免数据库只读和磁盘满的情况出现;另一方面将空间管控和用户、队列解耦,实现了空间管控和权限的分离,降低用户使用空间管控的难度。
通过创建Schema时指定存储空间的大小实现对存储资源的管理,仅限制永久表存储空间(PREM SPACE)。Schema存储空间管理支持对表数据的存储空间管理,当一个Schema存在空间限制时,在业务执行过程中,如果该Schema下的表数据之和超过空间限制,则会导致业务出错。管理员用户不受schema空间管控。
2、相关GUC参数与视图
Schema空间管控相关参数如下:
- use_workload_manager
资源管理总开关,默认为on。
- enable_perm_space
空间管控总开关,默认为on。
- space_readjust_schedule
空间管控和空间统计功能中,控制是否触发自动校准以及校准空间误差阈值。默认为auto,打开自动校准功能,并且触发自动校准的差误阈值为1GB(该差异指的是在pg_relfilenode_size校准过程中产生的差异)。
Schema空间管控相关视图与函数:
视图/函数 | 功能说明 |
pg_namespace | PG_NAMESPACE系统表存储命名空间,即存储schema相关的信息。SELECT * FROM pg_namespace WHERE permspace <> - 1;可利用该语句查看当前集群是否使用schema空间管控。 |
pg_total_schema_info | 显示当前节点各个数据库下所有Schema的存储使用情况。其usedspace单位为byte。 |
pgxc_total_schema_info | 显示所有节点各个数据库下所有Schema的存储使用情况,仅支持在CN节点上查询。注意:在该视图中,cn节点上的数据仅表示cn节点的schema数据,而不是各个dn节点的数据之和。 |
pgxc_total_schema_info_analyze | 显示集群整体的Schema空间信息,包括:集群空间总值、各实例空间平均值、倾斜率、单实例空间最大值、单实例空间最小值以及最大最小空间所在的实例名,便于用户获悉集群整体的Schema空间使用情况,仅支持在CN节点上查询。 |
pgxc_wlm_readjust_relfilenode_size_table() |
快速校准函数,通过不同的入参选择对用户、schema、relfilenode三个空间维度进行校准。
|
3、Schema空间管控实践
813集群版本开始,列存表的辅助表空间也将累计到主表所在的Schema空间上,通过消息队列与辅助表反查机制实现,但表空间增长消息会延迟5秒累加到对应Schema空间上。因此在介绍Schema空间管控能力之前,先对辅助表进行介绍:
行存表:
列存表:
表类型 | 含义 |
reltoastrelid | toast辅助表的索引表 |
reltoastidxid | toast辅助表 |
reldeltarelid | 列存delte辅助表 |
reldeltaidx | 列存delte辅助表的索引表 |
relcudescrelid | 列存cudesc辅助表 |
relcudescidx | 列存cudesc辅助表的索引表 |
schema空间管控效果演示:
# 设置Schema“userg1 ”永久表空间限额为200M。
ALTER SCHEMA userg1 WITH PERM SPACE '200M';
# 修改Schema“userg1 ”永久表空间限额不受限制
ALTER SCHEMA userg1 WITH PERM SPACE 'unlimited';
# 查看Schema“userg1 ”永久表空间限额是否已经设置
SELECT * FROM PG_NAMESPACE WHERE NSPNAME = 'userg1';
schema空间管控常用语句:
# 获取用户在指定节点表空间大小总和
execute direct on("dn_6001_6002") 'select case when sum(pg_table_size(pc.oid)) is null then 0 else sum(pg_table_size(pc.oid)) end from pg_class pc join pg_roles pr on pc.relowner = pr.oid where pr.rolname=''userg1'' and relname not like ''pg_%'';';
# 获取用户在当前节点的表relfilenode 编号
select relfilenode from pg_class where oid in (select oid from pg_class where relowner=(select usesysid from pg_user where usename ='userg1'));
- 点赞
- 收藏
- 关注作者
评论(0)