#CREATE TABLESPACE

# 通用描述

CREATE TABLESPACE用于在数据库中创建一个新的表空间。

SYSTEM/SYSAUX/UNDO表空间在CREATE DATABASE时自动创建,分布式部署中的SWAP表空间和TEMP临时表空间也在CREATE DATABASE时自动创建,不能用CREATE TABLESPACE语句创建。

单机/分布式部署中,可同时指定挂载到该表空间的数据文件(不指定时系统自动创建一个数据文件并挂载)和数据桶(bucket,对象存储目录,包含slice文件,不指定时系统不会自动创建)。在创建LSC表所属表空间时,必须同时进行数据桶挂载,否则该表空间下将无法创建LSC表,除非通过ALTER TABLESPACE语句为该表空间进行bucket挂载。

分布式部署中创建新表空间出现节点故障时,恢复措施见用户表空间管理章节描述。

# 语句定义

create tablespace::=

syntax
CREATE permanent_tablespace_clause temporary_tablespace_clause swap_tablespace_clause

permanent_tablespace_clause::=

syntax
BIGFILE SMALLFILE TABLESPACE tablespace_name datafile_clause extent_management_clause MEMORY MAPPED databucket_clause encryption_clause compress_clause

temporary_tablespace_clause::=

syntax
TEMPORARY TABLESPACE LOCAL TEMPORARY TABLESPACE FOR ALL LEAF tablespace_name datafile_clause extent_management_clause

swap_tablespace_clause::=

syntax
SWAP TABLESPACE LOCAL SWAP TABLESPACE tablespace_name datafile_clause

datafile_clause::=

syntax
DATAFILE TEMPFILE file_specification ,

file_specification::=

syntax
file_name SIZE size_clause AUTOEXTEND OFF ON NEXT size_clause MAXSIZE UNLIMITED size_clause PARALLEL parallel

extent_management_clause::=

syntax
EXTENT AUTOALLOCATE UNIFORM SIZE size_clause

databucket_clause::=

syntax
DATABUCKET bucket_clause ,

bucket_clause::=

syntax
bucket_name s3_bucket_clause MAXSIZE size_clause

s3_bucket_clause::=

syntax
S3 ( URL 'url' , REGION region , ACCESS KEY access_key , SECRET KEY secret_key )

encryption_clause::=

syntax
ENCRYPTION USING ' AES128 ' ' SM4 ' ENCRYPT

compress_clause::=

syntax
COMPRESS LZ4 ZSTD

# permanent_tablespace_clause

该语句用于在数据库中创建一个新的表空间,表空间中的对象存储在数据文件或者数据桶中。

# bigfile | smallfile

仅用于语法兼容,无实际含义。

# temporary_tablespace_clause

该语句用于指定创建临时表空间,其中包含的数据仅在用户会话期间持续,临时表空间中的对象存储在临时文件中。 该语句有两种创建临时表空间的方式,包括创建TEMP临时表空间以及创建本地临时表空间。其中有如下规则:

  • 在单机部署中,只能创建TEMP临时表空间,不能创建本地临时表空间。
  • 在共享集群部署中,TEMP临时表空间的临时文件仅支持YFS路径,而本地临时表空间的临时文件支持YFS与本地磁盘路径,但不允许同一个表空间同时存在YFS路径与本地磁盘路径。

Note:

在主备部署场景中,主库创建临时表空间时,备库会同步创建临时表空间和影子状态的同名临时文件,影子文件只会记录在ctrlfile中,不会在磁盘上生成实体物理文件,可查询V$DATAFILE的SHADOW字段获取其相关信息。

若备库升主后因临时文件为影子状态无法使用,需手动添加新的临时文件供使用。

示例(单机部署)

CREATE TEMPORARY TABLESPACE shared_temp TEMPFILE '?/dbfiles/shared_temp.dbf' SIZE 4M;

示例(共享集群部署)

CREATE TEMPORARY TABLESPACE shared_temp TEMPFILE '+DG0/dbfiles/shared_temp.dbf' SIZE 4M;
CREATE LOCAL TEMPORARY TABLESPACE FOR ALL local_temp TEMPFILE '?/dbfiles/local_temp.dbf' SIZE 4M;

# swap_tablespace_clause

该语句用于指定创建SWAP表空间,其中包含的数据仅在用户会话期间持续,SWAP表空间中的对象存储在临时文件中。 该语句有两种创建SWAP表空间的方式,包括创建SWAP表空间以及创建本地SWAP表空间。其中有如下规则:

  • 在单机部署中,只能创建SWAP表空间,不能创建本地SWAP表空间。
  • 在共享集群部署中,SWAP表空间的临时文件仅支持YFS路径,而本地SWAP表空间的临时文件支持YFS与本地磁盘路径,但不允许同一个表空间同时存在YFS路径与本地磁盘路径。

