关键字:
表空间 表空间目录 auto_createtblspcdir、人大金仓
什么是表空间
(1)表空间用于存储它的数据库对象,表空间允许在文件系统里定义数据库对象存储的文件存放位置,一个数据库可有一个或多个表空间,一个表空间只隶属于一个数据库。
(2)在之前的数据库版本中,在用户创建表空间的时候,必须指定一个已有的目录,否则会报错。操作不灵活,需要用户手动创建目录。因此,需要提供一个自动创建表空间目录的功能,若用户指定的表空间目录的位置不存在,则自动创建。
(3)create tablespace注册一个新的集簇范围的表空间,表空间的名称必须与数据集簇中现有的任何表空间不同。表空间允许超级用户在文件系统上定义另一个位置,可以把包含数据库对象(例如表和索引)的数据文件放在那里。
创建表空间语法
- 创建表空间的语法
CREATE TABLESPACE tablespace_name [ OWNER { new_owner | CURRENT_USER | SESSION_USER } ] LOCATION 'directory' [ ONLINE | OFFLINE ] [ WITH ( tablespace_option = value [, ... ] ) ] |
2.语义
(1)tablespace_name
要创建的表空间的名称,该名称不能以sys_开头,因为sys_名称是为系统表空间保留的。
(2)user_name
将拥有该表空间的用户名,果然省略,默认为执行该命令的用户。只有超级用户能创建表空间,但是他们能把表空间的拥有权赋予给非超级用户。
(3)directory
● 将被用于创建表空间的目录。能否自动创建表空间目录受参数auto_createtblspcdir控制,参数值默认为on开启状态。
●当参数auto_createtblspcdir=on,创建表空间时,若指定的表空间目录不存在,则会自动创建,但指定目录中已存在的目录需由当前操作系统用户所拥有,若不是当前用户拥有,则创建表空间失败。
●当参数auto_createtblspcdir=off,创建表空间指定的目录不存在,则创建失败。如果创建表空间指定的目录存在,并且该目录下没有别的表空间,该目录为当前操作系统用户所拥有,并且该目录必须使用绝对路径,则创建表空间成功。
(4)tablespace_option
●要设置或者重置的表空间参数,当前,唯一可用的参数是seq_page_cost、random_page_cost以及effective_io_concurrency为一个特定表空间设计其中一个值将覆盖规划器对该表空间中表页读取的常规代价估计,常规代价估计是由同名的配置参数所建立。如果一个表空间位于一个比其它I/O子系统更慢或者更快的磁盘上,这些参数就会发挥作用。
●通过指定encryption参数来确定表空间是否加密,通过制定enkey参数来指定用户的表空间秘钥。表空间加密可以使我们加密表空间中存储的所有数据,表空间加密在读写和写入操作期间对数据进行加密或解密。表空间是对整个表空间数据加密,所以不受表加密的相关限制,对数据类型、约束和索引没有要求。
●表空间模式相关的参数online_mode、readonly_mode,两个参数均为bool类型,分别代表表空间的一级模式ONLINE/OFFLINE和二级模式READONLY/READWRITE。其中创建表空间指定online_mode、ready_mode的设置可以在表空间创建后通过alter命令实现。如果创建表空间过程中指定了online_mode参数为true创建的表空间时在线状态,此时表空间可以提供任何服务。相反如果参数为false,那么创建的表空间将不能提供任何的读写服务。当没有设置online_mode参数时默认为开启状态。
●注意事项:表空间只读或者离线状态设置前,请先关闭参数skip_tablespace_check,仅超级用户有修改和查看权限,默认是开启的,该参数开启状态下不会检查当前操作是否满足表空间状态。
自动创建表空间目录的使用
1.创建表空间指定的目录不存在
●参数auto_createtblspcdir=on
create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/test1/mysp1'; create table cc(id int,name varchar(50)) tablespace mysp1; alter table cc add score numeric not null; insert into cc values(1,'xiaozhang',70),(2,'xiaozhao',80),(3,'xiaohong',85); select * from cc; |
●参数auto_createtblspcdir=off
create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/test1/mysp1';--error |
2.创建表空空间指定的目录存在
●参数auto_createtblspcdir=on
\! mkdir -p test/test1/test2/mysp1 create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/test1/test2/mysp1'; |
●参数auto_createtblspcdir=off
3.用户权限
●超级用户创建表空间
set role system; create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/test1/mysp1'; drop tablespace mysp1; \! rm -rf test |
●普通用户创建表空间
create user xiaozhang; set role xiaozhang; create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/test1/mysp1'; set role system; drop user xiaozhang; |
4.创建表空间指定路径为绝对路径且不能在data目录下
●指定的路径为绝对路径
create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/test1/mysp1'; |
●指定的路径为相对路径
create tablespace mysp1 location '/test/test1/test2/mysp1'; |
●指定的路径在data路径下
create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/data/test/mysp1'; |
●指定的路径不在data目录下
create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/mysp1'; |
5.创建表空间方式覆盖
●创建由不同用户拥有的表空间
create user xiaoxiao; create tablespace mysp1 owner xiaoxiao location '/home/zhangjing/dailybuild0904/bin/test/mysp1'; create table cc(id int,name varchar(50)) tablespace mysp1; insert into cc values(1,'xiaozhang'),(2,'xiaozhao'),(3,'xiaohong'); select * from cc; |
●创建加密表空间
create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/test1/mysp1' with (encryption = true,enckey = '12345678ab'); create table cc(id int,name varchar(50)) tablespace mysp1; insert into cc values(1,'xiaozhang'),(2,'xiaozhao'),(3,'xiaohong'); select * from cc; |
●创建表空间指定online/offline模式
使用参数进行设置
create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/test1/mysp1' with (online_mode=true); select * from sys_tablespace; |
兼容oracle的兼容命令设置
create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/mysp1' online; select * from sys_tablespace; |
如果同时设置但是值不同,以oracle语法设置的为准
create tablespace mysp1 location '/home/zhangjing/dailybuild0904/bin/test/test1/mysp1' online with (online_mode=false); select * from sys_tablespace; |
总结
参数auto_createtblspcdir开启时,创建表空间时,若指定的目录不存在,则自动创建,需要注意的点是:
●指定的路径需是一个绝对路径。
●指定的路径不能在data目录下。
●所指定的路径不能有其它的表空间。
●权限:必须为超级用户才能创建表空间,普通用户不能创建成功。
●目录属主,创建表空间所指定的目录中已存在的目录需是当前操作系统用户所拥有。
●开启auto_createtblspcdir不会对表空间的状态产生影响




