文章目录
- 0. 准备工作
- 0.1 实验环境
- 0.2 主要内容
- 0.3 学习资源
- 1. 安装部署实验(实验一)
- 1.1 下载VirtualBox
- 1.2 安装VirtualBox
- 1.3 镜像文件导入
- 1.4 启动虚拟机
- 1.5 数据库使用
- 1.6 数据库基本操作
- 2 表&模式(实验二)
- 2.1 创建模式
- 2.2 创建表
- 2.3 索引
- 2.4 修改表
- 2.5 插入表数据
- 3 查询&更新(实验三)
- 3.1 查询
- 3.1.1 SELECT语句一般形式
- 3.1.2 不带 WHERE 的简单查询
- 3.1.3 带 WHERE 子句的查询
- 3.1.4 排序和分组
- 3.1.5 连接查询
- 3.1.6 嵌套查询
- 3.1.7 集合运算
- 3.2 更新
- 3.2.1 插入
- 3.2.2 更新
- 3.2.3 删除
- 4 视图(实验四)
- 4.1 定义视图
- 4.2 基于视图查询
- 4.3 基于视图更新
- 4.4 删除视图
- 5 完整性控制(实验五)
- 5.1 创建表及主键约束、检查约束、外键约束
- 5.2 添加唯一性约束
- 5.3 创建触发器
- 5.3.1 插入
- 5.3.2 更新
- 5.4 其他
- 5.4.1 插入表数据
- 5.4.2 修改表数据
- 5.4.3 删除外键
- 5.4.4 添加外键
- 6 安全性控制(实验六)
- 6.1 数据库用户&角色
- 6.1.1 用户USER:
- 6.1.2 角色ROLE:
- 6.2 GRANT&REVOKE
- 6.2.1 将系统权限SYSADMIN授权给USER/ROLE
- 6.2.2 将数据库对象授权给USER/ROLE
- 6.2.3 将USER/ROLE的权限授权给其他USER/ROLE
- 6.2.4 回收权限并清理用户
- 7 事务并发与控制(实验七)
- 7.1 事务
- 7.1.1 事务的ACID特性
- 7.1.2 事务管理
- 7.1.3 事务实例
- 1.未提交的事务
- 2.已提交的事务
- 7.2 并发控制
- 7.2.1 加锁语法
- 7.2.2 加锁实例
- 8 数据库备份与恢复(实验八)
- 8.1 物理备份和恢复
- 8.1.1 实验准备
- 8.1.2 物理备份
- 8.1.3 物理备份恢复
- 8.2 逻辑备份和恢复
- 8.2.1 实验准备:
- 8.2.2 gs_dump备份
- 1. gs_dump备份示例1
- 2. gs_dump备份示例2
- 3. gs_dump备份示例3
- 4. gs_dump备份示例4
- 5.gs_dump备份示例5
- 8.2.3 gs_dumpall备份
- 8.2.4 gs_restore导入
- 1. gs_restore导入示例1
- 2.gs_restore导入示例2
- 3.gs_restore导入示例3
- 4.gs_restore导入示例4
- 9 使用JDBC连接数据库(实验九)
- 9.1 准备连接环境
- 9.1.1 修改数据库的pg_hba.conf文件
- 9.1.2 登陆数据库授权退出
- 9.1.3 修改数据库监听地址
- 9.1.4 下载Java驱动包导入工具
- 9.1.5 创建测试数据库demo
- 9.1.6 创建schema
- 9.1.7 创建测试表websites
- 9.1.8 插入数据
- 9.1.9 退出数据库
- 9.2 确定26000端口是否放开
- 9.3 下载并安装JDK
- 9.4 配置JDK环境变量
- 9.5 连接openGauss并执行java代码
- 9.5.1 使用Java程序连接数据库并进行查询
- 9.5.2 编译后执行
- 9.5.3 执行结果
- A 其他操作
- B. oracle、mysql、sql server、Navicat
0. 准备工作
0.1 实验环境
openGauss 实验环境部署模式:通过创建虚拟机,选用开源操作系统openEuler来搭建,无额外使用成本。
0.2 主要内容
0.3 学习资源
- 华为MOOC
ilearningx
数据库学习路线
华为云在线课程 - 教材
1. 安装部署实验(实验一)
1.1 下载VirtualBox
VirtualBox官网
下载后,如下图所示:
1.2 安装VirtualBox
- 双击VirtualBox安装时,报错:
报错:virtualbox安装"此应用无法在设备上运行"
- 关闭内存完整性,重启之后。双击VirtualBox进行安装,安装路径为
F:\APP\install\VirtualBox
,如下图所示。
1.3 镜像文件导入
- 打开VirtualBox管理器,点击导入
- 选择要导入的镜像文件
openEuler_openGauss.ova
所在路径,假设为F:\APP\DownLoad
,并点击 下一步
镜像文件openEuler_openGauss.ova
如下。
- 在 虚拟电脑导入设置 中,修改 默认虚拟电脑位置,假设为
F:\APP\data\VirtualBox
,之后点击 导入
- 等待导入完成
1.4 启动虚拟机
- 导入完成后,点击 启动,启动虚拟机
- 输入用户名
root
和 密码openGauss@123
。登陆成功后,修改密码,改为123456
。具体步骤如下图:
- 输入
ifconfig
,查看两张网卡是否正常,如下图:
1.5 数据库使用
-
使用putty连接虚拟机,从本地电脑通过配置enp0s3网卡的ip地址(从ifconfig可知,为192.168.56.101)来连接虚拟机。
-
使用
root
用户来登录,密码为上述5.2.2
中更改后的密码123456
-
以操作系统用户omm登录数据库主节点,输入
su - omm
-
启动服务,输入
gs_om -t start
,显示如下结果,则表示启动成功。
-
连接数据库,输入
gsql -d postgres -p 26000 -r
,显示如下结果则表示连接成功。
【postgres
为openGauss安装完成后默认生成的数据库,初始可以连接到此数据库进行新数据库的创建。】
【26000
为数据库主节点的端口号,需要根据openGauss的实际情况替换,请确认连接信息获取。】
【使用数据库前,需先使用客户端程序或工具连接到数据库,然后就可以通过客户端程序或工具执行SQL来使用数据库了。gsql
是openGauss数据库提供的命令行方式的数据库连接工具。】
-
连接数据库时,
omm
用户密码为:openGauss@123,输入alter role omm identified by 'openGauss@1234' replace 'openGauss@123';
更改密码,新密码为openGauss@1234
-
创建数据库用户
默认只有openGauss安装时创建的管理员用户可以访问初始数据库,输入CREATE USER ljh WITH PASSWORD "openGauss@1234";
创建其他数据库用户帐号。【其他数据库用户CREATE USER lumi WITH PASSWORD "openGauss@1234";
】
其中,账号为ljh
,密码为openGauss@1234
-
创建数据库,输入
CREATE DATABASE db_tpcc OWNER ljh;
,创建了db_tpcc
数据库【其他数据库:CREATE DATABASE db_lumi OWNER lumi;
】
-
创建完
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
】 -
当结果显示为如下信息,则表示连接成功。
1.6 数据库基本操作
1. 华为 openGauss (GaussDB) 1.0 使用手册
2. openGauss数据库开发指导手册(上)
2. openGauss数据库开发指导手册(下)
4. openGauss数据库开发者指南
5. 华为云
报错:permission denied for schema public
2 表&模式(实验二)
- 创建数据库、模式、表和索引。
- 修改基本表的结构。
在OpenGauss数据库系统中使用SQL语句(按教材上所示的属性)建立基本表,如STUDENT表、COURSE表、SC表等,并向表中填充数据。熟悉使用虚拟机进行OpenGauss中SQL语句的代码输入方式。- 创建和删除索引
使用SQL语句在上述表中创建索引,熟悉相应的SQL语句,请参考教材P73-79页的SQL语句,请注意标准SQL和openGauss中相应SQL语句相同与不同之处。
2.1 创建模式
CREATE SCHEMA ljh AUTHORIZATION ljh;
2.2 创建表
- 创建 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));
- 创建 courses表
CREATE TABLE courses(cno CHAR(5) PRIMARY KEY,cname CHAR(20) NOT NULL,period SMALLINT, credit SMALLINT);
- 创建 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 索引
- 为 students 表上的 dno 创建 students_dept索引
db_tpcc=> CREATE INDEX students_dept ON students(dno);
- 删除该索引(
\di
查看索引,DBMS自动为主码创建索引)
DROP INDEX students_dept
2.4 修改表
- 修改 students 表的 sex 列的数据类型
ALTER TEBLE students ALTER sex TYPE char(4);
2.5 插入表数据
- 插入 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');
- 插入courses 表数据
INSERT INTO courses(cno,cname,period, credit) VALUES (001,'计算机系','4','3');
INSERT INTO courses(cno,cname,period, credit) VALUES (002,'医学系','5','6');
- 插入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 查询&更新(实验三)
- 查询操作
根据教材P79-94页所有查询实例,完成各类查询操作。- 更新操作
根据教材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 的简单查询
- 查询所以课程信息
- 查询2023年时,学生的年龄(使用函数
date_part('year',birthday)
)
3.1.3 带 WHERE 子句的查询
- 比较表达式
(1)成绩低于90分的学生的编号
- BETWEEN表达式
(1)出生年份在 1997~2005 之间的学生的编号和专业
(2)出生年份不在 1997~2005 之间的学生的编号和专业
- IN表达式
(1)人工智能专业的学生的编号和姓名
(1)不是人工智能或儿科专业的学生的编号和姓名
- LIKE表达式
(1)以 计 开头的课程名
- NULL表达式
(1)课程成绩为空的学生的编号和课程的编号
3.1.4 排序和分组
- 将查询结果排序
(1)查询每个学生001课程的成绩,并降序排列
(2)所有成绩降序排列
- 聚集函数
(1)查询001课程的元组个数,即选修001课程的人数
(2)成绩的最小,平均,最大值
- 分组
(1)查询每个学生的平均成绩,输出学号和平均成绩
(2)查询每个学生的平均成绩,输出平均成绩>90的学生学号和平均成绩
3.1.5 连接查询
- 课程编号为001的课程名和成绩
- 每个学生(编号,姓名)选修的每门课(课程名)的成绩
- 查询每个学生的平均成绩,并输出平均成绩大于90的学生编号,姓名,平均成绩
- 和卢一出生年份相同的其他学生的姓名
3.1.6 嵌套查询
-
IN 引出的子查询
(1)查询和卢一相同dno的男同学的学生编号和姓名
-
集合的比较引出的子查询
(1)比dno为001的所有学生都小的其他专业的学生编号,姓名,专业,出生日期
(2)(课程)平均成绩最高的课程号和平均成绩
-
存在量词引出的子查询
(1)所有选修了001课程的学生编号和姓名
(2)查询选修了所有课程的学生
(3)至少选修了 学生1所选修的全部课程 的学生
-
检查子查询结果中的重复元素
3.1.7 集合运算
(1)选修了 001或002课程 的学生
(2)选修了 001和002课程 的学生
(3)选修了001 未选修002课程 的学生
3.2 更新
3.2.1 插入
- 查询已有数据,避免插入冲突
- 插入数据 并查询结果
3.2.2 更新
- 更新学生7和1的入学年份
3.2.3 删除
- 删除学生7的信息
4 视图(实验四)
- 使用SQL语句创建视图。
- 对视图执行创建、查找、更新等操作,对比和基本表进行查找、更新操作有无不同之处。
4.1 定义视图
-
建立视图
(1)建立dno为001的学生视图se_students,包含Students中dno为001的所有属性(除了Speciality)
(2)建立dno为001的视图se_sc,包含 Students中dno为001 的学生的 所有SC的属性
(3)建立学生成绩视图students_grades,包含学号、学生姓名、课程名和成绩。 -
查看视图的具体信息
(1)se_students视图
4.2 基于视图查询
- 查询dno为001的男生(已经定义了dno为001的学生视图SE_Students,可以直接使用。
- 查询学号为 1 的学生的各科成绩,要求显示学生姓名,课程名和成绩。(查询涉及三个表Students,SC和Courses。可以使用定义的学生成绩视图Students_Grades查询)
4.3 基于视图更新
openGauss不支持视图更新
ALTER viewname RENAME TO newname
,更改视图名称se_students为ve_students
4.4 删除视图
-
先查看所有视图
-
删除视图se_sc,再次查看所有视图
5 完整性控制(实验五)
- 练习创建下面约束:
主键(PRIMARY KEY)约束;
检查(CHECK)约束;
外键(FOREIGN KEY)约束:外键约束是为了强制实现表之间的参照完整性。级联参照完整性约束就是为了保证外键数据的关联性。
唯一性(UNIQUE)约束:将STUDENTS表中的SNAME列设为唯一键约束、COURSES表中的CNAME列设为唯一键约束;- 创建触发器
触发器是一种特殊类型的存储过程,通常用于实现强制业务规则和数据完整性。创建UPDATE触发器检查修改操作的业务规则,如:在STUDENTS表上建立触发器,当用户修改学生的学号时给出提示信息。
5.1 创建表及主键约束、检查约束、外键约束
- 首先创建数据库及用户,并为用户赋予权限,之后创建表。详细过程如下:
- 上图创建表的过程也添加了PRIMARY KEY约束、CHECK约束、FOREIGN KEY约束。详情通过
\d+ 表名
查看,如下图所示。
5.2 添加唯一性约束
将STUDENTS表中的SNAME列设为唯一键约束、COURSES表中的CNAME列设为唯一键约束;
- 使用
ALTER TABLE students ADD UNIQUE(sname);
和ALTER TABLE courses ADD UNIQUE(cname);
创建唯一性约束。 - 为
students
和courses
添加唯一性约束之后的变化如下图所示:
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表上建立触发器,当插入数据时给出提示信息。
- 创建函数
CREATE OR REPLACE FUNCTION insert_stu() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
RAISE NOTICE'插入成功!';
RETURN NEW;
END
$$ LANGUAGE PLPGSQL;
- 创建触发器
CREATE TRIGGER insert_trigger
AFTER INSERT ON students
FOR EACH ROW
EXECUTE PROCEDURE insert_stu();
- 测试
由于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表上建立触发器,当用户修改学生的学号时给出提示信息。
- 创建函数
CREATE OR REPLACE FUNCTION update_stu() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
RAISE NOTICE'更新成功!';
RETURN NEW;
END
$$ LANGUAGE PLPGSQL;
- 创建触发器
CREATE TRIGGER update_trigger
AFTER UPDATE ON students
FOR EACH ROW
EXECUTE PROCEDURE update_stu();
- 测试
UPDATE students SET sno='01' WHERE sname='卢一';
具体过程如下:
5.4 其他
5.4.1 插入表数据
-
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 (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');
-
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');
-
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 添加外键
-
为表sc添加外键之前,应该先把表sc的sno=01改为sno=1。否则外键会添加失败,因此sc的外键sno 是 students的主键sno,值应该保持一致。
-
输入
ALTER TABLE sc ADD CONSTRAINT sc_sno_fkey FOREIGN KEY (sno) REFERENCES students(sno);
重新创建外键sno。结果如下图所示:
6 安全性控制(实验六)
- 创建一些数据库用户,并理解数据库用户和角色之间的关系。
- 利用查询分析器熟悉通过SQL对数据进行安全性控制(grant和revoke语句)。
6.1 数据库用户&角色
6.1.1 用户USER:
- 通过CREATE USER创建的用户,默认具有LOGIN权限;
- 创建用户的同时会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA;
- 其他数据库中,则不自动创建同名的SCHEMA;可使用CREATE SCHEMA命令,分别在其他数据库中,为该用户创建同名SCHEMA。
- 创建用户
lll
,登录密码为‘openGauss@1234
,创建完成后,查看用户列表
- 授予用户
lll
创建角色权限CREATE ROLE
6.1.2 角色ROLE:
- 拥有数据库对象和权限的实体。在不同的环境中角色可以认为是一个用户,一个组或者兼顾两者。
- 在数据库中添加一个新角色,角色无LOGIN权限。
- 创建角色的用户必须具备CREATE ROLE的权限【
ALTER USER 用户名 CREATEROLE;
】或者是系统管理员。
- 创建一个角色,名为
lllr
,密码为openGauss@1234
,创建完后查看角色列表。
- 修改角色
lllr
为系统管理员,再次查看角色列表
6.2 GRANT&REVOKE
6.2.1 将系统权限SYSADMIN授权给USER/ROLE
- 将系统权限SYSADMIN授权给用户
lll
,授权后查看角色列表
6.2.2 将数据库对象授权给USER/ROLE
-
创建模式
llls
,并在模式llls
下创建表students
-
将模式
llls
的使用权限和表llls.students
的所有权限授权给用户lll
-
将表
llls.students
中列sno,sname,sex,dno
的查询权限,sno
的更新权限授权给lll
-
将数据库
postgres
的连接权限授权给用户lll
,并授予用户lll
在postgres
中创建schema
的权限,而且允许用户lll
将此权限授权给其他用户(WITH GRANT OPTION
)
-
将模式
llls
的访问权限授权给角色lllr
,并授予角色lllr
在llls
下创建对象的权限,不允许角色lllr
中的用户将权限授权给其他人。
6.2.3 将USER/ROLE的权限授权给其他USER/ROLE
-
将用户
lll
的权限授权给角色lllr
,并允许角色lllr
将权限授权给其他人
-
创建用户
hhh
,将角色lllr
的权限授权给用户hhh
6.2.4 回收权限并清理用户
-
回收角色
lllr
,用户lll
,用户hhh
,模式llls
的权限
-
删除角色
lllr
,删除用户lll
,删除用户hhh
,删除模式llls
删除完成后查看模式和角色:
后续实验参考CSDNBkbK-
7 事务并发与控制(实验七)
- 编写事务实例,分别使其成功提交和回滚,观察该事务对数据库的影响。
- 利用数据库管理系统提供的封锁机制解决并发操作带来的数据不一致情况。
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 实验准备
- 切换到omm用户,以操作系统用户omm登录数据库主节点
su - omm
- 创建存储备份文件的文件夹
mkdir -p /home/omm/physical/backup
8.1.2 物理备份
- 如果数据库服务没有启动,就启动数据库服务(务必以操作系统用户omm启动数据库服务,如果没有请切换用户)。
gs_om -t start
- 将数据库进行物理备份
gs_basebackup -D /home/omm/physical/backup -p 26000
- 切换到存储备份文件夹查看备份文件
cd /home/omm/physical/backup
ls
8.1.3 物理备份恢复
- 停止openGauss((务必以操作系统用户omm停止数据库服务,如果没有请切换用户)。
gs_om -t stop
- 清理原库中的所有或部分文件,对数据库文件进行破坏。
cd /gaussdb/data/
cd db1
rm -rf *
- 使用数据库系统用户权限从备份中还原需要的数据库文件,
/gaussdb/data/db1
中db1是数据库节点文件夹名称,不同数据库可能不同请查看确认。
cp -r /home/omm/physical/backup/. /gaussdb/data/db1
- 备份时间大概需要几分钟,恢复后文件列表如下:
cd /gaussdb/data/db1
ls
- 重启数据库服务器, 并检查数据库内容,确保数据库已经恢复到所需的状态
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连接数据库(实验九)
- 在openGauss中创建数据库、表;
- 使用jdbc连接到新创建的数据库;
- 在java程序中改变数据库中的值或者输出数据库中的值;
- 请参考华为提供的实验手册:openGauss场景化综合应用实验。
9.1 准备连接环境
9.1.1 修改数据库的pg_hba.conf文件
- 在GS_HOME中查找pg_hba.conf文件,本实验中数据库GS_HOME设置的为/gaussdb/data/db1,实际操作中GS_HOME地址可以查看安装时的配置文件:
<PARAM name="dataNode1" value="/gaussdb/data/db1"/>
。
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
-
从数据库类型来看
oracle、mysql 和 sql server都是关系型数据库。
Navicat是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。 -
从应用场景来看
MySQL,SQL Server可以理解为中小型数据库,Oracle则是大型数据库。(相对而言吧)
MySQL:基本上能支持所有的主流操作系统Windows,Linux,Unix
SQL Server:微软的亲儿子,我肯定得主要是支持Windows,不过现在也已经支持Linux了
Oracle:虽然windows 和 Linux都支持,不过从性能上看在Linux上使用更优。
Navicat:是一个强大的MySQL数据库管理和开发工具,Navicat for MySQL经常搭配使用。
由于其可视化的界面以及众多管理工具,大大提升了数据库的开发以及运维的效率。 -
从费用来看
mysql是开源,其他全收费。
由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
Linux作为操作系统,Apache 或Nginx作为 Web 服务器,MySQL作为数据库,PHP/Perl/Python作为服务器端脚本解释器。
由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合。真香组合