示例(单机部署)

CREATE SWAP TABLESPACE shared_swap TEMPFILE '?/dbfiles/shared_swap' SIZE 4M;  

示例(共享集群部署)

CREATE SWAP TABLESPACE shared_swap TEMPFILE '+DG0/dbfiles/shared_swap' SIZE 4M;
CREATE LOCAL SWAP TABLESPACE local_swap TEMPFILE '?/dbfiles/local_swap' SIZE 4M;

# tablespace_name

该语句用于指定要创建的表空间的名称,不可省略,且需符合YashanDB的对象命名规范

分布式部署需注意创建的表空间的名称不可与已有的表空间集中分配的表空间名称相同,否则会返回错误。

示例

--使用所有的默认选项创建一个表空间
CREATE TABLESPACE yashan;

# datafile_clause

该语句用于指定创建表空间对应的数据文件,可省略,则系统按如下规则自动创建一个数据文件:

  • 文件名称由表空间名称以及数据文件在表空间内的序号组合生成,如:tablespace_name1,tablespace_name2...,且统一转换为大写。
  • 文件的默认大小为8192个BLOCK,文件路径为系统默认的数据文件路径。
  • 对于非MEMORY MAPPED表空间,默认文件开启自动扩展,next为8192个块,maxsize为64MB个块。
  • 如果没有显式的规定extent分配方式,extent的默认分配方式为系统自动分配。
  • 只能使用TEMPFILE关键字创建临时表空间或SWAP表空间。
  • 对于本地临时表空间以及本地SWAP表空间而言,添加一个文件等于添加一组文件,每一组文件数量的个数等于集群实例个数。

# 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分配方式每次为对象分配的extent空间为固定值。

  • 创建表空间后不能修改extent分配方式。
  • 创建临时表空间若不指定extent分配方式,默认使用UNIFORM分配方式,大小为8个BLOCK。
  • 创建SWAP表空间不可指定extent分配方式,默认使用UNIFORM分配方式,大小为8个BLOCK。
  • 创建非临时表空间若不指定extent分配方式,默认使用AUTOALLOCATE分配方式。
  • 使用UNIFORM分配方式的表空间内的每个数据文件大小都必须大于UNIFORM SIZE。

示例

CREATE TABLESPACE yashan2 DATAFILE 'yashan2' 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 yashan3 DATAFILE 'yashan3' SIZE 4M EXTENT UNIFORM SIZE 64K MEMORY MAPPED; 
CREATE TABLESPACE yashan4 DATAFILE 'yashan4' 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的访问信息。

Note

该功能默认无法使用,如需使用请联系我们的技术支持处理。

# 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也必须位于某个加密表空间。
  • 加密属性在创建表空间时指定,后续不可更改。

对于分区表,系统并不限制各分区所在的表空间加密属性是否一致,在更新操作引发的数据分区移动时,该数据将依据新分区的加密属性按明文或密文存储。

USING字段支持指定加密算法为'ASE128'或'SM4',如不指定,默认加密算法为SM4。

示例

-- 如下语句将新建表空间,并指定为加密表空间
CREATE TABLESPACE encrypt_tb ENCRYPTION ENCRYPT;
-- 如下语句将新建加密表空间,并指定采用AES128加密算法加密。
CREATE TABLESPACE aes128_tb ENCRYPTION USING 'AES128' ENCRYPT;

# compress_clause

该语句用于指定表空间压缩属性,以COMPRESS开头,压缩算法仅支持LZ4和ZSTD,不指定压缩算法默认是LZ4。本语句可省略,表示创建的表空间为非压缩表空间。

指定为COMPRESS时,表示创建的表空间为压缩表空间,即该表空间对应存储介质上的数据将被压缩。YashanDB对压缩表空间的约束规则如下:

  • 不能将内置表空间指定为压缩表空间。
  • 压缩属性在创建表空间时指定,后续不可更改。
  • 如果表空间的数据文件所在文件系统不支持punch hole或者其页面大小不是1024、2048或4096,则无法创建压缩表空间。
  • 部分文件系统不支持压缩表空间,常见支持的文件系统有:XFS、ext4、Btrfs、tmpfs(5)、gfs2(5)等。

共享集群部署中,创建本地临时表空间或者本地swap表空间本地磁盘文件时可以指定compress_clause,其他创建表空间操作不允许指定compress_clause。

示例(单机、分布式部署)

-- 如下语句将新建表空间,并指定为压缩表空间
CREATE TABLESPACE cmprss_tb COMPRESS;
CREATE TABLESPACE lz4_tb COMPRESS lz4;
CREATE TABLESPACE zstd_tb COMPRESS zstd;