首页 / 资讯中心 / 文章详情

openGauss数据库实验全攻略:从安装到JDBC的九个实战

openGauss数据库实验全攻略:从安装到JDBC的九个实战 ★ FEATURED ARTICLE
简介面向数据库初学者的zzu数据库实验报告书完整收录《数据库系统原理实验》九个实验环节涵盖OpenGauss环境搭建、数据库/表/索引创建、交互式SQL、视图、完整性控制、安全性控制、事务与并发控制、备份恢复及JDBC连接等主题适合计算机科学与技术、软件工程专业学生对照开展数据库实践。压缩包内为1个docx文档包体大小3.23MB目录层级清晰并配有命令示例便于按实验顺序查阅或打印后填写。已有1522人学习。报告中除逐项记录实验目的、操作步骤与结果分析外还包含常见问题排查和关键语句说明可帮助读者系统理解数据库管理系统的运行机制提升SQL编写与数据库运维能力为后续课程或毕业设计中的开发实践打下基础。1. 认识 DBMS 系统一份能把九个实验串起来的 openGauss 实验报告书“数据库系统原理实验”这门课真正的门槛往往不在 SQL 语法而在第一步把 openGauss 装起来、连上、建出第一张表。这份报告书把九个实验从头串到尾安装 DBMS、建库建表建索引、交互式 SQL、视图、完整性、安全性、事务并发、备份恢复、JDBC 连接每个实验都有明确操作路径和验证方式。对正在赶实验报告的学生照着这个节奏走能少踩一半弯路对要带实验的助教或刚接触数据库的开发者这是一份现成的实验设计参考。技术重心集中在建表时的约束设计、用户角色权限隔离以及最后用 JDBC 连接数据库的工程化细节。2. 把 openGauss 跑起来安装模式选型、gsql 连接与常用元命令2.1 三种安装模式怎么选别一上来就踩虚拟机的坑报告书在实验一里给了明确路线先选安装方式再启动服务最后用 gsql 连上默认数据库。安装方式有三种公有云主机上直接安装、虚拟机一键安装镜像、先在虚拟机里装好 openEuler 系统再手动装 openGauss。三种方式的取舍我的建议很简单。云主机安装适合手头有云资源、不想折腾本地虚拟机的场景缺点是 openGauss 对内存要求不低2G 内存跑起来很勉强建议至少 4G。一键安装镜像适合赶实验进度的学生导入虚拟机工具就能用数据库和系统依赖都是配好的缺点是安装过程是个黑匣子后面出了问题不好排查。手动安装最接近生产环境从操作系统、依赖库到数据库实例初始化全走一遍耗时最长但收获也最大适合想搞懂 openGauss 目录结构和启动机制的人。| 安装方式 | 适合谁 | 时间成本 | 主要风险 | | 云主机安装 | 有云资源、要公网访问 | 中 | 内存不足、按量计费 | | 一键安装镜像 | 赶实验报告、怕麻烦 | 低 | 环境黑匣子出问题难排查 | | openEuler 手动安装 | 想搞懂原理 | 高 | 依赖缺失、初始化失败 |我的判断是如果只是把这门实验课过一遍一键镜像最稳如果后面还要做备份恢复或 JDBC 实验建议手动装一次至少你知道数据目录在哪、配置文件在哪排查问题不用靠猜。提示无论选哪种方式安装完成后第一件事是记住安装用户和端口号。openGauss 默认的管理员用户是 omm默认端口 26000后面每个实验都要用这两个值。2.2 启动服务与连接数据库端口、用户与第一条命令安装完成后openGauss 不会自动对外服务需要先切换至安装用户 omm再拉起数据库服务。这里强调切换用户是因为 openGauss 的服务进程只允许 omm 用户操作直接用 root 执行启动命令会报权限错误。顺序不正确很容易翻车。# 切换到安装用户 omm su - omm # 启动 openGauss 主节点服务 gs_om -t startgs_om 是 openGauss 的运维工具-t start 表示启动主节点服务。启动完成后可以执行 gs_om -t status 确认状态看到主节点状态正常再继续。服务起来后用 gsql 连接默认数据库 postgres# 连接默认数据库 postgres端口 26000 gsql -d postgres -p 26000 -rgsql 是 openGauss 自带的命令行客户端-d 指定数据库名-p 指定端口号-r 表示启用 readline 行编辑功能支持方向键回翻命令。postgres 是安装后自动生成的初始数据库新建其他数据库之前都要先连上它。这里有个容易被忽略的点如果连接时提示端口未监听先别急着检查 gsql多半是服务没起来或者防火墙拦截了 26000这个后面避坑章单独说。连接成功后常见的做法是创建自己的实验用户。openGauss 对密码有复杂度要求至少 8 位且要包含大小写字母和数字直接写简单密码会被策略拒绝CREATE USER myuser WITH PASSWORD Mypass2022;这条 CREATE USER 语句创建名为 myuser 的数据库用户WITH PASSWORD 指定登录密码。创建用户后可以切换连接gsql -d postgres -p 26000 -U myuser -W Mypass2022 -r-U 指定用户名-W 指定密码。后续建库建表我建议先建一个自己的库再切过去避免污染初始数据库。2.3 元命令与系统表\l、\dt、\d 分别查什么openGauss 的 gsql 客户端里有一批反斜杠开头的元命令它们和 SQL 语句是两套体系元命令直接由客户端解析不走 SQL 引擎但很多元命令背后查的就是系统表。搞清楚这个对应关系你就能理解为什么有的命令能看对象列表、有的命令能看表结构。| 元命令 | 作用 | 等价或对应的系统表 | | \l | 查看数据库列表 | pg_database | | \dt | 查看表列表 | pg_class / pg_namespace | | \d | 查看所有表、视图、索引 | 系统表联合查询 | | \d tablename | 查看表属性含约束 | pg_attribute 等 | | \d tablename | 查看表结构 | 同上 | | \dn | 查看模式列表 | pg_namespace | | \di | 查看索引列表 | pg_index | | \db | 查看表空间 | pg_tablespace | | \q | 退出 gsql | 无 |在 gsql 里执行 \l能看到类似下面的输出postgres# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges --------------------------------------------------------------- postgres | omm | UTF8 | C | C |直接查系统表是更灵活的排查方式报告书里列了几个最常用的-- 查看所有数据库名 SELECT datname FROM pg_database; -- 查看所有表空间名 SELECT spcname FROM pg_tablespace; -- 查看用户列表 SELECT * FROM pg_user; -- 查看角色列表 SELECT * FROM pg_roles;这里顺带带出一个概念用户和角色不是一回事。用户是具体的账户个体角色是权限的集合。比如仓库管理员是一个角色公司里多个具体管理员是不同的用户给新员工赋一个仓库管理员角色他就自动获得对应权限调岗时换个角色即可。数据库里的角色管理也是这个思路实验六的安全性控制会用到。元命令学到这实验一基本过关。验证标准很简单能连上 postgres 库、\l 能看到数据库列表、\dt 能看到空表列表平台就通了。3. 建库、建表与完整性约束表空间、schema、约束与索引的完整链路3.1 表空间与数据库先划空间再建库实验二的第一件事是建一个属于自己的数据库。openGauss 的建库逻辑和 MySQL 有些不一样它允许先建表空间再把数据库指定到这个表空间上相当于先划一块存储空间再在这块空间里建库。表空间可以理解为磁盘上的文件夹一个数据文件只能属于一个表空间但一个表空间可以容纳多个数据文件。CREATE TABLESPACE tpcds_local RELATIVE LOCATION tablespace/tablespace_1;RELATIVE LOCATION 指定的是相对数据目录的路径不是绝对路径这是 openGauss 的一个特点写绝对路径反而会报错。后面的目录如果不存在openGauss 会自动创建。接着建库CREATE DATABASE db_sc WITH TABLESPACE tpcds_local;这条语句把新数据库 db_sc 放到刚才创建的表空间里。如果之后觉得库名不合适可以用 ALTER DATABASE 改名ALTER DATABASE db_sc RENAME TO db_school;改名后切换\c db_school这里有一个实操细节\c 是 gsql 元命令不是 SQL 语句不能带分号直接回车执行。很多初学者习惯性这里加分号结果被当成 SQL 解析报语法错误。3.2 模式Schema物理对象与逻辑描述建完库之后是创建模式。报告书里专门辨析了 Schema 的两种含义概念上的 Schema 是一组 DDL 语句集完整描述数据库结构物理上的 Schema 是数据库里的一个名字空间包含一组表、视图和存储过程等命名对象。简单理解一个用户所拥有的数据库对象集合就是这个用户的 Schema。-- 创建名为 book_eg 的模式 CREATE SCHEMA book_eg;创建模式后可以在里面建表表名前加模式名前缀CREATE TABLE book_eg.Teachers ( Tno CHAR(20) PRIMARY KEY, Tname CHAR(20) NOT NULL );不加前缀的话表会建在默认模式 public 下。删除模式时如果里面已经有表必须级联删除DROP SCHEMA book_eg CASCADE;CASCADE 的含义是连同模式下的所有对象一起删掉。不加这个关键字而模式里已有表openGauss 会拒绝执行并提示存在依赖对象。反过来想这是一道安全机制CASCADE 很危险生产环境里删除前一定要确认没有需要保留的依赖。3.3 建表与列级/表级约束把完整性写进 DDL建表是实验二的核心也是整份报告书里最值得反复看的地方。报告书给出了教师、院系、学生、课程、选课、教学六张表它们之间互相有外键引用建表顺序和约束写法稍不留神就会报错。先说约束的分类。列级约束直接写在列定义后面用空格分隔不必指定列名表级约束与列定义用逗号分隔必须指明要约束的列名。关键界限是只涉及单列的约束两种写法都行涉及多列的约束比如联合主键必须写成表级约束。另外列级约束支持所有约束类型表级约束不支持 NOT NULL 和 DEFAULT。具体看代码。先建教师表注意 Dno 字段先当普通列外键等院系表建好再补-- 先建教师表Dno 暂不带外键避免循环依赖 CREATE TABLE Teachers ( Tno CHAR(20) PRIMARY KEY, Tname CHAR(20) NOT NULL, Sex CHAR(20) CHECK (Sex 男 OR Sex 女), Birthday DATE, Title CHAR(20), Dno CHAR(20) );Tno 是主键Tname 非空Sex 用 CHECK 限定取值。接着建院系表Departments 的外键 Dheadno 指向 Teachers 的主键 Tno表示系主任是某位教师-- Departments 引用 Teachers所以 Teachers 必须已存在 CREATE TABLE Departments ( Dno CHAR(20) PRIMARY KEY, Dname CHAR(20), Dheadno CHAR(20), FOREIGN KEY (Dheadno) REFERENCES Teachers(Tno) );因为 Teachers 先建这一步能顺利执行。现在补上 Teachers 的外键让两张表形成完整的循环引用-- 为已存在的教师表补充外键 ALTER TABLE Teachers ADD CONSTRAINT fk_teachers_dno FOREIGN KEY (Dno) REFERENCES Departments(Dno);这步用 ALTER TABLE 为已存在的表添加外键ADD CONSTRAINT 指定约束名FOREIGN KEY 指定本表列REFERENCES 指定引用目标。这个顺序是刻意的如果先建 Departments 再引用 Teachers或者先给 Teachers 补外键再建 Departments都会报关系不存在。再建学生表和课程表-- 学生表引用院系表 CREATE TABLE Students ( Sno CHAR(20) PRIMARY KEY, Sname CHAR(20) NOT NULL, Sex CHAR(20) CHECK (Sex 男 OR Sex 女), Birthday DATE, Enrollyear CHAR(20), Speciality CHAR(20), Dno CHAR(20), FOREIGN KEY (Dno) REFERENCES Departments(Dno) ); -- 课程表Period 和 Credit 用 SMALLINT CREATE TABLE Courses ( Cno CHAR(20) PRIMARY KEY, Cname CHAR(20) NOT NULL, Period SMALLINT, Credit SMALLINT );选课表 SC 报告书没给列定义按教材惯例是 Sno、Cno、Grade 三列Sno 和 Cno 联合做主键-- 选课表联合主键必须写成表级约束 CREATE TABLE SC ( Sno CHAR(20), Cno CHAR(20), Grade SMALLINT, PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Students(Sno), FOREIGN KEY (Cno) REFERENCES Courses(Cno) );联合主键 (Sno, Cno) 必须用表级约束因为涉及两列。最后是教学表 Teaches记录教师授课关系同样用联合主键-- 教学表教师与课程的授课关系 CREATE TABLE Teaches ( Tno CHAR(20), Cno CHAR(20), PRIMARY KEY (Tno, Cno), FOREIGN KEY (Tno) REFERENCES Teachers(Tno), FOREIGN KEY (Cno) REFERENCES Courses(Cno) );这里提醒一个类型问题Period 和 Grade 用的是 SMALLINTopenGauss 的 SMALLINT 是有符号 16 位整数范围是 -32768 到 32767。报告书里那段“无符号 SMALLINT 范围 0 到 65535”是 MySQL 里 UNSIGNED SMALLINT 的概念在 openGauss 里直接照抄会翻车后面避坑章节展开说。六张表建完执行 \dt所有表应该都在列表里了。3.4 索引主键自动索引与手动创建索引部分实验二要求不高建一个再删一个就够。在 Students 表的 Dno 列上创建索引-- 在 Students.Dno 上创建索引 CREATE INDEX Student_Dept ON Students(Dno);创建后用元命令确认# 查看索引列表 \di索引列表里会出现 Student_Dept。需要说明的是主键列会自动建立索引不需要手动创建所以你会看到系统里已有主键对应的索引。删除索引用 DROP INDEXDROP INDEX Student_Dept;报告书里还辨析了索引和目录的区别索引是把文献中具有检索意义的事项按照一定方式有序编排起来侧重于让你找到要找的文章目录是目和录的总称侧重于显示整篇文章的结构。类比到数据库索引确实像书的索引帮你快速定位行记录但索引会占用额外存储写操作时要同步维护不是越多越好。4. 交互式 SQL、视图与安全性控制从查询练手到权限隔离4.1 交互式 SQL 练什么基于三张表的核心查询实验三的定位是交互式 SQL 语句练习目标很朴素把增删改查写熟理解执行顺序和空值语义。基于上一章建好的 Students、Courses、SC 三张表最常见的一组练习如下。-- 条件查询筛选男生 SELECT Sno, Sname FROM Students WHERE Sex 男; -- 分组统计按课程号统计选课人数 SELECT Cno, COUNT(*) AS cnt FROM SC GROUP BY Cno; -- 三表连接查询学生选课成绩 SELECT Sname, Cname, Grade FROM Students, SC, Courses WHERE Students.Sno SC.Sno AND SC.Cno Courses.Cno;第一条是条件查询第二条按课程号分组统计人数AS 给聚合列起别名第三条是典型的三表连接查询从 Students 经过 SC 关联到 Courses取出姓名、课程名和成绩。交互式 SQL 的练习价值在于你在 gsql 里敲一条语句立刻能看到结果错了也不会污染数据非常适合验证对连接语义的理解。增删改的练习同样要覆盖-- 插入一条学生记录 INSERT INTO Students VALUES (20210001, 张三, 男, 2003-01-01, 2021, 计算机, D01); -- 更新学生专业 UPDATE Students SET Speciality 软件工程 WHERE Sno 20210001; -- 删除不及格选课记录 DELETE FROM SC WHERE Grade 60;INSERT 的 VALUES 顺序必须和表列顺序一致少一列或多一列都会报错。UPDATE 和 DELETE 的 WHERE 子句一定要写不写 WHERE 就是全表更新或全表删除这个习惯在实验阶段就要养好。4.2 视图逻辑抽象与查询简化实验四创建视图本质是做逻辑抽象。视图是一张虚拟表不实际存储数据每次查询时动态从基表取数。它的价值有两个一是简化复杂查询把频繁用到的多表连接存成视图二是做数据屏蔽只暴露必要的列给特定用户。-- 创建学生平均成绩视图 CREATE VIEW V_SC_Avg AS SELECT Sno, AVG(Grade) AS AvgGrade FROM SC GROUP BY Sno; -- 在视图基础上继续筛选 SELECT * FROM V_SC_Avg WHERE AvgGrade 85;第一条语句创建每个学生的平均成绩视图第二条在这个视图上继续筛选。注意视图名 V_SC_Avg列名 AvgGrade 由聚合表达式别名决定。基表数据变化时视图查询结果会自动跟着变这也是视图和临时表的本质区别。视图能不能更新取决于视图定义是否可解析。简单视图也就是只查单表、不含聚合和 DISTINCT 的视图可以执行 UPDATE-- 简单视图只查单表的行子集 CREATE VIEW V_Male_Student AS SELECT Sno, Sname, Sex FROM Students WHERE Sex 男; -- 简单视图允许更新 UPDATE V_Male_Student SET Sname 李四 WHERE Sno 20210001;但包含 GROUP BY、聚合函数、多表连接的视图不能更新openGauss 在执行 UPDATE 时会直接报错。判断标准就一条视图定义里有没有丢失与基表行的对应关系。删除视图用 DROP VIEW V_SC_Avg。4.3 角色与用户权限控制怎么设计实验六的安全性控制核心是搞清楚用户、角色、权限三者关系。常见的语法如下-- 创建可登录的用户 CREATE USER db_user PASSWORD User12345; -- 创建角色权限的集合 CREATE ROLE db_role;用户是可以登录数据库的账户角色是权限的集合。两者的边界在 openGauss 里其实就是能不能登录默认 CREATE USER 创建的可以登录CREATE ROLE 创建的不可以。角色存在的意义是批量授权——新员工入职直接授予现有角色调岗就换角色不需要逐个重新授权。-- 给角色授予 Students 表的查询权限 GRANT SELECT ON TABLE Students TO db_role; -- 把角色授予用户用户继承角色权限 GRANT db_role TO db_user; -- 回收角色权限所有拥有该角色的用户同步失去 REVOKE SELECT ON TABLE Students FROM db_role;权限控制还有一层关键配合用视图做行级或列级隔离。比如不想让普通用户看到 Students 表的 Birthday、Speciality 列可以先建一个只含必要列的视图再把这个视图的 SELECT 权限授出去-- 创建只含公开列的视图 CREATE VIEW V_Student_Public AS SELECT Sno, Sname, Sex FROM Students; -- 只授予视图查询权限 GRANT SELECT ON V_Student_Public TO db_role;这样用户能查视图但直接查基表会被拒绝实现了最小权限原则。安全性实验的验证方式也很直接用 db_user 登录查视图有数据查 Students 原表提示权限不足实验就算通过。5. openGauss 实验高频踩坑与排查五个现场重现九个实验做下来真正卡人的往往不是 SQL 语法本身而是环境、顺序、参数这类细节。下面五条是按这份报告书复现时遇到过的真实问题每条都按现象、原因、解决说清楚。5.1 端口 26000 连不上服务没起还是防火墙拦截现象执行 gsql -d postgres -p 26000 -r 后长时间无响应最后报连接拒绝或超时。原因绝大多数情况是服务根本没启动少数情况是虚拟机防火墙拦截了 26000 端口。还有个隐蔽场景主节点端口不是 26000可能是安装时改过配置。解决先确认服务状态执行 gs_om -t status看主节点状态是否正常。服务没起就用 gs_om -t start 启动。服务正常仍连不上检查端口监听ss -lntp | grep 26000没有输出就是端口没监听。最后排查防火墙在虚拟机里放行 26000。从那以后我排查连接问题都按这个顺序服务状态、端口监听、防火墙不再瞎猜。5.2 建表顺序反了外键报“关系不存在”现象执行 CREATE TABLE Departments 时报错提示引用的 Teachers 表不存在。原因表与表之间存在外键引用被引用的表必须比引用表先创建。如果先建引用表再建被引用表openGauss 解析外键时找不到目标表。解决调整建表顺序先建被引用表。遇到循环引用比如报告书里的 Teachers 和 Departments 互相引用先建不带外键的版本再用 ALTER TABLE ADD CONSTRAINT 补外键。整体顺序是 Teachers、Departments、ALTER Teachers 补外键、Students、Courses、SC、Teaches。这个顺序我在每次新建实验库时都会重头核对一遍。5.3 SMALLINT 范围记错数据插不进去现象往 Period 或 Grade 字段插入较大数值时报 smallint out of range 错误。原因openGauss 的 SMALLINT 是有符号 16 位整数范围是 -32768 到 32767。报告书里那段“无符号 SMALLINT 范围 0 到 65535”是 MySQL 中 UNSIGNED 类型的概念在 openGauss 里不适用。解决确认字段值范围超过 32767 就用 INTEGER 或更大类型。反过来明确不会超过 32767 的字段比如课程学分用 SMALLINT 反而合理能省存储。这个教训是教材里的辨析要对照具体数据库版本看不同数据库对整数类型的定义并不完全一致。5.4 DROP SCHEMA 报依赖错误CASCADE 怎么用才安全现象执行 DROP SCHEMA book_eg提示 cannot drop schema book_eg because other objects depend on it。原因模式里已经有表直接删除模式会被依赖检查拦住。openGauss 默认不允许删除还有对象的模式这是保护机制。解决确认模式里的对象都不需要了再执行 DROP SCHEMA book_eg CASCADE。CASCADE 会级联删除模式下的所有对象。这里要强调一个安全习惯执行 CASCADE 之前先查一下模式里有哪些对象确认没有需要保留的数据。我见过有人写顺手了把建好的表全删了只能重建后悔药是没有的。5.5 密码复杂度不满足默认策略与绕过思路现象CREATE USER myuser WITH PASSWORD 123456 执行时报错提示密码不满足复杂度要求。原因openGauss 默认开启了密码复杂度校验要求至少 8 位、包含字母数字和大小写混合简单密码直接被策略拒绝。解决把密码改成符合策略的强密码比如 Mypass2022。如果确实要调低强度可以修改密码策略参数但实验环境不建议动改了之后配置和其他环境不一致后面排查问题会更麻烦。正确做法是把强密码统一记在一个固定位置每次新环境都用同一套避免反复卡在密码上。6. 事务、备份恢复与 JDBC用一组自检清单收口九个实验实验七事务与并发控制常见做法是开两个 gsql 窗口验证锁等待这个动作很直观实验八备份恢复用 gs_dump 导出再导入重点看数据行数是否一致。真正有工程感的是实验九 JDBC 连接它是从“命令行操作数据库”跨到“程序访问数据库”的分界线。import java.sql.*; public class OpenGaussConn { public static void main(String[] args) throws Exception { // 驱动遵循 PostgreSQL 协议URL 前缀固定 String url jdbc:postgresql://192.168.1.10:26000/db_school; String user myuser; String password Mypass2022; Connection conn DriverManager.getConnection(url, user, password); Statement st conn.createStatement(); ResultSet rs st.executeQuery(SELECT Sno, Sname FROM Students); while (rs.next()) { System.out.println(rs.getString(1) , rs.getString(2)); } // 关闭顺序先 ResultSet再 Statement最后 Connection rs.close(); st.close(); conn.close(); } }openGauss 的 JDBC 驱动遵循 PostgreSQL 协议所以 URL 前缀是 jdbc:postgresql://后面依次是主机、端口、数据库名。驱动 jar 从 openGauss 发行包中获取编译运行时加入 classpath。连接关闭的顺序建议固定为先结果集、再语句、最后连接这个习惯能避免连接泄漏。九个实验做完我自己习惯用一个清单做快速自检| 实验 | 自检动作 | 通过标准 | | 实验一 | gsql -d postgres -p 26000 -r | 能进入 postgres 库 | | 实验二 | \dt | 六张业务表都在 | | 实验三 | 执行三表连接查询 | 返回正确行数 | | 实验四 | 查询视图 | 能查到聚合数据 | | 实验五 | 插入重复主键 | 被拒绝并报错 | | 实验六 | 未授权用户查基表 | 提示权限不足 | | 实验七 | 双窗口更新同一行 | 出现锁等待 | | 实验八 | 备份后恢复 | 数据行数一致 | | 实验九 | 运行 JDBC 程序 | 打印出 Students 数据 |这套清单我用过很多次每次开新环境都强制走一遍五分钟把九个实验全部验证完再开始写正式报告。最初带实验时有人连数据库都连不上就开始写内容结果截图全是报错从那以后我要求自己先跑自检清单再碰任何正式实验。希望这套节奏也能帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站