openGauss开源数据库实战六

任务六 理解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

结果如下图所示:
Fig06_01
实验结论:在一个 openGauss DBMS 上,一个数据库可以创建多个数据库(testdb、testdb1、testdb2、testdb3)。

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

执行下面的 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;

在这里插入图片描述

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

重新打开3个Linux终端窗口,使用用户user0分别连接并登录到数据库testdb1、testdb2、testdb3。
在第1个Linux终端窗口执行下面的命令和语句,使用数据库用户user0登录到数据库testdb1,创建一个表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;

在这里插入图片描述

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

在机构组织的数据库中,如果一个机构有很多的应用,可以为每个应用各创建一个模式;如
果一个机构有很多的部门,也可以为每个部门各创建一个模式。例子:使用用户zqf连接到数据库testdb,首先查看当前数据库下有哪些模式,然后为数据库testdb创建4个模式——s1user、s2user、s3user和s4user,最后再次查看数据库testdb下有哪些模式。

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));

上述的语句执行成功,说明可以在一个数据库的不同模式下创建同名的表。
执行下面的SOL语句,往4个模式下的表ttt分别插人一条数据:

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中创建,这个表就会存储在这个指定的表空间中。也就是说,一个数据库中的对象可以位于不同的表空间。

七、任务的扫尾工作

继续学习之前,关闭目前所有的Linux终端窗口,然后再打开一个新的Linux终端窗口,进行任务清理工作。
执行如下的命令和SQL语句,删除为了测试openGauss体系结构而创建的数据库testdb、testdb1、testdb2、testdb3:

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;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值