GBase 8a V95版本表空间配额使用样例

GBase 8a 从V95开始支持用户自定义表空间tablespace, 同时支持对空间配额的限制。

参考

GBase 8a实现用户磁盘空间配额限制

提醒

  • 空间配额限制是计算节点级的,不是整个集群的,所以要以节点空间评估
  • 当前版本(9.5.2.43)尚未将元数据(metadata)保存在内,而是放在了数据库默认表空间里,而global hash索引是保存在元数据里的。
  • 对占用空间大的表做表空间单独限制,其每次数据都会修正占用的磁盘空间,但为了避免并行错误,内部估计是串行操作的。所以对频繁变动的小表,还是建议用默认表空间。

表空间种类

一个表只能有一个表空间,一个表空间可以被多个表同时使用。

数据库实例默认表空间(系统表空间)

如果建库时不指定,则使用数据库实例的默认表空间。

  • 调度节点:userdata/gcluster/【vc编号_】库名/sys_tablespace,其中在V95下,调度服务的库名前要加上VC编号
  • 计算节点:userdata/gbase/库名/sys_tablespace)

单个库(database)的默认表空间

库内的表,默认使用这个表空间,一般是在建库时指定,如果建库时不指定,则使用实例的默认表空间。

库下面的表,如果建表时不指定表空间,则默认使用当前库(database)的默认表空间。

其它表空间

库(database)的非默认表空间,需要建表时单独指定。 一个库可以有多个表空间,方便建表时灵活分配。

库(database)的表空间使用

参数语法

CREATE DATABASE [vc_name.]<database_name> SYSTEM TABLESPACE DATADIR <path> [SEGSIZE <segsize_value>] [MAXSIZE <max size_value>];
  • path 默认 Tablespace 所对应的系统路径,路径支持相对路径和绝对路径,相对路径是相对于配置文件中配置的 datadir 路径。该目录必须已经存在,且dbaUser(一般是操作系统的gbase用户)必须有读写权限。
  • segsize 空间中表的 seg 文件分裂大小,在 10M 到 2G 之间,使用带有 K,M,G 单位表示,可选,默认为 2G(可通过配置文件_gbase_segment_size指定)。
  • maxsize 指定表空间最大限额,它要大于 segsize 值,使用带有 K,M,G 单位表示。由用户保证磁盘可用空间大于 maxsize_value。可选,默认为不限制。该参数在集群层指定则表示每个节点的表空间最大限额。资源管理先于表空间进行空间的限额检验。

创建

create database ab system tablespace datadir '/opt/gbase/tablespace_100m' segsize 16m maxsize 100m;

查看

通过系统元数据表 information_schema.tablespaces 获得

gbase> select * from tablespaces where db_name='ab';
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| NODE_NAME | DB_NAME | TABLESPACE_ID | TABLESPACE_NAME | TABLESPACE_PATH            | IS_DEFAULT | MAX_SIZE  | USED_SIZE | FREE_SIZE | SEG_SIZE |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| node1     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
| node2     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
2 rows in set (Elapsed: 00:00:00.00)
  • NODE_NAME 节点名字, 可以看gcadmin showdistribution的输出
  • DB_NAME 库名
  • TABLESPACE_ID 表空间ID
  • TABLESPACE_NAME 表空间名字,默认表空间名字固定叫sys_tablespace。其它表空间是用户创建时指定的名字
  • TABLESPACE_PATH 表空间路径 如上例子是用的绝对路径
  • IS_DEFAULT 是否为默认表空间, yes=是
  • MAX_SIZE 表空间最大配额(字节)
  • FREE_SIZE 可用空间(字节)
  • SEG_SIZE 数据文件的切分大小(字节),如不指定则为default, 和数据库参数一致

表空间的配置,保存在调度节点的对应库的的tablespace.cnf文件里

[gbase@gbase_rh7_001 ab]$ cd /opt/gbase/gcluster/userdata/gcluster/vc00001_ab
[gbase@gbase_rh7_001 vc00001_ab]$ ll
total 4
drwx------. 3 gbase gbase  48 Dec 16 13:50 metadata
-rw-------. 1 gbase gbase 153 Dec 16 13:54 tablespace.cnf
[gbase@gbase_rh7_001 vc00001_ab]$ cat tablespace.cnf
[common]
default_id=1
last_id=1

