暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

openGauss每日一练第7天 | openGauss 表空间管理及课后作业

1707

openGauss 每日一练第 7 天学习打卡,巩固 openGauss 数据库表空间管理基本操作!

学习目标

学习 openGauss 表空间,用于管理数据对象.

前面每日一练链接:

openGauss每日一练第1天 | 数据库和表的基本操作(一)
openGauss每日一练第2天 | 数据库和表的基本操作(二)
openGauss每日一练第3天 | 前三课作业实操练习
openGauss每日一练第4天 | openGauss 角色管理及课后作业
openGauss每日一练第5天 | openGauss 用户管理及课后作业
openGauss每日一练第6天 | openGauss 模式管理及课后作业

课程学习

表空间用于管理数据对象,与磁盘上的一个目录对应。

注意:在启动 gsql 的命令行中加上“-E”参数,就可以把 gsql 中各种以“\”开头的命令执行的实际 SQL 语句打印出来.如果在已运行的 gsql 中显示了某个命令实际执行的 SQL 语句后又想关闭此功能,该怎么办?这时可以使用“\set ECHO_HIDDEN on|off”命令。

连接 openGauss

su - omm
gsql -r

gsql -r -h localhost -U user1 -W JiekeXu12 -d postgres

1.创建表空间

注意事项

系统管理员或者继承了内置角色gs_roles_tablespace权限的用户可以创建表空间。
不允许在一个事务块内部执行CREATE TABLESPACE。
执行CREATE TABLESPACE失败,如果内部创建目录(文件)操作成功了就会产生残留的目录(文件),重新创建时需要用户手动清理表空间指定的目录下残留的内容。如果在创建过程中涉及到数据目录下的表空间软连接残留,需要先将软连接的残留文件删除,再重新执行OM相关操作。
CREATE TABLESPACE不支持两阶段事务,如果部分节点执行失败,不支持回滚。
创建表空间前的准备工作参考下述参数说明。
在HCS等场景下一般不建议用户使用自定义的表空间。原因:用户自定义表空间通常配合主存(即默认表空间所在的存储设备,如磁盘)以外的其它存储介质使用,以隔离不同业务可以使用的IO资源,而在HCS等场景下,存储设备都是采用标准化的配置,无其它可用的存储介质,自定义表空间使用不当不利于系统长稳运行以及影响整体性能,因此建议使用默认表空间即可。

语法格式

CREATE TABLESPACE tablespace_name
    [ OWNER user_name ] [RELATIVE] LOCATION 'directory' [ MAXSIZE 'space_size' ]
    [with_option_clause];

其中普通表空间的 with_option_clause 为:

WITH ( {filesystem= { 'general'| "general" | general} |
    random_page_cost = { 'value ' | value } |
    seq_page_cost = { 'value ' | value }}[,...])

参数说明

tablespace_name

要创建的表空间名称。

表空间名称不能和openGauss中的其他表空间重名,且名称不能以 “pg” 开头,这样的名称留给系统表空间使用。

取值范围:字符串,要符合标识符的命名规范。

OWNER user_name

指定该表空间的所有者。缺省时,新表空间的所有者是当前用户。

只有系统管理员可以创建表空间,但是可以通过OWNER子句把表空间的所有权赋给其他非系统管理员。

取值范围:字符串,已存在的用户。

RELATIVE

使用相对路径,LOCATION目录是相对于各个数据库节点数据目录下的。

目录层次:数据库节点的数据目录/pg_location/相对路径

相对路径最多指定两层。

LOCATION directory

用于表空间的目录,对于目录有如下要求:
    openGauss系统用户必须对该目录拥有读写权限,并且目录为空。如果该目录不存在,将由系统自动创建。
    目录必须是绝对路径,目录中不得含有特殊字符(如$,> 等)。
    目录不允许指定在数据库数据目录下。
    目录需为本地路径。

取值范围:字符串,有效的目录。

MAXSIZE 'space_size'

指定表空间在单个数据库节点上的最大值。

