KingbaseESV8R6表空间与数据库,模式,表的关系
自定义表空间的作用
使用多个表空间可以更灵活地执行数据库操作。当数据库具有多个表空间时,您可以:
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