#CREATE TABLESPACE
# 通用描述
CREATE TABLESPACE用于在数据库中创建一个新的表空间。
SYSTEM/SYSAUX/UNDO/SWAP/TEMPORARY/DEFAULT表空间在CREATE DATABASE时创建,不能用CREATE TABLESPACE语句创建。
单机/分布式部署中,可同时指定挂载到该表空间的数据文件(不指定时系统自动创建一个数据文件并挂载)和数据桶(bucket,对象存储目录,包含slice文件,不指定时系统不会自动创建)。在创建LSC表所属表空间时,必须同时进行数据桶挂载,否则该表空间下将无法创建LSC表,除非通过ALTER TABLESPACE语句为该表空间进行bucket挂载。
分布式部署中创建新表空间出现节点故障时,恢复措施见用户表空间管理章节描述。
# 语句定义
create tablespace::=
# tablespace_name
该语句用于指定要创建的表空间的名称,不可省略,且需符合YashanDB的对象命名规范。
分布式部署需注意创建的表空间的名称不可与已有的表空间集中分配的表空间名称相同,否则会返回错误。
# datafile_clause
该语句用于指定创建表空间对应的数据文件,可省略,则系统按如下规则自动创建一个数据文件:
- 文件名称由表空间名称以及数据文件在表空间内的序号组合生成,如:tablespace_name1,tablespace_name2...,且统一转换为大写。
- 文件的默认大小为8192个BLOCK,文件路径为系统默认的数据文件路径。
- 对于非MEMORY MAPPED表空间,默认文件开启自动扩展,next为8192个块,maxsize为64MB个块。
- 如果没有显式的规定extent分配方式,extent的默认分配方式为系统自动分配。
# file_specification
指定多个数据文件用,
分隔,可省略,则系统将在默认的数据文件路径下创建一个以表空间名称(转换为大写)命名,大小为8192个块,开启自动扩展,每次扩展8192个块,最大可扩展到64MB个块的数据文件。
可以通过PARALELL指定创建数据文件的并行度,取值范围为1到8。
如果未指定并行度数据库会根据文件大小自适应并行度,文件不超过1G时并行度为1,文件超过128G并行度为8,文件大小在1G到128G之间时并行度为4。
# file_name
指定数据文件的名称,如名称里未包含路径,则取系统默认的数据文件路径。
分布式部署中数据文件路径仅允许使用相对路径。
共享集群中的数据文件路径必须为YFS路径。
共享集群中创建数据文件不指定完整YFS路径时默认存储在+DG0/dbfiles中。
# size
指定数据文件的大小,遵循通用size_clause定义。
单个数据文件最少具有128个块用于存储元信息。
UNDO表空间内的单个数据文件最多具有8MB个块,非UNDO表空间内的单个数据文件最多具有64MB个块。
数据文件的大小等于数据库块大小乘以数据文件块个数,例如当数据库块大小为8K时非UNDO表空间的单个数据文件最小值为1M,最大值为512G。
# autoextend on|autoextend off
对创建的数据文件打开|关闭自动扩展,该语句省略时默认为关闭自动扩展。当打开自动扩展时:
- NEXT size_clause:数据文件每次自动扩展时的大小由此值指定,默认为8192个块。
- MAXSIZE UNLIMITED/size_clause:数据文件可扩展到的最大数由此值决定,默认为64MB个块。UNLIMITED表示不限制最大值。
不能对MMS表空间指定AUTOEXTEND ON。
# parallel
当创建一个较大的数据文件时,可以通过本语句指定并行度, 提高创建大文件的速度 。不指定本语句时,系统根据文件大小自动选取并行度,例如文件不超过1G时的并行度为1,文件超过128G时的并行度为8,文件大小在1G到128G之间时的并行度为4。
parallel的值应该介于1~8之间。
示例
--普通路径
CREATE TABLESPACE yashan1 DATAFILE 'yashan1' SIZE 4M AUTOEXTEND ON NEXT 4M MAXSIZE 1G PARALLEL 2;
--YFS路径
CREATE TABLESPACE yashan1 DATAFILE '+DG0/yashan1' SIZE 4M AUTOEXTEND ON NEXT 4M MAXSIZE 1G PARALLEL 2;
# extent_management_clause
该语句用于指定表空间里的对象申请extent时的空间分配方式:
- AUTOALLOCATE:根据对象当前大小由系统自动分配extent空间。
- UNIFORM SIZE size_clause:每次为对象分配的extent空间为固定的值。
- 创建表空间后不能修改extent分配方式。
- 创建undo和swap表空间不允许指定extent分配方式,只能使用UNIFORM分配方式。
- 创建非undo和swap表空间时若不指定extent分配方式,使用AUTOALLOCATE分配方式。
- 使用UNIFORM分配方式的表空间内的每个数据文件大小都必须大于UNIFORM SIZE。
示例
CREATE TABLESPACE yashan1 DATAFILE 'yashan1' SIZE 4M AUTOEXTEND ON NEXT 4M MAXSIZE 1G EXTENT UNIFORM SIZE 64K;
# memory mapped
当指定MEMORY MAPPED关键字时,表示所创建表空间的文件的所有页面都将映射在内存中 (AIM:all in memory),YashanDB将此种类型的表空间命名为内存映射表空间(MMS:Memory mapped space)。共享集群部署下不支持创建MMS表空间。
MMS表空间支持在数据库启动时采用预加载方式,将表空间数据全部加载到内存中,提高访问性能,具体的预加载策略通过MMS_DATA_LOADERS参数配置。
通过V$TABLESPACE视图的MEMORY_MAPPED字段可查询某个表空间是否为MMS表空间。
分布式部署中MEMORY MAPPED关键字不支持与databucket_clause同时指定。
示例
CREATE TABLESPACE yashan2 DATAFILE 'yashan2' SIZE 4M EXTENT UNIFORM SIZE 64K MEMORY MAPPED;
CREATE TABLESPACE yashan3 DATAFILE 'yashan3' SIZE 4M AUTOEXTEND ON NEXT 4M MAXSIZE 1G PARALLEL 6 EXTENT UNIFORM SIZE 64K;
# databucket_clause
指定对象存储目录的路径信息,指定多个路径用,
分隔,每一个路径表示创建一个bucket(数据桶),可省略,省略则默认创建的表空间不挂载bucket。
可通过查询V$DATABUCKET视图查看当前系统中所有创建的bucket信息。
YashanDB中单个表空间下允许挂载DataBucket数量的最大值为64,数据库中允许挂载Databucket数量的最大值取决于建库参数,可查看CREATE DATABASE章节中maxdatabuckets语句描述。
共享集群部署中不允许指定databucket_clause。
# bucket_clause
该语句用于指定bucket信息,如路径,大小等。
YashanDB支持创建本地存储bucket及S3(Simple Storage Service) bucket,本地存储bucket将数据存储至本地路径中,S3 bucket为面向互联网的云存储。
分布式部署中不允许创建S3 bucket。
# bucket_name
对于不同的bucket类型,bucket_name具有不同的含义:
对于本地存储的bucket,bucket_name为bucket在本地文件系统的绝对路径或相对路径,且系统将对指定的路径进行以下有效性判断:
- 允许指定一个不存在的目录,执行本语句将创建该目录。
- 允许指定一个已存在的目录,但该目录不能为已被其他bucket使用的路径。
- 系统对指定的目录必须拥有写权限。
对于S3 bucket,bucket_name为逻辑名称,用于在数据库内查询具体的bucket信息。
示例
--如下语句将新建lsc_tb表空间,同时于$YASDB_DATA/local_fs目录下新建lscfile1/lscfile2两个bucket,同时也将默认新建一个名称为LSC_TB0的数据文件
CREATE TABLESPACE lsc_tb DATABUCKET '?/local_fs/lscfile1','?/local_fs/lscfile2';
# s3_bucket_clause
该语句用于指定S3 bucket的访问信息。
# url
用于指定访问地址,不可省略,最大值为1023字节。
# region
用于指定S3 bucket的物理所属区域,可省略,省略则默认使用对象存储服务的默认配置,最大值为127字节。
# access key
用于标识客户端身份,不可省略,最大值为127字节。
# secret key
访问密钥,不可省略,最大值为127字节。
# maxsize size_clause
用于指定bucket的大小,可省略,省略则默认为UNLIMITED。
示例
--如下语句将新建s3_tablespace表空间并挂载S3 bucket
CREATE TABLESPACE s3_tablespace DATABUCKET 's3_bucket3' S3(URL '192.168.0.1:8000/s3bucket',ACCESS key 'ak',secret key 'sk') MAXSIZE 8G;
# encryption_clause
该语句用于指定表空间加密属性,以ENCRYPTION开头。本语句可省略,表示创建的表空间为非加密表空间。 指定为ENCRYPT时,表示创建的表空间为加密表空间,即该表空间对应存储介质上的数据将被加密。YashanDB对加密表空间的约束规则如下:
- 不能将内置表空间指定为加密表空间。
- 对于加密表空间的表对象,在其上创建的索引和AC也必须位于某个加密表空间。
- 加密属性在创建表空间时指定,后续不可更改。
对于分区表,系统并不限制各分区所在的表空间加密属性是否一致,在更新操作引发的数据分区移动时,该数据将依据新分区的加密属性按明文或密文存储。
示例
-- 如下语句将新建yashan1表空间,并指定为加密表空间
CREATE TABLESPACE yashan1 ENCRYPTION ENCRYPT;
# compress_clause
该语句用于指定表空间压缩属性,以COMPRESS开头,压缩算法仅支持LZ4和ZSTD,不指定压缩算法默认是LZ4。本语句可省略,表示创建的表空间为非压缩表空间。 指定为COMPRESS时,表示创建的表空间为压缩表空间,即该表空间对应存储介质上的数据将被压缩。YashanDB对压缩表空间的约束规则如下:
- 不能将内置表空间指定为压缩表空间。
- 压缩属性在创建表空间时指定,后续不可更改。
- 如果表空间的数据文件所在文件系统不支持punch hole或者其页面大小不是1024、2048或4096,则无法创建压缩表空间。
- 部分文件系统不支持压缩表空间,常见支持的文件系统有:XFS、ext4、Btrfs、tmpfs(5)、gfs2(5)等。
共享集群部署中不允许指定compress_clause。
示例
-- 如下语句将新建yashan1表空间,并指定为压缩表空间
CREATE TABLESPACE yashan1 COMPRESS;
CREATE TABLESPACE yashan1 COMPRESS lz4;
CREATE TABLESPACE yashan1 COMPRESS zstd;