大家好,欢迎来到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
运行结果如下图所示:
开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