数据库原理+openGauss

文章目录

0. 准备工作

0.1 实验环境

openGauss 实验环境部署模式:通过创建虚拟机,选用开源操作系统openEuler来搭建,无额外使用成本。

0.2 主要内容

在这里插入图片描述

0.3 学习资源

  1. 华为MOOC
    ilearningx
    数据库学习路线
    华为云在线课程
  2. 教材
    在这里插入图片描述

1. 安装部署实验(实验一)

1.1 下载VirtualBox

VirtualBox官网
下载后,如下图所示:
在这里插入图片描述

1.2 安装VirtualBox

  1. 双击VirtualBox安装时,报错:
    报错:virtualbox安装"此应用无法在设备上运行"
    在这里插入图片描述
  2. 关闭内存完整性,重启之后。双击VirtualBox进行安装,安装路径为F:\APP\install\VirtualBox,如下图所示。
    在这里插入图片描述

1.3 镜像文件导入

  1. 打开VirtualBox管理器,点击导入
    在这里插入图片描述
  2. 选择要导入的镜像文件openEuler_openGauss.ova所在路径,假设为F:\APP\DownLoad,并点击 下一步
    在这里插入图片描述
    镜像文件openEuler_openGauss.ova如下。
    在这里插入图片描述
  3. 在 虚拟电脑导入设置 中,修改 默认虚拟电脑位置,假设为F:\APP\data\VirtualBox,之后点击 导入
    在这里插入图片描述
  4. 等待导入完成
    在这里插入图片描述

1.4 启动虚拟机

  1. 导入完成后,点击 启动,启动虚拟机
    在这里插入图片描述
  2. 输入用户名root 和 密码openGauss@123。登陆成功后,修改密码,改为123456。具体步骤如下图:
    在这里插入图片描述
  3. 输入ifconfig,查看两张网卡是否正常,如下图:
    在这里插入图片描述

1.5 数据库使用

  1. 使用putty连接虚拟机,从本地电脑通过配置enp0s3网卡的ip地址(从ifconfig可知,为192.168.56.101)来连接虚拟机。
    在这里插入图片描述

  2. 使用root用户来登录,密码为上述5.2.2中更改后的密码123456
    在这里插入图片描述

  3. 以操作系统用户omm登录数据库主节点,输入su - omm
    在这里插入图片描述

  4. 启动服务,输入gs_om -t start,显示如下结果,则表示启动成功。
    在这里插入图片描述

  5. 连接数据库,输入gsql -d postgres -p 26000 -r,显示如下结果则表示连接成功。
    postgres为openGauss安装完成后默认生成的数据库,初始可以连接到此数据库进行新数据库的创建。】
    26000为数据库主节点的端口号,需要根据openGauss的实际情况替换,请确认连接信息获取。】
    【使用数据库前,需先使用客户端程序或工具连接到数据库,然后就可以通过客户端程序或工具执行SQL来使用数据库了。gsql是openGauss数据库提供的命令行方式的数据库连接工具。】
    在这里插入图片描述

  6. 连接数据库时,omm用户密码为:openGauss@123,输入alter role omm identified by 'openGauss@1234' replace 'openGauss@123';更改密码,新密码为openGauss@1234
    在这里插入图片描述

  7. 创建数据库用户
    默认只有openGauss安装时创建的管理员用户可以访问初始数据库,输入CREATE USER ljh WITH PASSWORD "openGauss@1234"; 创建其他数据库用户帐号。【其他数据库用户CREATE USER lumi WITH PASSWORD "openGauss@1234";
    其中,账号为ljh,密码为openGauss@1234
    在这里插入图片描述

  8. 创建数据库,输入CREATE DATABASE db_tpcc OWNER ljh;,创建了db_tpcc数据库【其他数据库:CREATE DATABASE db_lumi OWNER lumi;
    在这里插入图片描述

  9. 创建完db_tpcc数据库后,就可以按\q方法退出postgres数据库,输入gsql -d db_tpcc -p 26000 -U ljh -W openGauss@1234 -r使用新用户ljh连接到数据库db_tpcc执行接下来的创建表等操作。【其他用户登录数据库:gsql -d db_lumi -p 26000 -U lumi -W openGauss@1234 -r

  10. 当结果显示为如下信息,则表示连接成功。
    在这里插入图片描述

1.6 数据库基本操作

1. 华为 openGauss (GaussDB) 1.0 使用手册
2. openGauss数据库开发指导手册(上)
2. openGauss数据库开发指导手册(下)
4. openGauss数据库开发者指南
5. 华为云
报错:permission denied for schema public

2 表&模式(实验二)

  1. 创建数据库、模式、表和索引。
  2. 修改基本表的结构。
    在OpenGauss数据库系统中使用SQL语句(按教材上所示的属性)建立基本表,如STUDENT表、COURSE表、SC表等,并向表中填充数据。熟悉使用虚拟机进行OpenGauss中SQL语句的代码输入方式。
  3. 创建和删除索引
    使用SQL语句在上述表中创建索引,熟悉相应的SQL语句,请参考教材P73-79页的SQL语句,请注意标准SQL和openGauss中相应SQL语句相同与不同之处。

2.1 创建模式

CREATE SCHEMA ljh AUTHORIZATION ljh;
在这里插入图片描述

2.2 创建表

  1. 创建 students表
    CREATE TABLE students(sno CHAR(9) PRIMARY KEY,sname CHAR(10) NOT NULL,sex CHAR(2) CHECK(sex='男'OR sex='女'), birthday DATE, enrollyear CHAR(4), speciality CHAR(20), dno CHAR(4));
  2. 创建 courses表
    CREATE TABLE courses(cno CHAR(5) PRIMARY KEY,cname CHAR(20) NOT NULL,period SMALLINT, credit SMALLINT);
  3. 创建 sc表
    CREATE TABLE sc(sno CHAR(9), cno CHAR(5), grade SMALLINT CHECK(grade>=0 AND grade<=100), PRIMARY KEY (sno,cno), FOREIGN KEY (sno) REFERENCES students (sno), FOREIGN KEY (cno) REFERENCES courses (cno));
    在这里插入图片描述

