KingbaseESV8R6表空间与数据库,模式,表的关系

发布时间 2023-09-18 13:56:28作者: KINGBASE研究院

自定义表空间的作用

使用多个表空间可以更灵活地执行数据库操作。当数据库具有多个表空间时,您可以:
1、将用户数据与系统表数据分开存储在不同性能的存储上,以减少I/O争用。
2、将一个应用程序的数据与另一个应用程序的数据分开,以防止在必须使表空间脱机时多个应用程序受到影响。
3、将不同表空间的数据文件存储在不同的磁盘驱动器上,以减少I/O争用。
4、使单个表空间脱机,而其他表空间保持联机状态,从而提供更好的整体可用性。
5、方便备份单个表空间。

表空间与数据库,schema,表的逻辑对应关系

表空间是实际存储数据的地方,一个schema对应多个表空间,一个表空间也可以对应多个schema。
我们可以创建数据库时候指定表空间和owner。这说明表空间的逻辑存储架构是在数据库和schema之上的,他们是包含的关系。
一个表空间可以存储多个数据库,稍后在表空间目录结构中我们可以看出他们之间的关系。
创建完数据库后,也可以通过ALTER DATABASE name SET TABLESPACE new_tablespace 语法更改数据库指定默认表空间为自定义表空间。
\l+ 可以查看数据库对应的表空间名。操作系统上自定义表空间目录的物理结构也可以看出其关系,进入自定义表空间目录,对应的是数据库目录,进入数据库目录对应的是表的relfilenode。

如下,ttspace是自定义表空间。

TEST=# \db
               List of tablespaces
    Name     | Owner  |         Location
-------------+--------+--------------------------
 sys_default | system |
 sys_global  | system |
 sysaudit    | system |
 ttspace     | system | /home/kingbase7/tbl_user
(4 rows)

如下,tbl_user是表空间目录,12145是数据库oid,进入数据库目录,里面存储的数据库对象是表的relfilenode。

[kingbase7@localhost ~]$ cd tbl_user/
[kingbase7@localhost tbl_user]$ cd SYS_12_202209081/
[kingbase7@localhost SYS_12_202209081]$ ll
total 0
drwx------ 2 kingbase7 kingbase7 126 Aug 16 16:47 12145
[kingbase7@localhost SYS_12_202209081]$ cd 12145/
[kingbase7@localhost 12145]$ ll
total 136
-rw------- 1 kingbase7 kingbase7 73728 Aug 16 16:27 109295
-rw------- 1 kingbase7 kingbase7 24576 Aug 16 16:27 109295_fsm
-rw------- 1 kingbase7 kingbase7     0 Aug 16 16:27 109296
-rw------- 1 kingbase7 kingbase7  8192 Aug 16 16:27 109297
-rw------- 1 kingbase7 kingbase7  8192 Aug 16 16:44 109298
-rw------- 1 kingbase7 kingbase7     0 Aug 16 16:44 109299
-rw------- 1 kingbase7 kingbase7  8192 Aug 16 16:44 109300
-rw------- 1 kingbase7 kingbase7  8192 Aug 16 16:47 109301
-rw------- 1 kingbase7 kingbase7  8192 Jul 14 15:19 92835

更改表的默认表空间为自定义表空间

alter table 语法
ALTER TABLE ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
SET TABLESPACE new_tablespace [ NOWAIT ]

TEST=# select * from sys_tablespace ;
  oid  |   spcname   | spcowner | spcacl |                  spcoptions
-------+-------------+----------+--------+----------------------------------------------
  1663 | sys_default |       10 |        |
  1664 | sys_global  |       10 |        |
  1986 | sysaudit    |       10 |        |
 27158 | ttspace     |       10 |        | {quota=100,current_size=393262,space_full=1}
(4 rows)

如下,第一次修改表ti为指定表空间ttspace,从sys_class视图里看出原始的relfilenode59987并没有删除,59987位于base目录下的默认表空间里,而是在自定义表空间目录下新建了一个relfilenode109295。两个对象同名。

