openGauss开源数据库实战六

openGauss开源数据库实战六通过本任务理解 openGaussDBM 的体系结构概念 一个数据库集群包含多个数据库 一个数据库包含多个模式 数据库和模式是数据库对象的容器 一个数据库可以被多个用户访问 用户一次只能访问一个数据

大家好,欢迎来到IT知识分享网。

任务六 理解openGauss体系结构中的基本概念

任务目标

通过本任务理解openGauss DBMS的体系结构概念: 一个数据库集群包含多个数据库; 一个数据库包含多个模式; 数据库和模式是数据库对象的容器; 一个数据库可以被多个用户访问; 用户一次只能访问一个数据库,但可以访问该数据库下多个模式中的数据库对象; 一个数据库中的对象可以存储在多个表空间中。

实施步骤

一、验证:一个数据库集群可以有多个数据库

使用 omm 用户登陆到 postgres 数据库:

gsql -d postgres -p 26000 -r 

在数据库中输入下列 sql 命令,创建表空间 test_ts 和数据库 testdb,testdb1,testdb2,testdb3:

CREATE TABLESPACE test_ts RELATIVE LOCATION 'tablespace/test_ts1'; CREATE DATABASE testdb WITH TABLESPACE = test_ts; CREATE DATABASE testdb1 WITH TABLESPACE = test_ts; CREATE DATABASE testdb2 WITH TABLESPACE = test_ts; CREATE DATABASE testdb3 WITH TABLESPACE = test_ts; 

执行下面命令,查看 openGauss DBMS 上有哪些表空间:

\db 

执行下面命令,查看 openGauss DBMS 上有哪些数据库:

\l 

二、验证:一个数据库可以被多个用户访问

执行下面的 SQL 语句,创建用户 user、user1、user2、user3:

CREATE USER user0 IDENTIFIED BY 'user@ustb2020'; CREATE USER user1 IDENTIFIED BY 'user@ustb2020'; CREATE USER user2 IDENTIFIED BY 'user@ustb2020'; CREATE USER user3 IDENTIFIED BY 'user@ustb2020'; 

为了使实验简单一些,可以授予zqf、zqf1、zq2、zq3数据库系统的SYSADMN权限:

ALTER USER user0 SYSADMIN; ALTER USER user1 SYSADMIN; ALTER USER user2 SYSADMIN; ALTER USER user3 SYSADMIN; 

执行下面的命令,查看有哪些用户:

\du 

运行结果如下图所示:

Fig06_02
开3个Linux终端窗口,分别使用用户user1、user2、user 3访问数据库testdb。
在第1个Linux终端窗口执行下面的命令和语句,以数据库用户user1的身份在数据库testdb中创建表t1,并插人一条数据:

gsql -d testdb -h 192.168.100.91 -U zqf1 -p 26000 -W zqf@ustb2020 -r 
create table t1(col1 char(10)); insert into t1 values('Hello!1'); select * from t1; 

在这里插入图片描述

在第2个Linux终端窗口执行下面的命令和语句,以数据库用户user2的身份在数据库testdb中创建表t2,并插入一条数据:

gsql -d testdb -h 192.168.100.91 -U user2 -p 26000 -W user@ustb2020 -r 
create table t2(col1 char(10)); insert into t2 values('Hello!2'); select * from t2; 

在这里插入图片描述
在第3个Linux终端窗口执行下面的命令和语句,以数据库用户user3的身份在数据库testdb中创建表t3,并插入一条数据:

gsql -d testdb -h 192.168.100.91 -U user3 -p 26000 -W user@ustb2020 -r 
create table t3(col1 char(10)); insert into t3 values('Hello!3'); select * from t3; 

在这里插入图片描述

任选上面3个窗口之一,使用user1、user2、user3这3个用户中的任何一个,执行如下命令,查看当前数据库testdb中有哪些表:

\dt 

在这里插入图片描述
以上实验表明,数据库testdb可以被用户user1、user2、user3访问(分别在数据库中创建了一个表、插入一行数据、进行查询)。也就是说,一个数据库可以被多个用户访问。

因为用户user1、user2、user3具有数据库系统的SYSADMIN权限,因此这几个用户可以随便查看相互之间创建的表的数据。也就是说,使用用户user1、user2、user3中的任何一个连接到数据库testdb,可以查看这3个用户创建的所有表的内容。下面的测试可以验证这一点。重新打开一个Linux终端窗口,执行如下命令,使用用户user3连接到数据库testdb,并查询刚才分别由3个用户创建的测试表t1、2和3:

gsql -d testdb1 -h 192.168.100.91 -U user -p 26000 -W user@ustb2020 -r 
create table t11(col1 char(10)); insert into t11 values('Hello!11'); select * from t11; 

在这里插入图片描述

三、验证:一个用户可以访问多个数据库

gsql -d testdb -h 192.168.100.91 -U user3 -p 26000 -W user@ustb2020 -r 
select * from t1; select * from t2; select * from t3; 

在这里插入图片描述
在第2个Linux终端窗口执行下面的命令和语句,使用数据库用户user0登录到数据库testdb2,创建一个表t21,并插入一条数据:

gsql -d testdb2 -h 192.168.100.91 -U user0 -p 26000 -W user@ustb2020 -r 
create table t21(col1 char(10)); insert into t21 values('Hello!11'); select * from t21; 

在这里插入图片描述
在第3个Linux终端窗口执行下面的命令和语句,使用数据库用户user0登录到数据库testdb3,创建一个表t31,并插入一条数据:

