sys_spacequota 扩展插件介绍

插件sys_spacequota简介

sys_spacequota可以对指定表空间的大小进行限额,一旦大于该限额,例如对此表空间里的数据进行insert, update, copy to,
select into, create index操作将会被警告或终止(默认为0表示警告,警告或者终止可以通过GUC参数spacequota.fullwarningtype = 0/1来配置)。

表空间限额基本语法

查询限额信息:
select * from sys_space_quota;

检查表空间的限额:
space_quota_check();

设置或更改表空间限额, 可调用 set_space_quota(oid, quota)方法,quota的单位为字节。
set_space_quota(oid, quota)
参数
oid:表空间的oid值。
quota:设置的表空间限额值。

删除表空间限额, 可调用 remove_space_quota(oid)方法。
remove_space_quota(oid)
参数
oid:表空间的oid值。

插件使用说明

测试环境:V008R006C007B0012

[复制代码](javascript:void(0)😉

需要创建扩展
create extension sys_spacequota;
CREATE EXTENSION

开关:创建扩展后,再开启参数开关,限额功能生效
alter system set spacequota.enable = on ;
ALTER SYSTEM

TEST=# call sys_reload_conf();
 sys_reload_conf
-----------------
 t
(1 row)

创建测试使用的限额表空间
TEST=# CREATE TABLESPACE ttspace location '/home/kingbase7/tbl_user';
CREATE TABLESPACE    

TEST=# select spcname,oid from sys_tablespace;
   spcname   |  oid
-------------+-------
 sys_default |  1663
 sys_global  |  1664
 sysaudit    |  1986
 ttspace     | 27158

设置表空间限额
TEST=# select set_space_quota(27158,100);
 set_space_quota
-----------------

(1 row)

在设置限额的表空间上创建表
TEST=# create table ttw (id int) tablespace ttspace;
CREATE TABLE

[复制代码](javascript:void(0)😉

1.spacequota.fullwarningtype参数默认设置为0,插入数据有警告,但是数据插入成功。

[复制代码](javascript:void(0)😉

TEST=# show spacequota.fullwarningtype;
 spacequota.fullwarningtype
----------------------------
 0
(1 row)

TEST=# insert into ttw select generate_series(1,10000);
WARNING:  user's disk space quota exceeded
INSERT 0 10000
TEST=#
TEST=# select count(*) from ttw;
 count
-------
 10000
(1 row)

尝试多次插入数据均有警告,但是数据插入成功了。
TEST=# insert into ttw select generate_series(1,10000);
WARNING:  user's disk space quota exceeded
INSERT 0 10000
TEST=#
TEST=# select count(*) from ttw;
 count
-------
 20000
(1 row)

TEST=# insert into ttw select generate_series(1,10000);
WARNING:  user's disk space quota exceeded
INSERT 0 10000
TEST=# select count(*) from ttw;
 count
-------
 30000
(1 row)

TEST=# insert into ttw select generate_series(1,10000);
WARNING:  user's disk space quota exceeded
INSERT 0 10000
TEST=# select count(*) from ttw;
 count
-------
 40000
(1 row)

[复制代码](javascript:void(0)😉

2.spacequota.fullwarningtype参数设置为1时,需要手工执行space_quota_check()检查表空间限额,如果sys_space_quota视图中current_size超出quota值,则再次插入报错,禁止插入数据

[复制代码](javascript:void(0)😉

TEST=# alter system set spacequota.fullwarningtype=1;
ALTER SYSTEM

TEST=# call sys_reload_conf();
 sys_reload_conf
-----------------
 t
(1 row)

查看此参数已经设置为1,1的含义不是警告,而是报错
TEST=# show spacequota.fullwarningtype;
 spacequota.fullwarningtype
----------------------------
 1s
(1 row)

检查表空间限额,判断是否full
TEST=# call space_quota_check();

可以看到is_full字段是t,表示检查限额后,系统识别表空间已满
TEST=#  select * from sys_space_quota;
 spcname | quota | current_size | is_full
---------+-------+--------------+---------
 ttspace |   100 |         8210 | t
(1 row)
检查表空间限额后,再次插入数据报错,禁止插入
TEST=# insert into ttw select generate_series(1,100);
ERROR:  user's disk space quota exceeded

truncate 表后再检查限额
TEST=# truncate  ttw;
TRUNCATE TABLE

call space_quota_check();

查看表空间限额配置,current_size空间已经释放
TEST=# select * from sys_space_quota;
 spcname | quota | current_size | is_full
---------+-------+--------------+---------
 ttspace |   120 |           30 | f
(1 row)

[复制代码](javascript:void(0)😉

从以下结果中我们能看出,当执行完 space_quota_check(),检查空间后,再次插入数据触发表空间限额上限,才会告警,
当spacequota.fullwarningtype设置为1后,提示error,禁止插入,数据没有插入到表中。

[复制代码](javascript:void(0)😉

TEST=# insert into ttw select generate_series(1,100);
INSERT 0 100
TEST=# insert into ttw select generate_series(1,100);
INSERT 0 100
插入数据库数据,查询表空间限额不变
TEST=# select * from sys_space_quota;
 spcname | quota | current_size | is_full
---------+-------+--------------+---------
 ttspace |   100 |           30 | f
(1 row)

执行检查表空间限额函数后,再次查询视图,current_size有变化
TEST=# call space_quota_check();
CALL
TEST=# select * from sys_space_quota;
 spcname | quota | current_size | is_full
---------+-------+--------------+---------
 ttspace |   100 |         8210 | t
(1 row)

此时,再次insert数据报错
TEST=# insert into ttw select generate_series(1,100);
ERROR:  user's disk space quota exceeded

[复制代码](javascript:void(0)😉

posted @ 2023-09-19 18:37  KINGBASE研究院  阅读(43)  评论(0编辑  收藏  举报