自定义表空间的作用
使用多个表空间可以更灵活地执行数据库操作。当数据库具有多个表空间时,您可以:
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
- KingbaseESV8R6 KingbaseESV8 KingbaseESV 模式 数据库kingbaseesv8r6 kingbaseesv8 kingbaseesv模式 kingbaseesv8 kingbaseesv8r6 kingbaseesv8r6 kingbaseesv8 kingbaseesv kbbench kingbaseesv8r6 kingbaseesv8 kingbaseesv权限 kingbaseesv8r6 kingbaseesv8 kingbaseesv pageinspect kingbaseesv8r6 kingbaseesv8 kingbaseesv字母 kingbaseesv8r6全局kingbaseesv8 kingbaseesv kingbaseesv8r6 kingbaseesv8 kingbaseesv参数 kingbaseesv8r6 kingbaseesv8 kingbaseesv索引