[tablespace:0]
id=1
name=sys_tablespace
dir=/opt/gbase/tablespace_100m
max_size=104857600
seg_size=16777216
used_size=0
[gbase@gbase_rh7_001 vc00001_ab]$

警告

从当前【2021-12-30】实现的方案看,该tablespace.cnf只有一个文件,如果用户有大量的多表并发dml操作,此处会额外多出一个串行锁,并可能影响性能。建议还是对有磁盘空间占用大的表,做单独的表空间管理,对普通表,还是使用数据库默认的表空间。

修改

不支持修改库(database)的默认表空间。如确实要改动,可以通过文件系统层面的link/mount进行。

表(table)的表空间使用

数据库内的表,如果不指定表空间,则默认使用库的默认表空间。

创建普通表空间语法

CREATE TABLESPACE [IF NOT EXISTS] [[vc_name.]database_name.]<tablespace_name> DATADIR <path> [SEGSIZE <segsize_value>] [MAXSIZE <maxsize_value>]
  • vc_name VC名字。 可以通过show vcs查看vcid和vcname, 可选
  • database_name 库名 , 可选
  • tablespace_name 表空间名字,一个库内不能重复。支持数字英文和下划线,长度为 64 个字符,不区分大小写,全部按照小写字符创建,且不允许以数字开头。
  • path 表空间所对应的实际系统路径,路径支持相对路径和绝对路径,相对路径是相对于配置文件中配置的 datadir 路径
  • SEGSIZE 可选, 数据文件的分割大小,请参考前面库表空间介绍
  • MAXSIZE 可选,最大配额限制,请参考前面库表空间介绍

样例,如下是创建2个库的表空间。

gbase> create tablespace ab.ts_1 datadir '/opt/gbase/tablespace_1' segsize 10m maxsize=50m;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)

gbase> create tablespace ab.ts_2 datadir '/opt/gbase/tablespace_2' segsize 16m maxsize=200m;
Query OK, 0 rows affected (Elapsed: 00:00:00.02)

gbase> select * from information_schema.tablespaces where db_name='ab';
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| NODE_NAME | DB_NAME | TABLESPACE_ID | TABLESPACE_NAME | TABLESPACE_PATH            | IS_DEFAULT | MAX_SIZE  | USED_SIZE | FREE_SIZE | SEG_SIZE |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| node1     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
| node1     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 0         | 52428800  | 10485760 |
| node1     | ab      |             3 | ts_2            | /opt/gbase/tablespace_2    | no         | 209715200 | 0         | 209715200 | 16777216 |
| node2     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
| node2     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 0         | 52428800  | 10485760 |
| node2     | ab      |             3 | ts_2            | /opt/gbase/tablespace_2    | no         | 209715200 | 0         | 209715200 | 16777216 |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
6 rows in set (Elapsed: 00:00:00.00)

修改表空间

只能提高表空间的配额,不能减少,其它参数不能修改。 如必须改动,请删除重建表空间,当然要注意该表空间已经存在的表。

如下例子将ts_2的配额改成了400M

gbase> alter tablespace ab.ts_2 maxsize=200m;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)

gbase> alter tablespace ab.ts_2 maxsize=199m;
ERROR 1700 (HY000): (GBA-02DD-0021) gcluster tablespace error: (GBA-01EX-700) Gbase general error: tablespace max size invalidate..
gbase> alter tablespace ab.ts_2 maxsize=201m;
gbase> alter tablespace ab.ts_2 maxsize=400m;
Query OK, 0 rows affected (Elapsed: 00:00:00.02)

gbase> select * from information_schema.tablespaces where db_name='ab';
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| NODE_NAME | DB_NAME | TABLESPACE_ID | TABLESPACE_NAME | TABLESPACE_PATH            | IS_DEFAULT | MAX_SIZE  | USED_SIZE | FREE_SIZE | SEG_SIZE |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| node1     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
| node1     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 0         | 52428800  | 10485760 |
| node1     | ab      |             3 | ts_2            | /opt/gbase/tablespace_2    | no         | 419430400 | 0         | 419430400 | 16777216 |
| node2     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
| node2     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 0         | 52428800  | 10485760 |
| node2     | ab      |             3 | ts_2            | /opt/gbase/tablespace_2    | no         | 419430400 | 0         | 419430400 | 16777216 |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
6 rows in set (Elapsed: 00:00:00.01)

删除表空间

DROP TABLESPACE [[vc_name.]database_name.]<tablespace_name>;