问题: permission denied for schema public
在这里插入图片描述

2.3 索引

  1. 为 students 表上的 dno 创建 students_dept索引
    db_tpcc=> CREATE INDEX students_dept ON students(dno);
    在这里插入图片描述
  2. 删除该索引(\di查看索引,DBMS自动为主码创建索引)
    DROP INDEX students_dept
    在这里插入图片描述

2.4 修改表

  1. 修改 students 表的 sex 列的数据类型
    ALTER TEBLE students ALTER sex TYPE char(4);
    在这里插入图片描述

2.5 插入表数据

  1. 插入 students 表数据
    INSERT INTO students(sno,sname,sex, birthday, enrollyear, speciality, dno) VALUES (1,'卢一','女','1993-01-01','2018','人工智能','001');
    INSERT INTO students(sno,sname,sex, birthday, enrollyear, speciality, dno) VALUES (2,'卢二','男','1993-01-02','2019','软件','001');
    INSERT INTO students(sno,sname,sex, birthday, enrollyear, speciality, dno) VALUES (3,'卢三','女','1993-01-03','2020','计算机技术','001');
    INSERT INTO students(sno,sname,sex, birthday, enrollyear, speciality, dno) VALUES (4,'卢四','男','1993-01-04','2018','儿科','002');
    INSERT INTO students(sno,sname,sex, birthday, enrollyear, speciality, dno) VALUES (5,'卢五','女','1993-01-05','2019','内科','002');
    INSERT INTO students(sno,sname,sex, birthday, enrollyear, speciality, dno) VALUES (6,'卢六','男','1993-01-06','2020','外科','002');
    在这里插入图片描述
  2. 插入courses 表数据
    INSERT INTO courses(cno,cname,period, credit) VALUES (001,'计算机系','4','3');
    INSERT INTO courses(cno,cname,period, credit) VALUES (002,'医学系','5','6');
    在这里插入图片描述
  3. 插入sc 表数据
    INSERT INTO sc(sno, cno, grade) VALUES (1, 001, 90);
    INSERT INTO sc(sno, cno, grade) VALUES (2, 001, 80);
    INSERT INTO sc(sno, cno, grade) VALUES (3, 001, 100);
    INSERT INTO sc(sno, cno, grade) VALUES (4, 002, 90);
    INSERT INTO sc(sno, cno, grade) VALUES (5, 002, 95);
    INSERT INTO sc(sno, cno, grade) VALUES (6, 002, 89);
    在这里插入图片描述

3 查询&更新(实验三)

  1. 查询操作
    根据教材P79-94页所有查询实例,完成各类查询操作。
  2. 更新操作
    根据教材P94-96上所有更新实例,完成各类更新操作(插入、修改和删除数据等),请注意标准SQL和openGauss中相应SQL语句相同与不同之处。

3.1 查询

3.1.1 SELECT语句一般形式

select 
  [all|distinct]
  <目标列的表达式1> [别名],
  <目标列的表达式2> [别名]...
  from <表名或视图名> [别名],<表名或视图名> [别名]...
  [where<条件表达式>]
  [group by <列名> [having <条件表达式>]]
  [order by <列名> [asc|desc]];

前提:创建表,并插入数据。
courses表:
在这里插入图片描述
students表:
在这里插入图片描述
sc表:
在这里插入图片描述

