恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
openGauss数据库实验指南:从环境搭建到JDBC连接全解析
首页
资讯中心
/
openGauss数据库实验指南:从环境搭建到JDBC连接全解析
openGauss数据库实验指南:从环境搭建到JDBC连接全解析
发布时间:2026/10/13 12:31:30
简介一份完整的《zzu数据库实验报告书》面向计算机科学与技术、软件工程专业正在学习《数据库系统原理》课程的学生覆盖认识DBMS、创建数据库/表/索引、交互式SQL语句、视图、完整性控制、安全性控制、事务与并发控制、数据库备份与恢复、JDBC连接数据库九大实验模块系统梳理了基于openGauss进行数据库定义、查询和管理控制的全过程可帮助读者快速掌握SQL实操要点与数据库设计思路。资源为单个docx文档大小3.23MB内容包含实验目的、操作步骤、实验结果截图与问题分析结构清晰、排版规范适合作实验报告参考模板或考前复习资料。目前已有1521人浏览学习报告中对事务与并发控制、安全性配置等难点有详细记录能有效提升读者对数据库原理的理解和解决实际问题的能力。1. 数据库实验报告书从认识 DBMS 到 JDBC 连接的完整链路一份数据库系统原理实验报告书九个实验从认识 DBMS 系统一路做到 JDBC 连接数据库几乎覆盖了一门数据库原理课的全部动手环节。我拆这份材料时最直接的感觉是它不是单纯的标准答案而是一张把理论翻译成 openGauss 命令的执行地图。如果你正在修数据库原理课或者刚接触 openGauss 想找一条不绕弯的上手路径这份报告书里的实验一和实验二尤其值得逐条过一遍——建库、建表、约束、索引的完整过程都摆在那里每一步都能直接敲进终端验证。适合三类人被实验课卡住的学生、要补数据库动手能力的开发者、想快速熟悉 openGauss 的入门者。2. 认识 DBMS 与 openGauss 环境安装选型、gsql 连接与系统表数据库实验报告的第一个实验是「认识 DBMS 系统」落在 openGauss 上。这一步看起来只是装个数据库、连一下客户端但它决定后面八个实验顺不顺利。换句话说环境搭得越快后面填坑的时间越多。我自己在帮学生排错时发现九成的实验翻车都发生在连接和环境配置阶段而不是 SQL 本身写错。2.1 openGauss 三种安装模式怎么选实验指导里写了 openGauss 的三种安装模式公有云服务器上安装、虚拟机一键安装、虚拟机安装 openEuler 后再安装 openGauss。三种模式对应三种场景选错了后面会多花不少时间。公有云安装适合手里有云资源、想跳过本地虚拟机性能损耗的人。云主机的好处是配置固定、网络稳定ssh 进去就能操作缺点是依赖网络环境安全组和公网 IP 得先配明白。虚拟机一键安装是最省事的路径实验报告里也明确说这是「为下一步实验做准备」的最快方式适合实验课赶进度、对 Linux 还不熟的同学。第三种先装 openEuler 再装 openGauss最接近生产环境但前期成本最高你需要手动处理系统依赖、内核参数和用户创建一整套下来没有半天搞不定。我的建议很简单单机实验、老师只验收截图和结果优先选虚拟机一键安装想顺带练 Linux 操作再考虑 openEuler 手动装这条路。云服务器留到你真正需要远程访问或者做分布式实验时再上。2.2 gsql 连接启动服务与常用元命令openGauss 安装完成后默认生成一个 postgres 数据库初始连接都要先进这个库。以下是启动和连接的常规操作# 切换到数据库安装用户通常叫 omm su - omm # 启动数据库服务 gs_om -t start # 连接默认数据库26000 是主节点默认端口 gsql -d postgres -p 26000 -r这段命令的含义拆开看su - omm 是切换操作系统用户openGauss 安装后服务只能由安装用户管理这一步不做后面会报权限错误。gs_om -t start 是集群管理工具的服务启动命令-t 指定操作类型为 startopenGauss 单机版也走这一条。gsql 是 openGauss 自带的命令行客户端-d 指定要连接的数据库名-p 指定端口-r 表示以只读模式进入会话日常练习不加 -r 也能正常执行增删改查它主要防止误操作。连接成功后有一批元命令是实验报告里反复用到的我整理成一张速查表命令作用?查看 gsql 所有元命令帮助\l列举当前实例的数据库列表\c dbname切换数据库\dt列出当前 schema 下的表\d tablename查询表的完整属性\dn列举 schema\di查看索引\db查询表空间\q退出 gsql这批命令在实验二建表、实验四建视图时都会频繁用到尤其是 \d它能看到字段类型、约束、默认值比任何图形化工具有用。建议在实验一阶段就把它们敲熟后面写报告时截图也快。2.3 系统表查询与用户/角色辨析除了元命令openGauss 还允许直接查系统表来确认数据库对象的元数据。实验报告里给出了几条值得记的-- 查数据库列表 SELECT datname FROM pg_database; -- 查表空间 SELECT spcname FROM pg_tablespace; -- 查数据库用户 SELECT * FROM pg_user; -- 查所有角色 SELECT * FROM pg_roles;pg_database 和 pg_tablespace 是系统表分别保存数据库和表空间的定义pg_user 与 pg_roles 保存用户与角色信息。为什么要同时提供两套查询因为有些对象比如角色只能通过 pg_roles 看到pg_user 里只是用户的子集视图。排查连接问题时先查 pg_database 确认库存在再查 pg_user 确认账号被创建了这两步能排除大多数问题。这里还涉及一个容易混淆的概念用户和角色。实验报告里给了个很直白的类比——角色是一类账户的集合比如「仓库管理员」这个职位用户是具体某个人比如入职的员工。给用户分配角色就等于把角色的全部权限一次授予员工调岗直接换角色就行不用逐条解除权限。数据库里同样如此有些用户只读某些表有些用户能执行存储过程这些差异用角色管理要清爽得多。3. 创建数据库、表与索引从表空间到约束的完整操作链实验二是整份报告里信息量最大的一章创建数据库、schema、六张核心表、修改表结构、创建索引一步接一步。这一章操作完你基本上就把 openGauss 的 DDL 能力过了一遍。我按操作顺序把它拆成四个环节每个环节都有能直接复制的命令。3.1 表空间与数据库的创建建库之前实验报告先建了一个表空间。表空间这个概念初学者容易忽略它本质是数据库文件在磁盘上的一个组织目录。你可以在 openGauss 里把不同的表安排到不同表空间从而控制磁盘布局。-- 创建表空间relative location 指向一个相对路径 CREATE TABLESPACE tpcds_local RELATIVE LOCATION tablespace/tablespace_1; -- 创建数据库并指定使用该表空间 CREATE DATABASE db_sc WITH TABLESPACE tpcds_local; -- 数据库改名 ALTER DATABASE db_sc RENAME TO db_school; -- 切换进新数据库 \c db_schoolRELATIVE LOCATION 后面的路径是表空间在数据目录下的相对位置openGauss 要求这个路径不能已存在同名对象。CREATE DATABASE 的 WITH TABLESPACE 指定默认表空间后续在这个库里建表如果没显式指定表空间就会落到这里。ALTER DATABASE ... RENAME 在库还没有业务连接时才能执行有会话占着会直接失败。最后用 \c 切换后面所有建表操作都在 db_school 里进行。这里有一个值得记的辨析表空间像文件夹数据库是存储数据划分出的一块逻辑空间一个数据文件只能属于一个表空间但一个表空间可以拥有多个数据文件。所以在 openGauss 里表空间是物理存储层面的组织单元数据库是逻辑层面的业务边界两者不是包含关系。另外openGauss 里还有一个和表空间经常一起出现的概念schema。实验报告创建了 book_eg 模式并在模式里建表先 create schema book_eg再 create table book_eg.Teachers(...)删除模式用 drop schema book_eg cascadecascade 会把模式下的表一并删掉。schema 的作用是命名空间隔离——多个应用共用同一个数据库时各自的对象放在各自的 schema 下互不干扰。注意删除时如果不加 cascade而 schema 下有对象数据库会拒绝执行。3.2 六张核心表从 Teachers 到 Teaches 的建表语句实验二要求按教材属性建立 STUDENT、COURSE、SC 等基本表实验报告实际拆成了六张Teachers、Departments、Students、Courses、SC、Teaches。前两张表的建表语句是完整的我直接贴出来-- 教师信息表 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 CREATE TABLE Departments ( Dno CHAR(20) PRIMARY KEY, Dname CHAR(20), Dheadno CHAR(20), FOREIGN KEY (Dheadno) REFERENCES Teachers(Tno) );Teachers 表里值得注意的有三处Tno 是主键CHAR(20) 定长字符串在 openGauss 里不足 20 位会在右侧自动补空格这也是为什么很多教材属性用 CHAR 而不是 VARCHARSex 列上的 CHECK 约束把取值范围锁死在「男」或「女」这是用户定义完整性的典型体现Dno 这个字段先建着不设外键等后面讲修改表时再补。Departments 表的外键有点特殊Dheadno 引用 Teachers 的 Tno代表系主任必须是教师表里存在的教师。这就是参照完整性——外键列的取值必须在被引用表主键列中存在否则插入直接报错。Students、Courses、SC、Teaches 四张表的建表逻辑完全一致按关系模式逐个建就行。SC 表选课表通常用 (Sno, Cno) 复合主键两个字段分别外键引用学生表和课程表Teaches 表记录教师授课关系外键指向 Teachers 和 Courses。建完用 \dt 命令能看到全部表用 \d Teachers 能检查字段与约束是否完整。3.3 列级约束与表级约束的选用边界实验报告里有一段专门的辨析讲列级约束与表级约束的区别。这个点考试和面试都常考值得展开说清楚。列级约束是直接写在字段定义后面的约束用空格与字段类型分隔-- 列级约束写法约束跟在该列定义之后 CREATE TABLE Teachers ( Tno CHAR(20) PRIMARY KEY, Tname CHAR(20) NOT NULL );表级约束是与列定义相互独立的约束子句在各字段定义完之后统一声明-- 表级约束写法单独一行必须指明约束作用的列名 CREATE TABLE Departments ( Dno CHAR(20) PRIMARY KEY, Dname CHAR(20), Dheadno CHAR(20), FOREIGN KEY (Dheadno) REFERENCES Teachers(Tno) );两者的选用边界很清晰如果约束只涉及单列两种写法都行如果约束涉及多个列比如复合主键、复合外键或者一个外键引用两张表的两个字段就必须用表级约束因为列级约束只能约束它所在的那一列。另外列级约束不能起约束名表级约束可以PRIMARY KEY 除外。实际写 DDL 时我的习惯是NOT NULL 和 DEFAULT 跟着列走用列级主键、外键、CHECK 如果只涉及单列也尽量用列级代码更紧凑一旦出现多列联合约束立刻切到表级不要硬塞进列定义里格式乱了后面排错很痛苦。3.4 索引的创建与验证索引是实验二的压轴部分。实验报告给出了一个明确的案例在 Students 的 Dno 上创建名为 Student_Dept 的索引。-- 在 Students 表的 Dno 列上创建索引 CREATE INDEX Student_Dept ON Students(Dno); -- 查看当前库内所有索引 \diCREATE INDEX 的基本语法是 CREATE INDEX 索引名 ON 表名(列名)多个列可以用逗号分隔形成复合索引。建完之后用 \di 能看到索引名、关联表、索引列和索引类型。这里有个容易被忽略的细节DBMS 会自动为主键列建立索引所以 \di 里即使你从没手动创建也会出现主键对应的索引条目这是正常的。索引的代价也要心里有数它加快 SELECT但每次 INSERT、UPDATE、DELETE 都要同步维护索引结构写入性能会下降。实验层面的表数据量很小感觉不到差异实际项目里索引不是越多越好高频查询列建低区分度列比如性别建了也基本没用。4. 交互式 SQL 与视图排查查询模板、更新边界与四个高频坑实验三和实验四连在一起实验三把交互式 SQL 语句过一遍实验四创建视图。这两个实验放在一块很合理——先会用 SELECT 从表里拿数据再把它封装成视图让查询更干净。这一章我直接给三套查询模板和一套视图操作流程最后把最常见的几个报错列出来省得你在终端里对着错误发呆。4.1 交互式 SQL 的三种查询模板交互式 SQL 的练习范围不外乎单表查询、多表连接、分组聚合三类。下面三段 SQL 基本覆盖了实验报告要求的能力点-- 单表查询查询所有男教师的姓名和职称 SELECT Tname, Title FROM Teachers WHERE Sex 男; -- 多表连接查询每个院系的系主任姓名 SELECT d.Dname, t.Tname AS manager FROM Departments d JOIN Teachers t ON d.Dheadno t.Tno; -- 分组聚合统计每门课程的选课人数需要 SC 表有数据 SELECT Cno, COUNT(*) AS stu_cnt FROM SC GROUP BY Cno HAVING COUNT(*) 0;第一段是基础过滤WHERE 后面可以继续叠加 AND、OR 和 IN 子句。第二段用了表别名d 和 t 分别是 Departments 与 Teachers 的简写JOIN 条件写在 ON 里这种写法比 select * from a,b where 关联 的旧式写法更清晰。第三段是分组查询的典型形态GROUP BY 后面跟的列决定了分组粒度COUNT(*) 是每组的行数HAVING 是对分组结果做过滤——注意 HAVING 和 WHERE 的区别WHERE 在分组前过滤行HAVING 在分组后过滤组。如果 SELECT 列表里出现了既不在聚合函数中、也不在 GROUP BY 中的列openGauss 会直接报错这是实验里最常见的翻车点。4.2 视图的创建、使用与更新边界视图本质是一条保存下来的查询语句本身不存储数据。实验四的核心操作是「把常用的复杂查询存成视图」-- 创建视图每个院系及其系主任的姓名 CREATE VIEW v_dept_manager AS SELECT d.Dno, d.Dname, t.Tname FROM Departments d JOIN Teachers t ON d.Dheadno t.Tno; -- 使用视图 SELECT * FROM v_dept_manager; -- 删除视图 DROP VIEW v_dept_manager;视图的价值在于封装和复用应用端只需要 SELECT 视图名不需要关心底层连接逻辑底层表结构调整时只要保持视图字段不变上层代码就不用动。这是数据库设计里「逻辑独立性与物理独立性」的直观体现。但视图有个容易踩的坑不是所有视图都能更新。openGauss 要求可更新视图必须基于单个基表且视图不能包含 DISTINCT、GROUP BY、聚合函数、集合操作查询里的列也不能是表达式。满足这些条件时对视图的 INSERT、UPDATE、DELETE 会直接映射到基表不满足时执行 UPDATE 视图会报 cannot update view这时候要么改用基表操作要么重写视图。这个边界先记住后面排错能少走很多弯路。4.3 四个高频坑排查记录交互式 SQL 阶段我在实验报告和实际指导中见过最多的是下面四个问题每条都按「现象 → 原因 → 解决」写出来。第一个分组查询报错。现象执行带 GROUP BY 的 SELECT 时openGauss 报错 column xxx must appear in the GROUP BY clause。原因SELECT 里出现了既不参与聚合、也不在 GROUP BY 中的列SELECT 列表与分组粒度不匹配。解决把该列加进 GROUP BY或者改用聚合函数包裹它例如把 Title 改成 MAX(Title)。第二个视图更新失败。现象对视图执行 INSERT 或 UPDATE 报 cannot update view。原因视图定义里包含连接、聚合或 DISTINCTopenGauss 无法确定操作应该映射到哪个基表。解决查一下 pg_views 系统表确认视图定义能简化的简化不能简化的改用基表写操作。第三个中文字符变问号。现象向表里插入中文用 SELECT 查出来全是问号。原因客户端字符集与数据库字符集不一致标准 SQL 里中文字符串用的是单引号编码没对上就会乱码。解决连接数据库后先执行 SET client_encoding TO UTF8; 再插入数据如果库本身建在非 UTF8 编码下重新建库是更干净的做法。第四个字符串里的单引号。现象SQL 里想插入 Im a student 这个值写 INSERT 时报语法错。原因字符串中的单引号把字符串切成两段了。解决把单引号写成两个连续单引号INSERT ... VALUES (Im a student); 或者用 gsql 的 E 转义写法养成这个习惯后以后处理用户输入拼接 SQL 时会少很多安全问题。5. 完整性、安全性与事务并发三类控制的实现与验证实验五到实验七是数据库原理课里理论密度最高的三个主题完整性控制、安全性控制、事务与并发控制。前四个实验解决「怎么把数据放进去、查出来」这三个实验解决「数据放进去之后怎么保证它是对的、可靠的、安全的」。我在这一章把三类控制的典型实现串起来每条都能在 openGauss 里实际跑。5.1 完整性约束主键、外键与 CHECK 的联动完整性控制的核心是三类约束实体完整性用主键实现参照完整性用外键实现用户定义完整性用 CHECK、NOT NULL、UNIQUE 实现。实验二建表时其实已经把这些铺进去了实验五要做的是验证这些约束真的在拦截非法数据。-- 实验插入一个不存在的系编号外键约束会拦截 INSERT INTO Students (Sno, Sname, Sex, Dno) VALUES (20210001, 张三, 男, D99); -- 实验插入非法的性别值CHECK 约束会拦截 INSERT INTO Teachers (Tno, Tname, Sex) VALUES (T001, 李四, 未知);第一句的 D99 如果不存在于 Departments 表外键约束会直接拒绝插入数据库不会进入一种「学生挂在不存在院系下」的中间状态。第二句的 Sex 值不是「男」或「女」CHECK 约束同样会拦截。这里值得记住的是约束的检查时机openGauss 默认每条语句执行时立刻检查叫做立即约束还有延迟约束改为在事务提交时统一检查适合批量导入数据的场景但实验阶段用默认行为就够。实际开发中外键和 CHECK 是不是越多越好不是。高并发写入场景下外键每次插入都要去被引用表查一次性能开销很明显很多互联网业务宁可在应用层做关联校验也不建外键。但实验课考的就是你懂不懂约束机制所以在 openGauss 里把约束建全、跑通是拿分的前提。5.2 GRANT 与 REVOKE安全性控制的两种用法安全性控制实验的核心是权限授予与回收。openGauss 的安全性模型基于用户和角色用户是登录数据库的账户角色是权限集合把角色授给用户用户就获得角色包含的权限。-- 创建普通用户 CREATE USER stu_user IDENTIFIED BY password123; -- 授予该用户对 Students 表的查询权限 GRANT SELECT ON Students TO stu_user; -- 回收权限 REVOKE SELECT ON Students FROM stu_user; -- 创建角色并授权再把角色授给用户 CREATE ROLE read_only_role; GRANT SELECT ON Students TO read_only_role; GRANT read_only_role TO stu_user;GRANT 后面可以跟 SELECT、INSERT、UPDATE、DELETE 等权限也可以跟 ALL PRIVILEGES 表示全部权限。REVOKE 负责回收。角色存在的意义在第 2 章的用户/角色辨析里已经提过角色让权限管理从「针对人」变成「针对岗位」员工入职离职只需要挂接或摘除角色。实验报告在实验六里特别强调了这一点实际维护数据库时这也是标准做法——别直接给个人授一堆表权限先建角色再分配。权限收回之后还有一个细节如果用户当前会话已经有打开的连接REVOKE 在部分数据库里需要等连接重连才会完全生效。openGauss 中权限变更对新建连接立即生效已建会话的权限检查可能走的是缓存。遇到「明明回收了还能查」的情况先断开会话重连再验证。5.3 事务的提交与回滚事务实验的核心是 ACID 里的原子性。openGauss 里用 BEGIN 开始事务COMMIT 提交ROLLBACK 回滚。回滚就是数据库世界的后悔药——只要还没提交一切操作都可以撤销。-- 开启事务 BEGIN; -- 执行两次更新 UPDATE Students SET Sname 王五 WHERE Sno 20210001; UPDATE SC SET Grade 95 WHERE Sno 20210001; -- 发现问题回滚 ROLLBACK; -- 重新开启并提交 BEGIN; UPDATE Students SET Sname 王五 WHERE Sno 20210001; COMMIT;这段代码演示了事务的典型用法先 BEGIN然后多条 DML 语句最后要么 COMMIT 让所有变更持久化要么 ROLLBACK 让变更全部消失。注意事务的隔离性——在 COMMIT 之前另一个会话是看不到这些未提交数据的取决于隔离级别。实验报告里特别提醒手写 INSERT/UPDATE 时openGauss 默认自动提交单条语句如果你希望多条操作能作为一个整体提交或回滚必须显式 BEGIN。漏掉 BEGIN 直接执行两条 UPDATE第二条失败时第一条已经提交了数据就处在半更新状态。5.4 隔离级别与锁并发控制的实验观察并发控制实验会用到隔离级别和锁。openGauss 支持标准的四种隔离级别读未提交、读已提交、可重复读、可串行化。默认是读已提交。-- 查看当前隔离级别 SHOW transaction_isolation; -- 设置隔离级别在事务内生效 BEGIN; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT * FROM SC WHERE Cno C001 FOR UPDATE; COMMIT;FOR UPDATE 是行级锁的典型用法事务 A 锁住某行后事务 B 对同一行的 UPDATE 会被阻塞直到 A 提交或回滚。这个实验要观察的现象就是「阻塞」。死锁在 openGauss 里会报 deadlock detected数据库会自动回滚其中一个事务来解除死锁。避免死锁的办法很朴素多个事务以相同顺序访问资源或者把事务缩短减少锁持有时间。提示openGauss 默认隔离级别是读已提交。实验观察阻塞现象时保持两个会话都打开事务未提交前查不到对方数据是预期行为不是出了 bug别急着重启服务。这几个实验做完数据库最核心的可靠性机制基本都过了一遍完整性约束防非法数据权限控制防越权访问事务保证操作的原子性锁和隔离级别管理并发。这些东西在真实生产环境里每一项都是重点实验阶段把它们跑通比背十遍理论都有用。6. 备份恢复与 JDBC 连接两个能直接复用的实战技巧实验八和实验九把方向从 SQL 操作转到了数据库运维与编程接入备份与恢复、JDBC 连接。备份恢复实验用的是 gs_dumpJDBC 实验的核心是加载驱动、建立连接、执行 SQL 这三件事。两者都是生产环境里的高频操作。6.1 gs_dump 逻辑备份一条命令# 逻辑备份整个数据库到 SQL 文本文件 gs_dump -U omm -W 密码 -f backup.sql -p 26000 db_school # 恢复SQL 文本备份直接用 gsql 导入 gsql -d db_school -f backup.sqlgs_dump 导出的是可执行的 SQL 文本恢复时用 gsql 执行脚本就能完整还原表结构和数据。实验级的数据量用逻辑备份完全够如果需要更灵活的恢复粒度备份时加上 -Fc 生成自定义格式再用 gs_restore 做选择性恢复。6.2 JDBC 连接 openGauss 的代码骨架import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class DBDemo { public static void main(String[] args) throws Exception { Class.forName(org.opengauss.Driver); String url jdbc:opengauss://127.0.0.1:26000/db_school; Connection conn DriverManager.getConnection(url, stu_user, password123); PreparedStatement ps conn.prepareStatement(SELECT Tname FROM Teachers WHERE Title ?); ps.setString(1, 教授); ResultSet rs ps.executeQuery(); while (rs.next()) { System.out.println(rs.getString(Tname)); } rs.close(); ps.close(); conn.close(); } }注意三点驱动类名是 org.opengauss.DriverURL 头是 jdbc:opengauss://不要混成 PostgreSQL 的驱动PreparedStatement 用 ? 占位避免字符串拼接用完要关闭释放连接。从那以后我每次做备份恢复实验都会先确认数据库服务状态再执行 gs_dump养成「改结构之前先备份」的习惯这个习惯在一线排障时救过我很多次。希望帮到你。本文还有配套的精品资源点击获取