例子

gbase> drop tablespace ab.ts_2;
Query OK, 0 rows affected (Elapsed: 00:00:00.02)

gbase> select * from information_schema.tablespaces where db_name='ab';
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| NODE_NAME | DB_NAME | TABLESPACE_ID | TABLESPACE_NAME | TABLESPACE_PATH            | IS_DEFAULT | MAX_SIZE  | USED_SIZE | FREE_SIZE | SEG_SIZE |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| node1     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
| node1     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 0         | 52428800  | 10485760 |
| node2     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
| node2     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 0         | 52428800  | 10485760 |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
4 rows in set (Elapsed: 00:00:00.00)

建表时指定表空间

表数据放到各自指定的表空间内,如果没指定则在库的默认表空间内。

gbase> create table t2(id int) tablespace='ts_1';
Query OK, 0 rows affected (Elapsed: 00:00:00.19)

gbase> insert into t2 select * from t1;
Query OK, 40000000 rows affected (Elapsed: 00:00:09.31)
Records: 40000000  Duplicates: 0  Warnings: 0

gbase> select * from information_schema.tablespaces where db_name='ab';
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| NODE_NAME | DB_NAME | TABLESPACE_ID | TABLESPACE_NAME | TABLESPACE_PATH            | IS_DEFAULT | MAX_SIZE  | USED_SIZE | FREE_SIZE | SEG_SIZE |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| node1     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
| node1     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 80020808  | 0         | 10485760 |
| node2     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 80252044  | 24605556  | 16777216 |
| node2     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 80020808  | 0         | 10485760 |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
4 rows in set (Elapsed: 00:00:00.01)

查看表结构

gbase> show create table t2;
+-------+-------------------+
| Table | Create Table                                                                                            |
+-------+-------------------+
| t2    | CREATE TABLE "t2" (
  "id" int(11) DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='ts_1' |
+-------+-------------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> show create table t1;
+-------+----------------------------+
| Table | Create Table                                                                                                      |
+-------+----------------------------+
| t1    | CREATE TABLE "t1" (
  "id" int(11) DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+-------+-----------------------------+
1 row in set (Elapsed: 00:00:00.00)

表空间超限测试

可以看到检测是在执行前,如果当前不超则会执行。否则报 The disk space of TableSpace 'sys_tablespace' has exceeded the limit value

gbase> insert into t1 select * from t1;
Query OK, 40000000 rows affected (Elapsed: 00:00:09.52)
Records: 40000000  Duplicates: 0  Warnings: 0

gbase> select * from information_schema.tablespaces where db_name='ab';
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| NODE_NAME | DB_NAME | TABLESPACE_ID | TABLESPACE_NAME | TABLESPACE_PATH            | IS_DEFAULT | MAX_SIZE  | USED_SIZE | FREE_SIZE | SEG_SIZE |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
| node1     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 160042004 | 0         | 16777216 |
| node1     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 80020808  | 0         | 10485760 |
| node2     | ab      |             1 | sys_tablespace  | /opt/gbase/tablespace_100m | yes        | 104857600 | 160042004 | 0         | 16777216 |
| node2     | ab      |             2 | ts_1            | /opt/gbase/tablespace_1    | no         | 52428800  | 80020808  | 0         | 10485760 |
+-----------+---------+---------------+-----------------+----------------------------+------------+-----------+-----------+-----------+----------+
4 rows in set (Elapsed: 00:00:00.00)

gbase> insert into t1 select * from t1;
ERROR 1708 (HY000): [10.0.2.115:5050](GBA-02AD-0005)Failed to query in gnode:
DETAIL: (GBA-01EX-700) Gbase general error: (gns_host: 10.0.2.115) The disk space of TableSpace 'sys_tablespace' has exceeded the limit value.(Usage: 160042004, Limit: 104857600)
SQL: SELECT /*10.0.2.101_5_61_2021-12-16_15:46:17*/ /*+ TID('786495') */ `vcname000001.ab.t1`.`id` AS `id` FROM `ab`.`t1_n2` `vcname000001.ab.t1` target into server (HOST '10.0.2.115,10.0.2.101', PORT 5050, USER 'root', PASSWORD '', DATABASE 'ab', TABLE 't1_n2', COMMENT 'ta

注意,表空间配额限制和用户配额限制是同时生效的,无论哪个超了,都会报错

参考 GBase 8a实现用户磁盘空间配额限制