3.1.2 不带 WHERE 的简单查询

  1. 查询所以课程信息
    在这里插入图片描述
  2. 查询2023年时,学生的年龄(使用函数date_part('year',birthday)
    在这里插入图片描述

3.1.3 带 WHERE 子句的查询

  1. 比较表达式
    (1)成绩低于90分的学生的编号
    在这里插入图片描述
  2. BETWEEN表达式
    (1)出生年份在 1997~2005 之间的学生的编号和专业
    (2)出生年份不在 1997~2005 之间的学生的编号和专业
    在这里插入图片描述
  3. IN表达式
    (1)人工智能专业的学生的编号和姓名
    (1)不是人工智能或儿科专业的学生的编号和姓名
    在这里插入图片描述
  4. LIKE表达式
    (1)以 计 开头的课程名
    在这里插入图片描述
  5. NULL表达式
    (1)课程成绩为空的学生的编号和课程的编号
    在这里插入图片描述

3.1.4 排序和分组

  1. 将查询结果排序
    (1)查询每个学生001课程的成绩,并降序排列
    在这里插入图片描述
    (2)所有成绩降序排列
    在这里插入图片描述
  2. 聚集函数
    (1)查询001课程的元组个数,即选修001课程的人数
    在这里插入图片描述
    (2)成绩的最小,平均,最大值
    在这里插入图片描述
  3. 分组
    (1)查询每个学生的平均成绩,输出学号和平均成绩
    在这里插入图片描述
    (2)查询每个学生的平均成绩,输出平均成绩>90的学生学号和平均成绩
    在这里插入图片描述

3.1.5 连接查询

  1. 课程编号为001的课程名和成绩
    在这里插入图片描述
  2. 每个学生(编号,姓名)选修的每门课(课程名)的成绩
    在这里插入图片描述
  3. 查询每个学生的平均成绩,并输出平均成绩大于90的学生编号,姓名,平均成绩
    在这里插入图片描述
  4. 和卢一出生年份相同的其他学生的姓名
    在这里插入图片描述

3.1.6 嵌套查询

  1. IN 引出的子查询
    (1)查询和卢一相同dno的男同学的学生编号和姓名
    在这里插入图片描述

  2. 集合的比较引出的子查询
    (1)比dno为001的所有学生都小的其他专业的学生编号,姓名,专业,出生日期
    在这里插入图片描述
    (2)(课程)平均成绩最高的课程号和平均成绩
    在这里插入图片描述

  3. 存在量词引出的子查询
    (1)所有选修了001课程的学生编号和姓名
    在这里插入图片描述
    (2)查询选修了所有课程的学生
    在这里插入图片描述
    (3)至少选修了 学生1所选修的全部课程 的学生
    在这里插入图片描述

  4. 检查子查询结果中的重复元素

3.1.7 集合运算

(1)选修了 001或002课程 的学生
在这里插入图片描述
(2)选修了 001和002课程 的学生
在这里插入图片描述
(3)选修了001 未选修002课程 的学生
在这里插入图片描述

3.2 更新

3.2.1 插入

  1. 查询已有数据,避免插入冲突
    在这里插入图片描述
  2. 插入数据 并查询结果
    在这里插入图片描述

3.2.2 更新

  1. 更新学生7和1的入学年份
    在这里插入图片描述

3.2.3 删除

  1. 删除学生7的信息
    在这里插入图片描述

4 视图(实验四)

  1. 使用SQL语句创建视图。
  2. 对视图执行创建、查找、更新等操作,对比和基本表进行查找、更新操作有无不同之处。

4.1 定义视图

  1. 建立视图
    (1)建立dno为001的学生视图se_students,包含Students中dno为001的所有属性(除了Speciality)
    在这里插入图片描述
    (2)建立dno为001的视图se_sc,包含 Students中dno为001 的学生的 所有SC的属性
    在这里插入图片描述
    (3)建立学生成绩视图students_grades,包含学号、学生姓名、课程名和成绩。在这里插入图片描述

  2. 查看视图的具体信息
    (1)se_students视图
    在这里插入图片描述

4.2 基于视图查询

  1. 查询dno为001的男生(已经定义了dno为001的学生视图SE_Students,可以直接使用。
    在这里插入图片描述
  2. 查询学号为 1 的学生的各科成绩,要求显示学生姓名,课程名和成绩。(查询涉及三个表Students,SC和Courses。可以使用定义的学生成绩视图Students_Grades查询)
    在这里插入图片描述

4.3 基于视图更新

openGauss不支持视图更新

  1. ALTER viewname RENAME TO newname,更改视图名称se_students为ve_students
    在这里插入图片描述

4.4 删除视图

  1. 先查看所有视图
    在这里插入图片描述

  2. 删除视图se_sc,再次查看所有视图
    在这里插入图片描述

5 完整性控制(实验五)

  1. 练习创建下面约束:
      主键(PRIMARY KEY)约束;
      检查(CHECK)约束;
      外键(FOREIGN KEY)约束:外键约束是为了强制实现表之间的参照完整性。级联参照完整性约束就是为了保证外键数据的关联性。
      唯一性(UNIQUE)约束:将STUDENTS表中的SNAME列设为唯一键约束、COURSES表中的CNAME列设为唯一键约束;
  2. 创建触发器
     触发器是一种特殊类型的存储过程,通常用于实现强制业务规则和数据完整性。创建UPDATE触发器检查修改操作的业务规则,如:在STUDENTS表上建立触发器,当用户修改学生的学号时给出提示信息。

5.1 创建表及主键约束、检查约束、外键约束

  1. 首先创建数据库及用户,并为用户赋予权限,之后创建表。详细过程如下:
    在这里插入图片描述
  2. 上图创建表的过程也添加了PRIMARY KEY约束、CHECK约束、FOREIGN KEY约束。详情通过\d+ 表名查看,如下图所示。
    在这里插入图片描述
    在这里插入图片描述

5.2 添加唯一性约束

将STUDENTS表中的SNAME列设为唯一键约束、COURSES表中的CNAME列设为唯一键约束;

  1. 使用ALTER TABLE students ADD UNIQUE(sname);ALTER TABLE courses ADD UNIQUE(cname);创建唯一性约束。
  2. studentscourses添加唯一性约束之后的变化如下图所示:
    在这里插入图片描述

5.3 创建触发器

一般语法如下:

CREATE [ CONSTRAINT ] TRIGGER trigger_name {
    
     BEFORE | AFTER | INSTEAD OF } {
    
     event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    {
    
     NOT DEFERRABLE | [ DEFERRABLE ] {
    
     INITIALLY IMMEDIATE | INITIALLY DEFERRED } }
    [ FOR [ EACH ] {
    
     ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE PROCEDURE function_name ( arguments );
# event语句
    INSERT
    UPDATE [ OF column_name [, ... ] ]
    DELETE
    TRUNCATE

5.3.1 插入

在STUDENTS表上建立触发器,当插入数据时给出提示信息。

  1. 创建函数
CREATE OR REPLACE FUNCTION insert_stu() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
RAISE NOTICE'插入成功!';
RETURN NEW;
END
$$ LANGUAGE PLPGSQL;
  1. 创建触发器
CREATE TRIGGER insert_trigger
AFTER INSERT ON students
FOR EACH ROW
EXECUTE PROCEDURE insert_stu();
  1. 测试
    由于students存在外键departments(dno),因此需要先为departments插入数据,否则会报错:
    INSERT INTO departments(dno,dname,dheadno) VALUES ('CS','信息系','05001'), ('MA','数学系','06001'), ('PH','物理系','07001'), ('CH','化学系','08001');
    之后,向students中插入数据:
INSERT INTO students(sno,sname,sex, birthday, enrollyear, speciality, dno) VALUES (1,'卢一','女','1993-01-01','2018','人工智能','CS');

具体过程如下:
在这里插入图片描述

5.3.2 更新

在STUDENTS表上建立触发器,当用户修改学生的学号时给出提示信息。

  1. 创建函数
CREATE OR REPLACE FUNCTION update_stu() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
RAISE NOTICE'更新成功!';
RETURN NEW;
END
$$ LANGUAGE PLPGSQL;
  1. 创建触发器
CREATE TRIGGER update_trigger
AFTER UPDATE ON students
FOR EACH ROW
EXECUTE PROCEDURE update_stu();
  1. 测试
UPDATE students SET sno='01' WHERE sname='卢一';

具体过程如下:
在这里插入图片描述

5.4 其他

5.4.1 插入表数据

  1. departments表
    INSERT INTO departments(dno,dname,dheadno) VALUES ('CS','信息系','05001'),('MA','数学系','06001'),('PH','物理系','07001'),('CH','化学系','08001');

  2. students表
    INSERT INTO students(sno,sname,sex, birthday, enrollyear, speciality, dno) VALUES (01,'卢一','女','1993-01-01','2018','人工智能','CS'),(02,'卢二','女','1993-01-01','2018','人工智能','CS'),(03,'卢三','男','1993-01-02','2019','软件','CS'),(04,'卢四','女','1993-01-03','2020','高数','MA'),(05,'卢五','男','1993-01-04','2018','数理统计','MA'),(06,'卢六','女','1993-01-05','2019','概率论','MA'),(07,'卢七','男','1993-01-06','2020','光学','PH'),(08,'卢八','男','1993-01-04','2018','电学','PH'),(09,'卢九','女','1993-01-05','2023','热学','PH'),(10,'卢十','男','1993-01-04','2018','燃料','CH'),(11,'十一','女','1993-01-05','2023','分子学','CH'),(12,'十二','男','1993-01-11','2018','气体学','PH');

  3. courses表
    INSERT INTO courses(cno,cname,period, credit) VALUES ('CS01','人工智能','4','3'),('CS02','软件','5','6'),('MA01','高数','4','6'),('MA02','数理统计','4','4'),('MA03','概率论','4','5'),('PH01','光学','4','4'),('PH02','电学','3','5'),('PH03','热学','3','6'),('CH01','燃料','4','4'),('CH02','分子学','4','6'),('CH03','气体学','3','5');

  4. sc表
    INSERT INTO sc(sno, cno, grade) VALUES (1, 'CS01', 90),(2, 'CS01', 80),(3, 'CS02', 56),(4, 'MA01', 76),(5, 'MA02', 95),(6, 'MA03', 89),(7, 'PH01', 79),(8, 'PH02', 53),(9, 'PH03', 100),(10, 'CH01', 65),(11, 'CH02', 95),(12, 'CH03', 74);

5.4.2 修改表数据

UPDATE students SET sno=1 WHERE sname='卢一';,因为表sc的外键sno参照的是表students的主键,因此需要先删除SC的外键。
在这里插入图片描述

5.4.3 删除外键

通过ALTER TABLE sc DROP CONSTRAINT sc_sno_fkey;删除外键,详细过程如下:
在这里插入图片描述

5.4.4 添加外键

  1. 为表sc添加外键之前,应该先把表sc的sno=01改为sno=1。否则外键会添加失败,因此sc的外键sno 是 students的主键sno,值应该保持一致。
    在这里插入图片描述

  2. 输入ALTER TABLE sc ADD CONSTRAINT sc_sno_fkey FOREIGN KEY (sno) REFERENCES students(sno);重新创建外键sno。结果如下图所示:
    在这里插入图片描述

6 安全性控制(实验六)

  1. 创建一些数据库用户,并理解数据库用户和角色之间的关系。
  2. 利用查询分析器熟悉通过SQL对数据进行安全性控制(grant和revoke语句)。

6.1 数据库用户&角色

6.1.1 用户USER:

  • 通过CREATE USER创建的用户,默认具有LOGIN权限;
  • 创建用户的同时会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA;
  • 其他数据库中,则不自动创建同名的SCHEMA;可使用CREATE SCHEMA命令,分别在其他数据库中,为该用户创建同名SCHEMA。
  1. 创建用户lll,登录密码为‘openGauss@1234,创建完成后,查看用户列表
    在这里插入图片描述
  2. 授予用户lll创建角色权限CREATE ROLE
    在这里插入图片描述

6.1.2 角色ROLE:

  • 拥有数据库对象和权限的实体。在不同的环境中角色可以认为是一个用户,一个组或者兼顾两者。
  • 在数据库中添加一个新角色,角色无LOGIN权限。
  • 创建角色的用户必须具备CREATE ROLE的权限【ALTER USER 用户名 CREATEROLE;】或者是系统管理员。
  1. 创建一个角色,名为lllr,密码为openGauss@1234,创建完后查看角色列表。
    在这里插入图片描述
  2. 修改角色lllr为系统管理员,再次查看角色列表
    在这里插入图片描述

6.2 GRANT&REVOKE

6.2.1 将系统权限SYSADMIN授权给USER/ROLE

  1. 将系统权限SYSADMIN授权给用户lll,授权后查看角色列表
    在这里插入图片描述

6.2.2 将数据库对象授权给USER/ROLE

  1. 创建模式llls,并在模式llls下创建表students
    在这里插入图片描述

  2. 将模式llls的使用权限和表llls.students的所有权限授权给用户lll
    在这里插入图片描述

  3. 将表llls.students中列sno,sname,sex,dno的查询权限,sno的更新权限授权给lll
    在这里插入图片描述

  4. 将数据库postgres的连接权限授权给用户lll,并授予用户lllpostgres中创建schema的权限,而且允许用户lll将此权限授权给其他用户(WITH GRANT OPTION
    在这里插入图片描述

  5. 将模式llls的访问权限授权给角色lllr,并授予角色lllrllls下创建对象的权限,不允许角色lllr中的用户将权限授权给其他人。
    在这里插入图片描述

6.2.3 将USER/ROLE的权限授权给其他USER/ROLE

  1. 将用户lll的权限授权给角色lllr,并允许角色lllr将权限授权给其他人
    在这里插入图片描述

  2. 创建用户hhh,将角色lllr的权限授权给用户hhh
    在这里插入图片描述

6.2.4 回收权限并清理用户

  1. 回收角色lllr,用户lll,用户hhh,模式llls的权限
    在这里插入图片描述

  2. 删除角色lllr,删除用户lll,删除用户hhh,删除模式llls
    在这里插入图片描述
    删除完成后查看模式和角色:
    在这里插入图片描述


后续实验参考CSDNBkbK-

7 事务并发与控制(实验七)

  1. 编写事务实例,分别使其成功提交和回滚,观察该事务对数据库的影响。
  2. 利用数据库管理系统提供的封锁机制解决并发操作带来的数据不一致情况。

7.1 事务

7.1.1 事务的ACID特性

  • 原子性(Atomicity):原子事务是一系列不可分割的数据库操作。在事务完成之后,这些操作要么全部发生,要么全部不发生。
  • 一致性(Consistency):事务结束后,数据库处于一致状态,保留数据完整性。
  • 隔离性(Isolation):事务之间不能相互干扰。
  • 持久性(Durability):即使发生崩溃和失败,成功完成(提交)的事务效果持久保存。

7.1.2 事务管理

openGauss数据库支持的事务管理命令有启动、设置、提交、回滚事务。

  • 启动事务(START TRANSACTION | BEGIN)
START TRANSACTION
 [ 	{
   
   <!-- -->ISOLATION LEVEL 
	{
   
   <!-- -->READ COMMITTED | READ UNCOMMITTED  | SERIALIZABLE | REPEATABLE READ} | 
 	{
   
   <!-- -->READ WRITE | READ ONLY}} 
	[, ...] ];
  • 设置事务(SET TRANSACTION)
{ SET [ LOCAL ] TRANSACTION | SET SESSION CHARACTERISTICS AS TRANSACTION }
{ ISOLATION LEVEL 
{
   
   <!-- -->READ COMMITTED | READ UNCOMMITTED  | SERIALIZABLE | REPEATABLE READ} | 
{
   
   <!-- -->READ WRITE | READ ONLY}} 
[, ...];
  • 提交事务
{ COMMIT | END } [ WORK | TRANSACTION ];
  • 回滚事务
ROLLBACK [ WORK | TRANSACTION ];

7.1.3 事务实例

1.未提交的事务
  • 启动事务
START TRANSACTION;
在这里插入图片描述
  • 插入数据
INSERT INTO Students 
VALUES ('201905001', 'BK','男', '2000-01-01','2019',' 计算机','CS');
在这里插入图片描述
SELECT * FROM Students;
在这里插入图片描述
  • 回滚事务
ROLLBACK;
在这里插入图片描述
SELECT * FROM Students;
在这里插入图片描述
2.已提交的事务
  • 启动事务
START TRANSACTION;
在这里插入图片描述
  • 插入数据
INSERT INTO Students 
VALUES ('201905001', 'BK','男', '2000-01-01','2019',' 计算机','CS');
在这里插入图片描述
  • 提交事务
COMMIT TRANSACTION;
在这里插入图片描述
SELECT * FROM Students;

在这里插入图片描述

7.2 并发控制

7.2.1 加锁语法

LOCK [ TABLE ] {
   
   <!-- -->[ ONLY ] name [, ...]| {name [ * ]} [, ...]}
    [ IN {ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE} MODE ]
    [ NOWAIT ];

7.2.2 加锁实例

  • 创建测试表
CREATE TABLE TestLock(test CHAR(5));
在这里插入图片描述
  • 开启事务
START TRANSACTION;
在这里插入图片描述
  • 加锁
LOCK TestLock;
在这里插入图片描述
  • 查看所有锁
SELECT  * FROM pg_locks ;
在这里插入图片描述
  • 提交事务
COMMIT TRANSACTION;
在这里插入图片描述
  • 再次查看所有锁
SELECT  * FROM pg_locks ;
在这里插入图片描述

8 数据库备份与恢复(实验八)

1.针对具体故障制定备份方案,并利用这些备份方案恢复数据库。
2. 使用openGauss提供的各种备份方法进行数据库备份。
3. 使用具体的数据库管理系统提供的恢复机制,利用副本进行数据库的恢复。

8.1 物理备份和恢复

8.1.1 实验准备

  1. 切换到omm用户,以操作系统用户omm登录数据库主节点
su - omm
在这里插入图片描述
  1. 创建存储备份文件的文件夹
mkdir -p /home/omm/physical/backup
在这里插入图片描述

8.1.2 物理备份

  1. 如果数据库服务没有启动,就启动数据库服务(务必以操作系统用户omm启动数据库服务,如果没有请切换用户)。
gs_om -t start 
在这里插入图片描述
  1. 将数据库进行物理备份
gs_basebackup -D /home/omm/physical/backup -p 26000
在这里插入图片描述
  1. 切换到存储备份文件夹查看备份文件
cd /home/omm/physical/backup
ls
在这里插入图片描述

8.1.3 物理备份恢复

  1. 停止openGauss((务必以操作系统用户omm停止数据库服务,如果没有请切换用户)。
gs_om -t stop
在这里插入图片描述
  1. 清理原库中的所有或部分文件,对数据库文件进行破坏。
cd /gaussdb/data/
cd db1
rm -rf *
在这里插入图片描述
  1. 使用数据库系统用户权限从备份中还原需要的数据库文件,/gaussdb/data/db1中db1是数据库节点文件夹名称,不同数据库可能不同请查看确认。
cp -r /home/omm/physical/backup/.  /gaussdb/data/db1
  1. 备份时间大概需要几分钟,恢复后文件列表如下:
cd /gaussdb/data/db1
ls
在这里插入图片描述
  1. 重启数据库服务器, 并检查数据库内容,确保数据库已经恢复到所需的状态
gs_om -t start
在这里插入图片描述

8.2 逻辑备份和恢复

8.2.1 实验准备:

  • 切换到omm用户,以操作系统用户omm登录数据库主节点。
su - omm      
在这里插入图片描述
  • 创建存储备份文件的文件夹
mkdir -p /home/omm/logical/backup
在这里插入图片描述

8.2.2 gs_dump备份

1. gs_dump备份示例1
  • 执行gs_dump,导出的MPPDB_backup.sql文件格式为纯文本格式
gs_dump -U omm -W Bigdata@123 -f /home/omm/logical/backup/MPPDB_backup.sql -p 26000 postgres -F p
在这里插入图片描述
  • 切换到backup文件夹,查看MPPDB_backup.sql文件
ll /home/omm/logical/backup/
在这里插入图片描述
cat /home/omm/logical/backup/MPPDB_backup.sql

在这里插入图片描述 显示如下内容:

--
-- PostgreSQL database dump
--

SET statement_timeout = 0;
SET xmloption = content;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

--
-- Name: postgres; Type: COMMENT; Schema: -; Owner: omm
--

COMMENT ON DATABASE postgres IS 'default administrative connection database';


--
-- Name: tpcds; Type: SCHEMA; Schema: -; Owner: omm
--

CREATE SCHEMA tpcds;


ALTER SCHEMA tpcds OWNER TO omm;

SET search_path = tpcds;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: reason; Type: TABLE; Schema: tpcds; Owner: omm; Tablespace: 
--

CREATE TABLE reason (
    r_reason_sk integer NOT NULL,
    r_reason_id character(16) NOT NULL,
    r_reason_desc character varying(20)
)
WITH (orientation=row, compression=no);


ALTER TABLE tpcds.reason OWNER TO omm;

--
-- Data for Name: reason; Type: TABLE DATA; Schema: tpcds; Owner: omm
--

COPY reason (r_reason_sk, r_reason_id, r_reason_desc) FROM stdin;
\.
;

--
-- Name: public; Type: ACL; Schema: -; Owner: omm
--

REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM omm;
GRANT CREATE,USAGE ON SCHEMA public TO omm;
GRANT USAGE ON SCHEMA public TO PUBLIC;


--
-- Name: tpcds; Type: ACL; Schema: -; Owner: omm
--

REVOKE ALL ON SCHEMA tpcds FROM PUBLIC;
REVOKE ALL ON SCHEMA tpcds FROM omm;
GRANT CREATE,USAGE ON SCHEMA tpcds TO omm;


--
-- Name: reason; Type: ACL; Schema: tpcds; Owner: omm
--

REVOKE ALL ON TABLE reason FROM PUBLIC;
REVOKE ALL ON TABLE reason FROM omm;
GRANT SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE reason TO omm;


--
-- PostgreSQL database dump complete
--

2. gs_dump备份示例2
  • 执行gs_dump,导出的MPPDB_backup.tar文件格式为tar格式
gs_dump -U omm -W Bigdata@123 -f  /home/omm/logical/backup/MPPDB_backup.tar -p 26000 postgres -F t	

在这里插入图片描述
  • 查看生成的文件信息
ll /home/omm/logical/backup/

在这里插入图片描述
3. gs_dump备份示例3
  • 执行gs_dump,导出的MPPDB_backup.dmp文件格式为自定义归档格式
gs_dump -U omm -W Bigdata@123 -f  /home/omm/logical/backup/MPPDB_backup.dmp -p 26000 postgres -F c
在这里插入图片描述
  • 查看生成的文件信息
ll /home/omm/logical/backup/
在这里插入图片描述
4. gs_dump备份示例4
  • 执行gs_dump,导出的MPPDB_backup文件格式为目录格式
gs_dump -U omm -W Bigdata@123 -f /home/omm/logical/backup/MPPDB_backup -p 26000  postgres -F d
在这里插入图片描述
  • 查看生成的文件信息
ll /home/omm/logical/backup/
在这里插入图片描述
5.gs_dump备份示例5

执行gs_dump,导出postgres数据库的表(或视图、或序列、或外表)对象,例如表customer_t1

  • 执行gs_dump,导出的表customer_t1
gs_dump -U omm -W Bigdata@123 -f /home/omm/logical/backup/bkp_shl2.sql -t public.customer_t1 -p 26000 postgres
在这里插入图片描述
  • 查看生成的文件信息
ll /home/omm/logical/backup/
在这里插入图片描述
  • 查看生成的sql文件
cat /home/omm/logical/backup/bkp_shl2.sql 

bkp_shl2.sql 为空文件

8.2.3 gs_dumpall备份

  • 使用gs_dumpall一次导出openGauss的所有数据库
gs_dumpall -f  /home/omm/logical/backup/bkp2.sql -p 26000
在这里插入图片描述
  • 查看生成的文件信息
ll /home/omm/logical/backup/
在这里插入图片描述

8.2.4 gs_restore导入

1. gs_restore导入示例1
  • 执行gs_restore,将导出的MPPDB_backup.tar文件(tar格式)导入到db_tpcc01数据库
gs_restore /home/omm/logical/backup/MPPDB_backup.tar -p 26000 -d db_tpcc01
2.gs_restore导入示例2
  • 执行gs_restore,将导出的MPPDB_backup.dmp文件(自定义归档格式)导入到db_tpcc02数据库
gs_restore /home/omm/logical/backup/MPPDB_backup.dmp -p 26000 -d db_tpcc02
3.gs_restore导入示例3
  • 执行gs_restore,将导出的MPPDB_backup文件(目录格式)导入到db_tpcc03数据库
gs_restore /home/omm/logical/backup/MPPDB_backup -p 26000 -d db_tpcc03
4.gs_restore导入示例4

执行gs_restore,使用自定义归档格式的MPPDB_backup.dmp文件来进行如下导入操作。只导入PUBLIC模式下表customer_t1的定义。

  • 执行gs_restore,只导入PUBLIC模式下表customer_t1的定义
gs_restore  /home/omm/logical/backup/MPPDB_backup.dmp -p 26000 -d db_tpcc04 -n public -t customer_t1

9 使用JDBC连接数据库(实验九)

  1. 在openGauss中创建数据库、表;
  2. 使用jdbc连接到新创建的数据库;
  3. 在java程序中改变数据库中的值或者输出数据库中的值;
  4. 请参考华为提供的实验手册:openGauss场景化综合应用实验。

9.1 准备连接环境

9.1.1 修改数据库的pg_hba.conf文件

  • 在GS_HOME中查找pg_hba.conf文件,本实验中数据库GS_HOME设置的为/gaussdb/data/db1,实际操作中GS_HOME地址可以查看安装时的配置文件:&lt;PARAM name="dataNode1" value="/gaussdb/data/db1"/&gt;
cd /gaussdb/data/db1
vi pg_hba.conf
  • 输入“:90”找到对应位置,然后输入“i”切换到INSERT模式,将以下内容添加进pg_hba.conf文件,添加后按下“ECS”键,退出INSERT模式,输入“:wq”后回车保存。
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all    all    192.168.0.19/32    trust
host all all 0.0.0.0/0 sha256
# IPv6 local connections:
host    all             all             ::1/128                 trust
  • 使用omm用户登陆,使用gs_ctl将策略生效
su - omm
gs_ctl reload -D /gaussdb/data/db1/

9.1.2 登陆数据库授权退出

  • 使用omm用户登陆数据库给dbuser用户授权,并退出数据库
gsql -d postgres -p 26000 -r
alter role dbuser createrole createdb;
\q

9.1.3 修改数据库监听地址

  • 在GS_HOME中,本实验中数据库GS_HOME设置的为/gaussdb/data/db1
cd /gaussdb/data/db1
vi postgresql.conf
  • 输入“:60”找到对应位置,然后输入“i”切换到INSERT模式,将listen_addresses的值修改成为*,修改后按下“ECS”键,退出INSERT模式,输入“:wq”后回车保存。
#listen_addresses = '192.168.0.19'              # what IP address(es) to listen on;
listen_addresses = '*'
  • 修改完成后重启数据库生效(-D后面的数据库默认路径,需要根据实际情况进行修改)
gs_ctl restart -D /gaussdb/data/db1/

9.1.4 下载Java驱动包导入工具

  • 下载Java连接openGauss的驱动包,并将其导入对应的使用工具

  • 通过以下链接,下载驱动包

  • 假设文件存放在d:\Download目录下,并进行解压,解压后文件为“postgresql.jar”。

9.1.5 创建测试数据库demo

  • 使用gsql工具登陆数据库,并输入dbuser密码(如:Gauss#3demo)
gsql -d postgres -p 26000 -U dbuser -r
  • 创建数据库demo
create database demo ENCODING 'UTF8' template = template0;
  • 切换到demo数据库,并输入dbuser密码(如:Gauss#3demo)。
\connect demo;

9.1.6 创建schema

  • 创建名为demo的schema,并设置demo为当前的schema。
CREATE SCHEMA demo;
  • 将默认搜索路径设为demo。
SET search_path TO demo;

9.1.7 创建测试表websites

CREATE TABLE websites (
  id int NOT NULL,
  name char(20) NOT NULL DEFAULT '',
  url varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (id)
);
COMMENT ON COLUMN websites.name IS '站点名称';

9.1.8 插入数据

INSERT INTO websites VALUES 
('1', 'openGauss', 'https://opengauss.org/zh/'), 
('2', '华为云', 'https://www.huaweicloud.com/'), 
('3', 'openEuler', 'https://openeuler.org/zh/'), 
('4', '华为support中心', 'https://support.huaweicloud.com/');

9.1.9 退出数据库

\q

9.2 确定26000端口是否放开

  • 打开华为云首页,登录后进入“控制台”,点击“弹性云服务器ECS”进入ECS列表
    在这里插入图片描述
    在这里插入图片描述

  • 在云服务器控制台找到安装数据库主机的ECS,点击查看基本信息,找到安全组
    在这里插入图片描述
    在这里插入图片描述

  • 点击进入安全组,选择“入方向规则”并“添加规则”,进行26000端口设置 在这里插入图片描述
    在这里插入图片描述

  • 确定后,可以看到入网规则多了“TCP:26000”,如下图:
    在这里插入图片描述

9.3 下载并安装JDK

  • 下载JDK
    在这里插入图片描述

  • 点击jdk-8u261-windows-x64.exe进行安装 默认设置即可,出现安装进度
    在这里插入图片描述

  • 如下显示表示安装成功: 在这里插入图片描述

  • 查看安装目录
    在这里插入图片描述

9.4 配置JDK环境变量

  • 右击“此电脑”选择“属性”,点击“高级系统设置”
    在这里插入图片描述
    在这里插入图片描述

  • 点击“环境变量”,新建系统变量“JAVA_HOME”,输入JDK安装目录
    在这里插入图片描述
    在这里插入图片描述
    C:\Program Files\Java\jdk1.8.0_261为JDK安装目录

  • 编辑系统变量“path”
    在这里插入图片描述
    在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)。

  • 新建系统变量“CLASSPATH”变量,输入“.” 即可
    在这里插入图片描述

  • 系统变量配置完毕,查询检验是否配置成功,运行 cmd 输入java -version(java和 -version之间有空格)。 显示版本信息,则说明安装和配置成功

9.5 连接openGauss并执行java代码

9.5.1 使用Java程序连接数据库并进行查询

步骤 1使用Java程序连接数据库并进行查询(注:请用户根据实际情况替换红字内容,修改jdbc:postgresql://弹性公网IP:26000/demo中弹性公网IP信息,USER = "dbuser"连接数据库的用户及密码PASS = “Gauss#3demo”)。

在d:\Download\中创建openGaussDemo.java文件,文件内容如下,注意红字部分要按照实际情况进行替换:

import java.sql.*; 
public class openGaussDemo {
   
   <!-- -->
 
    static final String JDBC_DRIVER = "org.postgresql.Driver";  
    static final String DB_URL = "jdbc:postgresql://弹性公网IP:26000/demo?ApplicationName=app1";
      // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "dbuser";
    static final String PASS = "Gauss#3demo";
         public static void main(String[] args) {
   
   <!-- -->
        Connection conn = null;
        Statement stmt = null;
        try{
   
   <!-- -->
            // 注册 JDBC 驱动
            Class.forName(JDBC_DRIVER);
        
            // 打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            // 执行查询
            System.out.println(" 实例化Statement对象...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, name, url FROM demo.websites";
            ResultSet rs = stmt.executeQuery(sql);
        
            // 展开结果集数据库
            while(rs.next()){
   
   <!-- -->
                // 通过字段检索
                int id  = rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("url");
    
                // 输出数据
                System.out.print("ID: " + id);
                System.out.print(", 站点名称: " + name);
                System.out.print(", 站点 URL: " + url);
                System.out.print("\n");
            }
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
   
   <!-- -->
            // 处理 JDBC 错误
            se.printStackTrace();
        }catch(Exception e){
   
   <!-- -->
            // 处理 Class.forName 错误
            e.printStackTrace();
        }finally{
   
   <!-- -->
            // 关闭资源
            try{
   
   <!-- -->
                if(stmt!=null) stmt.close();
            }catch(SQLException se2){
   
   <!-- -->
                        }// 什么都不做
            try{
   
   <!-- -->
                if(conn!=null) conn.close();
            }catch(SQLException se){
   
   <!-- -->
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
}

9.5.2 编译后执行

在安装Java的本机,打开cmd对Java程序编译后执行 在cmd中,进入d:\Download\目录,先对Java程序进行编译(进入Java程序的目录)

javac -encoding utf-8 -cp d:\Download\postgresql.jar openGaussDemo.java

java -cp .;D:/Download/postgresql.jar openGaussDemo

9.5.3 执行结果

连接数据库...
 实例化Statement对象...
ID: 1, 站点名称: openGauss, 站点 URL: https://opengauss.org/zh/
ID: 2, 站点名称: 华为云, 站点 URL: https://www.huaweicloud.com/
ID: 3, 站点名称: openEuler, 站点 URL: https://openeuler.org/zh/
ID: 4, 站点名称: 华为support中心, 站点 URL: https://support.huaweicloud.com/
Goodbye!

A 其他操作

● 查看帮助信息:postgres=# \?
● 切换数据库:postgres=# \c dbname
● 列举数据库:postgres=# \l
● 退出数据库:postgres=# \q
● 通过系统表pg_database查询数据库列表:postgres=# SELECT datname FROM pg_database;
● 列举所有表、视图和索引:postgres=# \d+
● 列举表:postgres=# \dt
● 查询表的属性:postgres=# \d+ tablename
● 查看表结构:postgres=# \d tablename
● 查询表空间:postgres=# \db
● 检查pg_tablespace系统表,即系统和用户定义的全部表空间:postgres=# SELECT spcname FROM pg_tablespace;
● 列举SCHEMA:postgres=# \dn
● 列举索引:postgres=# \di
● 查看数据库用户列表:postgres=# SELECT * FROM pg_user;
● 查看用户属性:postgres=# SELECT * FROM pg_authid;
● 查看所有角色:postgres=# SELECT * FROM PG_ROLES;
● 切换用户:postgres=# \c – username

● 查看openGauss支持的所有SQL语句:postgres=#\h

参考链接

B. oracle、mysql、sql server、Navicat

  1. 从数据库类型来看
    oracle、mysql 和 sql server都是关系型数据库。
    Navicat是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。

  2. 从应用场景来看
    MySQL,SQL Server可以理解为中小型数据库,Oracle则是大型数据库。(相对而言吧)
    MySQL:基本上能支持所有的主流操作系统Windows,Linux,Unix
    SQL Server:微软的亲儿子,我肯定得主要是支持Windows,不过现在也已经支持Linux了
    Oracle:虽然windows 和 Linux都支持,不过从性能上看在Linux上使用更优。
    Navicat:是一个强大的MySQL数据库管理和开发工具,Navicat for MySQL经常搭配使用。
    由于其可视化的界面以及众多管理工具,大大提升了数据库的开发以及运维的效率。

  3. 从费用来看
    mysql是开源,其他全收费。
    由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
    Linux作为操作系统,Apache 或Nginx作为 Web 服务器,MySQL作为数据库,PHP/Perl/Python作为服务器端脚本解释器。
    由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合。真香组合

猜你喜欢

转载自blog.csdn.net/deer2019530/article/details/129260416