TEST=# alter table ti set tablespace ttspace;
ALTER TABLE
TEST=# select * from sys_class where relname='ti';
  oid  | relname | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | relhasindex | relisshared | relpersistence |
relkind | relnatts | relchecks | relhasrules | relhastriggers | relhassubclass | relrowsecurity | relforcerowsecurity | relispopulated | relreplident | relispartition | relrewrite | relfrozenxid | relminmx
id | relacl | reloptions | relpartbound
-------+---------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+-------------+-------------+----------------+-
--------+----------+-----------+-------------+----------------+----------------+----------------+---------------------+----------------+--------------+----------------+------------+--------------+---------
---+--------+------------+--------------
 59987 | ti      |        59985 |   59989 |         0 |    59986 |     2 |       59987 |             0 |        0 |         0 |             0 |         59995 | f           | f           | p              |
r       |        2 |         0 | f           | f              | f              | f              | f                   | t              | d            | f              |          0 |         1959 |
 1 |        |            |
 68231 | ti      |         2200 |   68233 |         0 |       10 |     2 |      109295 |         27158 |        9 |      2006 |             0 |         68234 | f           | f           | p              |
r       |        2 |         0 | f           | f              | f              | f              | f                   | t              | d            | f              |          0 |         2032 |
 1 |        |            |
(2 rows)

第二次修改表t为指定表空间ttspace,sys_class里这次原始的表的relfilenode被删除了,只保留了自定义表空间下的relfilenode。可见,alter table set tablespace后,表的relfilenode发生变化,变成了109301,它对应的表空间oid 从原来的0变为27158,而原来默认表空间对应的base目录下的relfilenode68270也被自动删除。

TEST=# select * from sys_class where relname='t';
  oid  | relname | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | relhasindex | relisshared | relpersistence |
relkind | relnatts | relchecks | relhasrules | relhastriggers | relhassubclass | relrowsecurity | relforcerowsecurity | relispopulated | relreplident | relispartition | relrewrite | relfrozenxid | relminmx
id | relacl | reloptions | relpartbound
-------+---------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+-------------+-------------+----------------+-
--------+----------+-----------+-------------+----------------+----------------+----------------+---------------------+----------------+--------------+----------------+------------+--------------+---------
---+--------+------------+--------------
 68270 | t       |         2200 |   68272 |         0 |       10 |     2 |       68270 |             0 |        1 |         3 |             0 |             0 | f           | f           | p              |
r       |        3 |         0 | f           | f              | f              | f              | f                   | t              | d            | f              |          0 |         2039 |
 1 |        |            |
(1 row)

TEST=# alter table t set tablespace ttspace;
ALTER TABLE
TEST=# select * from sys_class where relname='t';
  oid  | relname | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | relhasindex | relisshared | relpersistence |
relkind | relnatts | relchecks | relhasrules | relhastriggers | relhassubclass | relrowsecurity | relforcerowsecurity | relispopulated | relreplident | relispartition | relrewrite | relfrozenxid | relminmx
id | relacl | reloptions | relpartbound
-------+---------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+-------------+-------------+----------------+-
--------+----------+-----------+-------------+----------------+----------------+----------------+---------------------+----------------+--------------+----------------+------------+--------------+---------
---+--------+------------+--------------
 68270 | t       |         2200 |   68272 |         0 |       10 |     2 |      109301 |         27158 |        1 |         3 |             0 |             0 | f           | f           | p              |
r       |        3 |         0 | f           | f              | f              | f              | f                   | t              | d            | f              |          0 |         2039 |
 1 |        |            |
(1 row)

如下从表空间oid 27158的目录结构可以理解为,表空间架构包含于数据库oid12145,进入下一层目录是数据库下的表对象等。

[kingbase7@localhost 12145]$ pwd
/home/kingbase7/data/sys_tblspc/27158/SYS_12_202209081/12145

表空间链接文件指向自定义表空间目录地址。

lrwxrwxrwx 1 kingbase7 kingbase7 24 May  5 17:36 27158 -> /home/kingbase7/tbl_user
[kingbase7@localhost sys_tblspc]$ pwd
/home/kingbase7/data/sys_tblspc