账号名:Sandbox-Voyager1291
用户名:Sandbox-user
密码:kwyQLL-,*986
一 登录华为云
https://www.huaweicloud.com
注意:
如后续关闭浏览器重新登录或自动登录失败,可按如此步骤登录:选择【IAM用户登录】模式,于登录对话框中输入系统为您分配的华为云实验账号和密码登录华为云,切勿使用您自己的华为云账号登录。)
二 购买 GaussDB 实例
进入“控制台”
选择“数据库 > 云数据库 GaussDB”,进入云数据库 GaussDB 控制台。点击页面右上角的 [购买数据库实例]。
实例名称设置为:gauss-hccdp
数据库版本:2.7企业版
实例类型为:主备版
管理员账户 root (这是GaussDb主节点和备节点的os的root用户的密码)
管理员密码 NHY^7ujm
确认密码 NHY^7ujm
二 远程登录 ECS 服务器,下载 gsql 客户端并解压 展开
1通过CloudShell登录ECS服务器
这里的root密码是这个ECS服务器的密码,这个ECS服务器就是一个跳板机而已,张祥峰简称为“ECS跳板机”,通过这个跳板机去访问gaussdb主备节点,只有在这个跳板机里才能够访问到gaussdb主备节点,这就是这个跳板机的存在价值。
这个ECS跳板机的OS的root密码的修改在这里来个,如下。
这里是登录这个
ECS跳板机的OS的root密码为GaussDB@123
2 下载gsql客户端,并解压
# wget https://dbs-download.obs.cn-north-1.myhuaweicloud.com/GaussDB/1642684986086/GaussDB_opengauss_client_tools.zip
默认保存在/root目录下,因为我们是以root用户登录的。
# unzip GaussDB_opengauss_client_tools.zip
# cd /root/GaussDB_opengauss_client_tools/Euler2.5_X86_64
# tar -xzvf GaussDB-Kernel-V500R001C20-EULER-64bit-gsql.tar.gz
# source gsql_env.sh
# pwd
返回/root/GaussDB_opengauss_client_tools/Euler2.5_X86_64
# cp GaussDB-Kernel-V500R001C20-EULER-64bit-gsql.tar.gz /opt
cd /opt/
tar -zxvf GaussDB-Kernel-V500R001C20-EULER-64bit-gsql.tar.gz
source gsql_env.sh
3使用gsql客户端连接数据库,并创建数据库及对应用户
以下命令的【192.168.0.72】是GaussDB主节点的IP,Test-1234是数据库密码,请根据实际情况替换。
这个【192.168.0.72】在哪里找呢?
gsql -h 192.168.0.72 -d postgres -p 8000 -U root -W Test-1234 -r
CREATE DATABASE devdb ENCODING 'UTF8' template = template0;
\q
gsql -h 192.168.0.72 -d devdb -p 8000 -U root -W Test-1234 -r
CREATE USER hccdp SYSADMIN IDENTIFIED BY "NHY^7ujm";
\q
gsql -h 192.168.0.72 -d devdb -p 8000 -U hccdp -W NHY^7ujm -r
\q
三 数据库的创建、查看、修改与删除 展开
1登录数据库
注意:命令中的IP需替换为GaussDb的主节点IP
cd /opt/
source gsql_env.sh
gsql -h 192.168.0.72 -d devdb -p 8000 -U hccdp -W NHY^7ujm -r
2新建数据库
CREATE DATABASE testdb;
3查看数据库
方式一:通过系统表pg_database查询数据库列表
SELECT datname FROM pg_database;
方式二:使用\l元命令查看数据库系统的数据库列表
\l
4修改数据库
修改数据库设置默认的模式搜索路径
ALTER DATABASE testdb SET search_path TO pa_catalog,public;
切换到testdb数据库
\c testdb
输入testdb数据库密码后,输入以下命令验证搜索路径是否修改
show search_path;
5重命名数据库
切换回默认数据库postgres
\c postgres
使用以下命令修改testdb名称为testdb1
ALTER DATABASE testdb RENAME TO testdb1;
验证名称是否已修改
\l
6 删除数据库
DROP DATABASE testdb1;
四 行存表、列存表的创建、查看、修改与删除 展开
1 创建行存表
CREATE TABLE PART
(
P_PARTKEY BIGINT NOT NULL,
P_NAME VARCHAR(55) NOT NULL,
P_MFGR CHAR(25) NOT NULL,
P_BRAND CHAR(10) NOT NULL,
P_TYPE VARCHAR(25) NOT NULL,
P_SIZE BIGINT NOT NULL,
P_CONTAINER CHAR(10) NOT NULL,
P_RETAILPRICE DECIMAL(15,2) NOT NULL,
P_COMMENT VARCHAR(23) NOT NULL
)
WITH (ORIENTATION = ROW);
2 创建列存表
CREATE TABLE PART1
(
P_PARTKEY BIGINT NOT NULL,
P_NAME VARCHAR(55) NOT NULL,
P_MFGR CHAR(25) NOT NULL,
P_BRAND CHAR(10) NOT NULL,
P_TYPE VARCHAR(25) NOT NULL,
P_SIZE BIGINT NOT NULL,
P_CONTAINER CHAR(10) NOT NULL,
P_RETAILPRICE DECIMAL(15,2) NOT NULL,
P_COMMENT VARCHAR(23) NOT NULL
)
WITH (ORIENTATION = COLUMN);
3 查看表信息
\d
4 修改表的属性为表增加一列
ALTER TABLE part ADD COLUMN p_col1 bigint;
验证新增的列
\d part
5 增加列上的默认值
ALTER TABLE part ALTER COLUMN p_col1 SET DEFAULT 1;
验证默认值
\d part
6 删除列上的默认值
ALTER TABLE part ALTER COLUMN p_col1 drop DEFAULT ;
验证是否删除了该默认值
\d part
7 修改字段的数据类型
ALTER TABLE part MODIFY p_col1 INT;
验证类型是否修改
\d part
8 修改列的名称
ALTER TABLE part RENAME p_col1 to p_col;
验证是否已更改名称
\d part
9 删除列
删除part表中的p_col列
ALTER TABLE part DROP COLUMN p_col;
验证列是否删除
\d part
10 删除表
删除PART表
DROP TABLE PART;
删除PART1表
DROP TABLE PART1;
查看是否还存在表信息
\d
五 用户管理 展开
1 用户管理,创建用户jim
密码可定义,但需记住密码
CREATE USER jim PASSWORD 'Gaussdb@123';
2 查看用户列表
SELECT * FROM pg_user;
3 创建dim用户,使其拥有创建数据库的权限
CREATE USER dim CREATEDB PASSWORD 'Gaussdb@123';
4 将用户jim的登录密码由Gaussdb@123修改为Abcd@123
ALTER USER jim IDENTIFIED BY 'Abcd@123' REPLACE 'Gaussdb@123';
5 假设原会话窗口为A,新建会话窗口B,
在B会话中验证密码是否修改
进入目录,运行gsql
cd /opt/
source gsql_env.sh
登录命令,注意:命令中的IP需替换为GaussDb的主节点IP
gsql -h 192.168.0.72 -d postgres -U jim -W Abcd@123 -p 8000 -r
6 返回原会话窗口A,给用户jim追加有创建角色的CREATEROLE权限。
ALTER USER jim CREATEROLE;
注意:步骤7、8请继续在会话窗口A中执行。
7 验证权限是否添加
\du jim
8 锁定jim帐户
ALTER USER jim ACCOUNT LOCK;
9 新建会话窗口C,使用jim登录,验证账户是否锁定
进入目录,启动gsql
cd /opt/
source gsql_env.sh
使用gsql使用jim登录,注意:命令中的IP需替换为GaussDb的主节点IP
gsql -h 192.168.0.72 -d postgres -U jim -W Abcd@123 -p 8000 -r
返回如下信息,说明jim用户已被锁定。
10 返回原会话窗口A,解锁jim帐户
ALTER USER jim ACCOUNT UNLOCK;
11 返回会话窗口C,使用jim登录,验证账户是否解锁
注意:命令中的IP需替换为GaussDb的主节点IP
gsql -h 192.168.0.72 -d postgres -U jim -W Abcd@123 -p 8000 -r
12 返回原会话窗口A,删除用户
DROP USER jim CASCADE;
六 Schema管理 展开
1 创建模式ds
通过管理Schema,允许多个用户使用同一数据库而不相互干扰;
每个数据库包含一个或多个Schema;
在数据库创建用户时,系统会自动帮助用户创建一个同名Schema
CREATE SCHEMA ds;
验证schema是否创建
\dn
2 将当前模式ds更名为ds_new
ALTER SCHEMA ds RENAME TO ds_new;
验证schema名字是否修改
\dn
3 创建用户jack
CREATE USER jack PASSWORD 'Gaussdb@123';
4 将DS_NEW的所有者修改为jack
ALTER SCHEMA ds_new OWNER TO jack;
5 查看Schema所有者
SELECT s.nspname,u.usename AS nspowner FROM pg_namespace s, pg_user u WHERE s.nspowner = u.usesysid;
6 删除用户jack和模式ds_new
DROP SCHEMA ds_new;
DROP USER jack;
七 将系统权限和对象权限授权给用户或者角色 展开
1 创建名为joe的用户,并将sysadmin权限授权给他
注意:密码可自定义,但后续命令需自行替换修改后的密码
CREATE USER joe PASSWORD 'Gaussdb@123';
ALTER USER joe with sysadmin;
查看用户权限变化
\du
2 撤销joe用户的sysadmin权限,然后创建tpcds模式,并给tpcds模式下创建一张reason表。
ALTER USER joe with nosysadmin;
CREATE SCHEMA tpcds;
CREATE TABLE tpcds.reason
(
r_reason_sk INTEGER NOT NULL,
r_reason_id CHAR(16) NOT NULL,
r_reason_desc VARCHAR(20)
);
假设当前会话为A,新起会话B。
在会话B中,使用joe用户连接数据库,验证joe用户是否拥有tpcds模式下reason表的权限。
cd /opt/
source gsql_env.sh
注意:命令中的IP需自行替换为GaussDb实例的主节点IP
gsql -h 192.168.0.174 -d postgres -p 8000 -U joe -W Gaussdb@123 -r
验证joe用户是否拥有tpcds模式下reason表的权限
select * from tpcds.reason;
3 返回会话A,将模式tpcds的使用权限和表tpcds.reason的所有权限授权给用户joe
GRANT USAGE ON SCHEMA tpcds TO joe;
GRANT ALL PRIVILEGES ON tpcds.reason TO joe;
切换至会话B,验证joe用户是否拥有tpcds模式下reason表的权限。
select * from tpcds.reason;
4 返回会话A,将tpcds.reason表中r_reason_sk、r_reason_id、r_reason_desc列的查询权限,r_reason_desc的更新权限授权给joe
GRANT select (r_reason_sk,r_reason_id,r_reason_desc),update (r_reason_desc) ON tpcds.reason TO joe;
5 将数据库postgres的连接权限授权给用户joe,并给予其在postgres中创建schema的权限,而且允许joe将此权限授权给其他用户
GRANT create,connect on database postgres TO joe WITH GRANT OPTION;
切换至会话B,验证joe用户对表tpcds.reason的查询和更新权限。
验证查询权限
SELECT r_reason_sk,r_reason_id,r_reason_desc FROM tpcds.reason;
验证更新权限
UPDATE tpcds.reason SET r_reason_desc='test';
6 返回会话A,创建角色tpcds_manager,将模式tpcds的访问权限授权给角色tpcds_manager,并授予该角色在tpcds下创建对象的权限,不允许该角色中的用户将权限授权给他人
CREATE ROLE tpcds_manager PASSWORD 'Gaussdb@123';
验证角色tpcds_manager是否添加
\du
GRANT USAGE,CREATE ON SCHEMA tpcds TO tpcds_manager;
7 创建角色manager,将joe的权限授权给manager,并允许该角色将权限授权给其他人
CREATE ROLE manager PASSWORD 'Gaussdb@123';
GRANT joe TO manager WITH ADMIN OPTION;
8 创建用户senior_manager,将用户manager的权限授权给该用户
CREATE USER senior_manager PASSWORD 'Gaussdb@123';
GRANT manager TO senior_manager;
9 撤销权限,并清理用户
DROP USER manager;
REVOKE ALL PRIVILEGES ON tpcds.reason FROM joe;
REVOKE ALL PRIVILEGES ON SCHEMA tpcds FROM joe;
REVOKE USAGE,CREATE ON SCHEMA tpcds FROM tpcds_manager;
DROP ROLE tpcds_manager;
DROP USER senior_manager;
DROP USER joe CASCADE;
八 创建数据库对象前判断该对象是否已存在 展开
1 创建新用户前查看新用户是否已存在
SELECT usename FROM pg_user WHERE usename='dbtest';
CREATE USER dbtest WITH sysadmin PASSWORD 'Gaussdb@123';
2 退出当前用户hccdp对数据库的连接,切换到新用户dbtest连接数据库。
退出当前数据库连接。
\q
使用新用户dbtest连接数据库devdb。
注意:以下IP需替换为Gaussdb主节点IP
gsql -h 192.168.0.174 -d postgres -p 8000 -U dbtest -W Gaussdb@123 -r
3 查看是否模式已自动创建
SELECT nspname FROM pg_namespace WHERE nspname='dbtest';
此时会看到有一条记录,再次创建会看到已存在的告警
CREATE SCHEMA dbtest;
4 创建数据库前查看已存在的数据库中是否存在同名数据库
SELECT datname FROM pg_database WHERE datname='db_test';
CREATE DATABASE db_test;
5 创建表之前查看表是否已存在
SELECT tablename FROM pg_tables WHERE schemaname='dbtest';
CREATE TABLE test (id int, name varchar(100));
6 查看当前用户创建的所有对象
SELECT relname FROM pg_class WHERE relowner=(select usesysid from pg_user where usename='dbtest');
7 清理数据库对象并删除用户后,退出当前数据库连接。
DROP TABLE test;
DROP SCHEMA dbtest;
DROP DATABASE db_test;
\q
九 查看数据库进程并释放 展开
1 使用hccdp用户登录数据库
cd /opt/
source gsql_env.sh
注意:以下IP需替换为Gaussdb主节点IP,密码为当初设置密码
gsql -h 192.168.0.174 -d postgres -p 8000 -U hccdp -W NHY^7ujm -r
2 执行以下SQL生成会话
SELECT pg_sleep(300);
3 另外打开shell界面,登录数据库
cd /opt/
source gsql_env.sh
注意:以下IP需替换为Gaussdb主节点IP,密码为当初设置密码
gsql -h 192.168.0.174 -d postgres -p 8000 -U hccdp -W NHY^7ujm -r
4 以sleep为条件查看pg_stat_activity
SELECT pid,usename,query FROM pg_stat_activity WHERE QUERY LIKE '%sleep%';
5 使用pg_terminate_backend函数结束会话
注意:括号内的pid需替换为上面对应的pid数字序列
SELECT pg_terminate_backend(pid);
6 查看原shell界面
会看到如下报错:
十 设计搜索表格输出特定值的存储过程
1 创建表格
CREATE TABLE employee (id varchar(100),name varchar(100),salary int);
CREATE TABLE ep_grade (id varchar(100),grade varchar(100),flag int);
2 导入数据
Insert into employee values(1,'张三',5000);
Insert into employee values(2,'李四',5000);
Insert into employee values(3,'王五',5000);
Insert into employee values(4,'赵六',5000);
Insert into employee values(5,'太一',5000);
Insert into employee values(6,'太二',5000);
Insert into employee values(7,'太三',5000);
Insert into employee values(8,'太四',5000);
Insert into ep_grade values(1,'A',2022);
Insert into ep_grade values(2,'S',2021);
Insert into ep_grade values(3,'B',2021);
Insert into ep_grade values(4,'B',2021);
Insert into ep_grade values(5,'A',2021);
Insert into ep_grade values(6,'C',2022);
Insert into ep_grade values(7,'C',2021);
Insert into ep_grade values(8,'B',2022);
3 整合前面设计的各个语句,按照存储过程的结构进行组合
CREATE OR REPLACE PROCEDURE proc_emp()
AS
1)声明参数
DECLARE
EP_ID VARCHAR(100);
GRADE VARCHAR(10);
SALARY INT;
2)声明游标
CURSOR C1 IS select distinct id,grade FROM ep_grade where Flag = 2021;
3)设计循环语句
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO EP_ID,GRADE;
EXIT WHEN C1%NOTFOUND;
Case GRADE
when 'S'
then update employee set salary = salary+1000 where id=EP_ID ;
when 'A'
then update employee set salary = salary+500 where id=EP_ID ;
when 'B'
then update employee set salary = salary+100 where id=EP_ID;
when 'C'
then update employee set salary = salary-200 where id=EP_ID;
END Case;
4)设计存储过程的内容输出
DBE_OUTPUT.PRINT_LINE('ID: '||EP_ID||', Grade: '||GRADE||', updated.');
END LOOP;
CLOSE C1;
END;
/
4 调用存储过程
call proc_emp();
看到如下回显:
恭喜您,您已完成该实验!