3.3 表空间的创建、修改和删除
如果需要把不同的表放在不同的存储介质或不同的文件系统下,则要用到“表空间”的概念。对于PostgreSQL来说,表空间为表等对象指定一个存储的目录。
3.3.1 实例1:创建表空间
1.语法
创建表空间的语法格式如下:
在上述语法中,大写字符是关键字,小写字符是自定义的名称和路径。
提示:
PostgreSQL的SQL命令不区分大小写,在实际使用过程中,用户可以根据习惯选择使用大写或小写。本章为了统一,所有SQL命令都使用大写字符来标注关键字。
参数说明如下所述。
● tablespace_name:自定义的表空间名称。表空间名称不能以“pg_”开头,这些名称为系统表空间预留。
● user_name:表空间所属用户名称。如果语句中没有指定user_name,则默认执行该语句的用户即为所属用户。
● directory:表空间对应的路径。该路径必须是空目录,而且属于执行该命令的系统用户。在PostgreSQL数据目录的根目录下,有一个以“pg_tblspc”命名的路径。在该路径下存储着到表空间对应路径的符号链接。因此,只能在支持符号链接的系统上使用表空间。
● tablespace_option:设置或重置表空间参数。目前,只有seq_page_cost、random_page_cost和effective_io_concurrency三个参数可以设置。如果在比I/O子系统的其余部分更快或更慢的磁盘上存储表空间,则这些配置项将变得非常有意义。可以使用SET命令设置这3个配置项,或者通过修改配置文件的方式设置这3个配置项。
提示:
seq_page_cost:在磁盘上按顺序扫描获取一个页面的代价,默认值是1.0。
random_page_cost:在磁盘上随机扫描获取一个页面的代价,默认值是4.0。
effective_io_concurrency:可以执行并发异步磁盘I/O的数量。
2.实例
(1)创建表空间,名称为tbs_test,对应的路径为“/pgdata/hrdata”,代码如下:
(2)创建表空间后,会在“$PGDATA/pg_tblspc/”目录下产生一个符号链接。其中,“16538”是表空间tbs_test的对象标识符(OID),该链接指向表空间的路径,代码如下:
(3)在“/pgdata/hrdata”目录下创建一个版本相关的子目录,即“PG_′Major version′_′Catalogue version number′”。例如,在本例中生成PG_10_201707211,代码如下:
(4)如果在该表空间下创建表,那么表对应的目录会存储在“PG_10_201707211”目录下。以下实例创建表空间失败,因为表空间名称以“pg_”开头,代码如下:
(5)创建表空间,名称为tbs_test01,对应的路径为“/pgdata/hrdata”,并将所属权赋给hr用户,hr用户是事先创建好的,代码如下:
提示:
在执行CREATE DATABASE、CREATE TABLE、CREATE INDEX或ADD CONSTRAINT命令时可以指定表空间,以便将这些对象存储在特定的表空间上。
3.3.2 实例2:修改表空间
修改表空间的语法格式如下:
参数说明如下所述。
● RENAME TO:用于更改表空间名称。
● OWNER TO:用于更改表空间所属用户。
● SET和RESET:用于设置表空间参数。
【举例】将表空间“tbs_test01”重命名为“tbs_test02”,代码如下:
【举例】将表空间“tbs_test02”的所有权赋给hr02用户,其中,hr02用户也是事先创建好的,代码如下:
其中,ALTER TABLESPACE是PostgreSQL特有的语法。
3.3.3 实例3:删除表空间
删除表空间的语法格式如下:
其中,加上“IF EXISTS”可选关键字,在删除表空间时,如果该表空间不存在,则不会报错,只会打印NOTICE信息。
【举例】删除一个存在的表空间tbs_test02,代码如下:
【举例】删除一个不存在的表空间tbs_test03,当不加上“IF EXISTS”关键字时,执行结果如下:
【举例】删除一个不存在的表空间tbs_test03,当加上“IF EXISTS”关键字时,执行结果如下:
只有表空间的所属用户或超级用户才可以删除该表空间。在删除表空间之前,必须保证其上所有的数据库对象已经被清空。如果仍然有数据文件放在该表空间上,则DROP命令执行失败。