取值范围:字符串格式为正整数+单位,单位当前支持K/M/G/T/P。解析后的数值以K为单位,且范围不能够超过64比特表示的有符号整数,即1KB~9007199254740991KB。

random_page_cost

指定随机读取page的开销。

取值范围:0~1.79769e+308。

默认值:使用GUC参数random_page_cost的值。

seq_page_cost

指定顺序读取page的开销。

取值范围:0~1.79769e+308。

默认值:使用GUC参数seq_page_cost的值。

–使用相对路径指定表空间的目录:数据库节点的数据目录 /pg_location/ 相对路径

CREATE TABLESPACE ds_location1 RELATIVE LOCATION 'tablespace/tablespace_1';

–指定 owner

CREATE ROLE joe IDENTIFIED BY 'abce@123';
CREATE TABLESPACE ds_location2 OWNER joe RELATIVE LOCATION 'tablespace/tablespace_2';

–查看表空间信息

omm=# \db
********* QUERY **********
SELECT spcname AS "Name",
  pg_catalog.pg_get_userbyid(spcowner) AS "Owner",
  pg_catalog.pg_tablespace_location(oid) AS "Location"
FROM pg_catalog.pg_tablespace
ORDER BY 1;
**************************

      List of tablespaces
    Name    | Owner | Location 
------------+-------+----------
 pg_default | omm   | 
 pg_global  | omm   | 
(2 rows)

图片.png

2.修改表空间属性

–重命名表空间

ALTER TABLESPACE ds_location1 RENAME TO ds_location3;

图片.png

–修改表空间 owner

CREATE ROLE jay IDENTIFIED BY 'abcd@789';
ALTER TABLESPACE ds_location2 OWNER TO jay;

–查看表空间信息

\db

图片.png

3.在表空间中建表

create table ds_t1(id int, name char(30)) tablespace ds_location2;

–通过视图查看表所在的表空间

select * from pg_tables where tablename = 'ds_t1';

图片.png

4.删除表空间

注意事项

只有表空间所有者或者被授予了表空间DROP权限的用户有权限执行DROP TABLESPACE命令,系统管理员默认拥有此权限。
在删除一个表空间之前,表空间里面不能有任何数据库对象,否则会报错。
DROP TABLESPACE不支持回滚,因此,不能出现在事务块内部。
执行DROP TABLESPACE操作时,如果有另外的会话执行\db查询操作,可能会由于tablespace事务的原因导致查询失败,请重新执行\db查询操作。
如果执行DROP TABLESPACE失败,需要再次执行一次DROP TABLESPACE IF EXISTS。

–在删除一个表空间之前,表空间里面不能有任何数据库对象

omm=# DROP TABLESPACE IF EXISTS ds_location2;
ERROR:  tablespace "ds_location2" is not empty

这一点和 Oracle 不太一样,Oracle 可直接删除。

drop table ds_t1;
DROP TABLESPACE IF EXISTS ds_location2;
DROP TABLESPACE IF EXISTS ds_location3;

图片.png

课程作业

1.创建表空间,表空间tspc1使用相对路径指定所在目录,表空间tspc2指定owner为Lucy

CREATE TABLESPACE tspc1 RELATIVE LOCATION 'tablespace/tspc1';

CREATE ROLE Lucy password 'JiekeXu1';
\du
CREATE TABLESPACE tspc2  owner Lucy RELATIVE LOCATION 'tablespace/tspc2';

图片.png

2.在表空间tspc1中建表,并使用视图 pg_tables 查看信息

create table jiekexu(id int,name char(30)) tablespace tspc1;
select * from pg_tables where tablename = 'jiekexu';

图片.png

3.重命名tspc1,修改tspc2的用户为Lily,使用\db查看表空间信息

alter tablespace tspc1 rename to jiekexu_tspc1;
\db
CREATE ROLE Lily password 'JiekeXu1';
alter tablespace tspc2 owner to Lily;
\db

图片.png

4.删除表空间

drop table jiekexu;
drop tablespace jiekexu_tspc1;
drop tablespace tspc2;

图片.png

欧耶,第七课表空间管理实操及课后作业练习题完成啦!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论