gsql -d testdb3 -h 192.168.100.91 -U user0 -p 26000 -W user@ustb2020 -r 
create table t31(col1 char(10)); insert into t31 values('Hello!31'); select * from t31; 

在这里插入图片描述
实验结论:
1)数据库用户user0可以多次连接访问不同的数据库(testdb1、testdb2、testdb3)。
2)数据库用户user0可以在不同的数据库中创建数据库对象。本例中,在数据库testdb1中创
建了表t11,在数据库testdb2中创建了表t21,在数据库testdb3中创建了表t31。



四、验证:用户一次只能连接到一个数据库,无法访问其他数据库的对象

使用户user0连接到数据库testdb1,并访问数据库testdb1下的表t11:

gsql -d testdb1 -h 192.168.100.91 -U user0 -p 26000 -W user@ustb2020 -r 
select * from testdb1.public.t11; 
select * from testdb2.public.t21; 

在这里插入图片描述

五、验证:在一个数据库中可以创建多个模式

gsql -d testdb -h 192.168.100.91 -U user0 -p 26000 -W user@ustb2020 -r 
\dn create schema s1user; create schema s2user; create schema s3user; create schema s4user; \dn 

在这里插入图片描述
从上面的实验可以看到,已经在数据库testdb下创建了4个模式s1user、s2user、s3user、s4user,它们都是用户zqf创建的。
执行下面的SQL语句,在数据库testdb的不同模式下创建同名的表:

create table s1user.ttt(col varchar(100)); create table s2user.ttt(col varchar(100)); create table s3user.ttt(col varchar(100)); create table s4user.ttt(col varchar(100)); 
insert into s1user.ttt values('Hello! from schema s1user 11111'); insert into s2user.ttt values('Hello! from schema s2user 22222'); insert into s3user.ttt values('Hello! from schema s3user 33333'); insert into s4user.ttt values('Hello! from schema s4user 44444'); 

在这里插入图片描述
上述的语句执行成功,说明在同一个数据库下,可以直接使用SchemaName.TableName形式来指定一个表,且可以省略数据库名。
执行下面的SQL语句,查看数据库testdb下目前有哪些表:

create or replace view my_tables as select table_catalog, table_schema, table_name, table_type from information_schema.tables where table_schema not in ('pg_catalog', 'information_schema','dbe_perf'); select * from my_tables; 

执行下面的命令,查看用户在数据库中模式搜索路径:

show SEARCH_PATH; 

默认情况下,可以使用表名直接访问public模式下的表(不需要加模式名public作为前缀):

select * from t1; select * from t2; select * from t3; 

在这里插入图片描述
这是因为在默认情况下,模式的搜索路径是public模式。
访问数据库中其他模式下的表需要指定其模式名作为前缀:

select * from s1user.ttt; select * from s2user.ttt; select * from s3user.ttt; select * from s4user.ttt; 

在这里插入图片描述
实验结论:一个用户连接到数据库后,可以在这个数据库下创建多个模式。要访问这些模式,可以使用 DatabascName.SchemaName.TableName 或者 SchemaName.TableName 形式来访问某个模式下的一个表。默认情况下,访问public模式下的表可以不用添加模式名前缀。

六、验证:一个数据库可以存储在多个表空间中

打开一个Linux终端窗口,执行下面的命令,创建一个新的名为testnew_ts的表空间:

gsql -d postgres -p 26000 -r 
CREATE TABLESPACE testnew_ts RELATIVE LOCATION 'tablespace/testnew_ts1'; 

执行下面的命令,查看当前有哪些表空间:

\db 

在这里插入图片描述
打开另外一个Linux终端窗口,使用用户user0登录到openGauss数据库,查看数据库testdb下目前有哪些表:

gsql -d testdb -h 192.168.100.91 -U user0 -p 26000 -W user@ustb2020 -r 
create or replace view my_tables as select table_catalog, table_schema, table_name, table_type from information_schema.tables where table_schema not in ('pg_catalog', 'information_schema','dbe_perf'); select * from my_tables; 

在这里插入图片描述
接着执行下面的SQL语句,在表空间testnew_s中创建表table_in_testnew_s:

create table table_in_testnew_ts (col1 char(10)) tablespace testnew_ts; 

执行下面的SQL语句,再次查看数据库testdb下目前有哪些表:

create or replace view my_tables as select table_catalog, table_schema, table_name, table_type from information_schema.tables where table_schema not in ('pg_catalog', 'information_schema','dbe_perf'); select * from my_tables; 

在这里插入图片描述
实验结论:前面在数据库testdb中创建的所有的表,由于创建表时,没有指定表空间的名字,因此都创建在数据库默认的表空间test_ts中。当我们在数据库testdb中创建表table_in_testnew_ts时,如果明确指定在表空间testnew_ts中创建,这个表就会存储在这个指定的表空间中。也就是说,一个数据库中的对象可以位于不同的表空间。

七、任务的扫尾工作

gsql -d postgres -p 26000 -r 
drop database testdb; drop database testdb1; drop database testdb2; drop database testdb3; 

执行如下的SQL语句,删除为了测试openGauss体系结构而创建的数据库用户user0、user1、user2、user3:

drop user user0; drop user user1; drop user user2; drop user user3; 

执行如下的SQL语句,删除为了测试openGauss体系结构而创建的表空间test_ts、testnew_ts:

drop tablespace test_ts; drop tablespace testnew_ts; 

在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/126433.html

(0)
上一篇 2025-09-18 20:00
下一篇 2025-09-18 20:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信