深入浅出PostgreSQL
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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命令执行失败。