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)😉