openGauss 九实验全链路:从安装到 JDBC 的数据库基础验证 简介这份资源是郑州大学《数据库系统原理实验》课程配套的完整实验报告书面向计算机科学与技术、软件工程等专业学生以及正在学习数据库课程、需要完成实验报告或复习数据库操作的学习者。报告书围绕openGauss数据库展开涵盖认识DBMS系统、创建数据库表与索引、交互式SQL语句、创建视图、完整性控制、安全性控制、事务与并发控制、数据库备份与恢复、使用JDBC连接数据库共九个实验每个实验均记录实验目的、内容、过程、遇到的问题及结果分析并配有截图与排版说明。资源包内共1个docx文档压缩包大小约3.23MB内容完整、结构清晰可直接参考实验步骤与报告撰写格式。目前已有1520人学习下载适合需要系统梳理数据库实践操作、对照完成实验报告或查漏补缺的读者使用。1. 从一份实验报告书说起openGauss 九实验到底能跑通什么很多人拿到“数据库实验报告书”这类资源第一反应是“这不就是学生作业吗能有什么技术含量”。但如果你真在带新人、或者自己要从 MySQL 往国产数据库迁移就会发现一份结构完整的实验指导书反而是最省时间的入口——它把安装、建库、SQL、视图、完整性、安全性、事务、备份、JDBC 九个环节串成了一条线每个环节都有明确的验证目标。这份资源围绕 openGauss 展开覆盖从 DBMS 认知到 JDBC 编程的完整链路适合刚接触数据库系统原理的在校生、需要快速上手 openGauss 的开发者以及想拿一套现成实验框架来改造成内部培训材料的人。它不教你调优但能让你把数据库的“基本动作”全部走一遍而且每一步都有可复现的命令和预期结果。2. 实验环境搭建与 gsql 连接从零把 openGauss 跑起来2.1 三种安装路径怎么选实验一给了三条路云上安装、虚拟机一键安装、先装 openEuler 再装 openGauss。如果你只是想把实验做完一键安装最省事但如果你需要反复折腾、甚至模拟主备切换先装 openEuler 再手动部署 openGauss 更可控。我一般建议在本地用虚拟机跑 openEuler再按官方文档部署 openGauss原因是网络环境自己说了算端口、用户、表空间都能按实验要求改。安装完成后系统会默认生成一个postgres数据库这是 openGauss 的初始库类似 MySQL 的mysql库。初始只有安装时创建的管理员用户能连所以第一步不是急着建表而是先确认服务状态和连接方式。2.2 启动服务与 gsql 连接openGauss 的服务管理用gs_om连接用gsql。注意操作前要切到数据库安装用户omm这是很多新手第一个翻车点——用 root 直接跑gsql会报权限错误。# 切换到 omm 用户数据库安装用户 su - omm # 启动数据库服务 gs_om -t start # 连接默认数据库 postgres端口 26000 gsql -d postgres -p 26000 -r-d指定数据库名-p指定端口-r是开启编辑模式方便在 gsql 里用方向键调历史命令。连上之后提示符会变成postgres#说明你已经进到数据库里了。提示如果gs_om -t start报错先看$GAUSSHOME环境变量有没有配再看数据目录权限是不是被改过。omm 用户对数据目录必须有读写权限。2.3 创建用户和数据库默认只有管理员能访问实验要求创建新用户。openGauss 里用户和角色是统一的概念创建用户时可以直接给密码和权限。-- 创建新用户 dbuser密码按实际环境改 CREATE USER dbuser WITH PASSWORD YourPass123; -- 创建数据库 db_school指定表空间 CREATE DATABASE db_school WITH TABLESPACE tpcds_local; -- 切换数据库 \c db_school这里tpcds_local是实验二里先建的表空间对应一个空目录。表空间在 openGauss 里就是告诉数据库“数据文件放哪个目录”类似 Oracle 的表空间概念。如果跳过表空间直接建库会默认放到系统表空间里后期迁移数据文件会麻烦。2.4 gsql 元命令速查gsql 提供了一批反斜杠开头的元命令不用写 SQL 就能看结构。实验里反复用到这几个命令作用等价 SQL\l列出所有数据库SELECT datname FROM pg_database;\c dbname切换数据库无\dt列出当前库所有表查pg_tables\d tablename查看表属性、索引、约束查系统表\di列出索引查pg_indexes\dn列出 schema查pg_namespace\db列出表空间SELECT spcname FROM pg_tablespace;\du列出用户/角色SELECT * FROM pg_roles;\q退出无这些命令在实验一里是重点因为后面每个实验都要靠它们验证结果。比如建完表用\d Teachers看约束有没有生效比写 SQL 查系统表快得多。3. 建库建表建索引把 ER 图落成可查询的物理结构3.1 表空间、数据库、schema 的层级关系实验二的核心是理解“表空间 → 数据库 → schema → 表 → 索引”这条链。很多新手把 schema 和数据库混为一谈其实 schema 是数据库内部的名字空间一个数据库可以有多个 schema不同 schema 下可以建同名表。-- 创建表空间指向一个空目录 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_school -- 创建 schema CREATE SCHEMA book_eg; -- 在 schema 下建表 CREATE TABLE book_eg.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) );RELATIVE LOCATION是相对路径相对于 openGauss 的数据目录。建表时把表放在book_egschema 下查询时要么写全名book_eg.Teachers要么先SET search_path TO book_eg;。3.2 列级约束与表级约束的取舍实验二里专门辨析了列级约束和表级约束。简单说列级约束写在列定义后面表级约束写在所有列定义之后。涉及多列的外键、联合主键必须用表级约束。-- 院系表Dheadno 外键引用 Teachers 的 Tno CREATE TABLE Departments ( Dno CHAR(20) PRIMARY KEY, Dname CHAR(20), Dheadno CHAR(20), FOREIGN KEY (Dheadno) REFERENCES Teachers(Tno) ); -- 学生表Dno 外键引用 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) );这里有个循环引用Teachers 里有 Dno 指向 DepartmentsDepartments 里有 Dheadno 指向 Teachers。建表顺序要注意先建 Teachers 但不加外键再建 Departments最后用ALTER TABLE给 Teachers 补外键。实验里就是这么处理的直接建会报依赖错误。3.3 索引创建与删除索引实验要求在主键之外手动建索引观察查询计划变化。-- 在 Students 的 Dno 列上建索引 CREATE INDEX Student_Dept ON Students(Dno); -- 查看索引 \di -- 删除索引 DROP INDEX Student_Dept;openGauss 会自动为主键建唯一索引所以\di里能看到主键索引和手动建的索引。手动索引适合高频查询的非主键列但会拖慢写入实验里建完可以EXPLAIN看一下扫描方式有没有从 Seq Scan 变成 Index Scan。注意CREATE INDEX默认是非唯一索引如果列上有重复值不会报错。要唯一索引得写CREATE UNIQUE INDEX。4. 交互式 SQL 与视图从单表查询到逻辑抽象4.1 交互式 SQL 的批处理与脚本化实验三要求熟练使用 SQL 做查询、更新、删除。gsql 支持两种执行方式交互式逐条输入或者用-f跑脚本文件。# 把 SQL 写进文件批量执行 gsql -d db_school -p 26000 -f query.sqlquery.sql里可以写多条 SQL用分号隔开。如果脚本里有错误gsql 默认继续往下跑想让它遇错停止可以加-v ON_ERROR_STOP1。这个参数在自动化测试里很关键否则一条失败后面全乱。-- 典型的多表连接查询查每个学生的选课门数和平均分 SELECT s.Sname, COUNT(sc.Cno) AS course_count, AVG(sc.Grade) AS avg_grade FROM Students s JOIN SC sc ON s.Sno sc.Sno GROUP BY s.Sname HAVING COUNT(sc.Cno) 2 ORDER BY avg_grade DESC;JOIN默认是内连接GROUP BY之后只能用聚合函数或分组列HAVING过滤分组结果。这些在实验三和实验四里反复出现写多了就成肌肉记忆。4.2 视图的创建与更新限制实验四要求创建视图来抽象数据。视图本质是存储的查询不存数据但可以像表一样查。-- 创建视图只显示计算机专业学生 CREATE VIEW CS_Students AS SELECT Sno, Sname, Sex, Birthday FROM Students WHERE Speciality 计算机; -- 查询视图 SELECT * FROM CS_Students; -- 删除视图 DROP VIEW CS_Students;视图能不能更新取决于定义。如果视图来自单表且包含主键通常可以INSERT/UPDATE如果带JOIN、GROUP BY、聚合函数就是只读视图。实验里会验证这一点比如往CS_Students插一条记录看是否成功。提示openGauss 支持CREATE OR REPLACE VIEW来修改视图定义不用先删后建。但改列名或列类型时可能报错稳妥做法还是DROP再CREATE。4.3 视图在权限控制中的角色视图还有一个实用场景把敏感列过滤掉再开放给低权限用户。比如 Students 表里有身份证号可以建一个不含该列的视图然后把视图的 SELECT 权限给普通用户表本身不给权限。这样用户只能看到视图里的列看不到底层表结构。实验六的安全性控制会用到这个思路。5. 完整性、安全性与事务把“数据不出错”落到约束和权限上5.1 完整性控制约束与触发器实验五的完整性控制主要靠约束实现。除了主键、外键、CHECK还有 NOT NULL 和 DEFAULT。openGauss 还支持触发器来做复杂完整性检查。-- 给 Courses 表的 Credit 加 CHECK 约束 ALTER TABLE Courses ADD CONSTRAINT chk_credit CHECK (Credit BETWEEN 1 AND 10); -- 创建触发器函数选课成绩必须在 0-100 之间 CREATE OR REPLACE FUNCTION check_grade() RETURNS TRIGGER AS $$ BEGIN IF NEW.Grade 0 OR NEW.Grade 100 THEN RAISE EXCEPTION 成绩必须在 0 到 100 之间; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; -- 绑定触发器到 SC 表 CREATE TRIGGER trg_check_grade BEFORE INSERT OR UPDATE ON SC FOR EACH ROW EXECUTE FUNCTION check_grade();触发器在BEFORE INSERT OR UPDATE时执行NEW代表即将插入或更新的行。如果成绩越界就抛异常整个事务回滚。实验里会测试插入一条Grade150的记录看是否被拦截。5.2 安全性控制用户、角色与权限实验六要求创建不同权限的用户验证权限隔离。-- 创建角色 role_select只给 SELECT 权限 CREATE ROLE role_select; GRANT SELECT ON Students, Courses, SC TO role_select; -- 创建用户并赋予角色 CREATE USER user_a WITH PASSWORD UserA123; GRANT role_select TO user_a; -- 回收权限 REVOKE SELECT ON SC FROM role_select;openGauss 的权限分系统权限和对象权限。GRANT SELECT ON table是对象权限GRANT CREATE USER是系统权限。角色可以嵌套把多个角色给一个用户权限就叠加。实验里会验证user_a能不能INSERT预期是失败因为只给了 SELECT。注意openGauss 默认的PUBLIC角色可能有一些基础权限测试前先REVOKE掉否则权限验证结果不准。5.3 事务与并发控制实验七的事务部分要验证 ACID。openGauss 默认是自动提交每条 SQL 独立成事务。要手动控制得用BEGIN。-- 开启事务 BEGIN; -- 转账操作A 扣 100B 加 100 UPDATE Accounts SET balance balance - 100 WHERE name A; UPDATE Accounts SET balance balance 100 WHERE name B; -- 提交 COMMIT; -- 如果中途出错 ROLLBACK;并发控制实验会开两个 gsql 会话一个BEGIN后更新某行但不提交另一个会话去读同一行观察是否被阻塞。openGauss 默认用读已提交隔离级别读操作不会被写阻塞但写写会互斥。实验里还会演示死锁两个会话互相等对方持有的锁数据库检测到后会自动回滚其中一个。6. 备份恢复与 JDBC把数据库接进应用程序6.1 逻辑备份与恢复实验八的备份恢复用gs_dump和gs_restore。逻辑备份导出 SQL 脚本适合跨版本迁移。# 备份 db_school 到文件 gs_dump -d db_school -p 26000 -f /backup/db_school.sql -F p # 恢复先建空库再导入 gsql -d db_school_new -p 26000 -f /backup/db_school.sql-F p表示纯文本格式导出的就是 SQL 语句。如果数据量大可以用-F c自定义格式配合gs_restore并行恢复。实验里数据量小纯文本足够。提示gs_dump要在 omm 用户下跑且目标目录要有写权限。恢复前确认目标库是空的否则可能主键冲突。6.2 JDBC 连接 openGauss实验九用 JDBC 把 Java 程序和 openGauss 连起来。openGauss 的 JDBC 驱动和 PostgreSQL 驱动兼容但推荐用官方提供的opengauss-jdbc。import java.sql.*; public class DBTest { public static void main(String[] args) { String url jdbc:opengauss://192.168.1.100:26000/db_school; String user dbuser; String password YourPass123; try (Connection conn DriverManager.getConnection(url, user, password); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT Sno, Sname FROM Students)) { while (rs.next()) { System.out.println(rs.getString(Sno) - rs.getString(Sname)); } } catch (SQLException e) { e.printStackTrace(); } } }URL 格式是jdbc:opengauss://主机:端口/数据库名。如果驱动类没自动加载需要Class.forName(org.opengauss.Driver);。连接串里还可以加?batchModeon开启批处理提升批量插入性能。6.3 常见连接失败排查JDBC 连不上通常三个原因网络不通、认证失败、驱动版本不匹配。先在服务器上用gsql确认能连再检查pg_hba.conf里有没有允许客户端 IP。openGauss 默认只监听本地要远程连接得改postgresql.conf的listen_addresses和pg_hba.conf的host条目。现象原因解决Connection refused服务没启动或端口不对gs_om -t status查状态确认端口Password authentication failed密码错或 pg_hba 认证方式不对检查pg_hba.conf的md5/sha256No suitable driver驱动 jar 没引入把opengauss-jdbc.jar加到 classpath连接超时防火墙拦截开放 26000 端口7. 把实验报告变成可复用的验证脚本这套实验报告书最大的价值不是“做完交作业”而是它给出了一条从安装到 JDBC 的完整验证链。我后来把九个实验的命令抽成一个run_all.sh每次换环境先跑一遍确认 openGauss 的基本功能都正常。#!/bin/bash # 一键验证 openGauss 基础功能 set -e su - omm -c gs_om -t start su - omm -c gsql -d postgres -p 26000 -c SELECT version(); su - omm -c gsql -d db_school -p 26000 -f /opt/scripts/init_tables.sql su - omm -c gsql -d db_school -p 26000 -f /opt/scripts/test_queries.sql su - omm -c gs_dump -d db_school -p 26000 -f /tmp/backup.sql -F p echo All checks passed.set -e让脚本遇错即停避免中间失败后面还在跑。init_tables.sql里放建表语句test_queries.sql里放几条验证查询跑完看输出有没有报错。这个习惯是从一次“以为环境好了结果 JDBC 连不上”的翻车经历里养成的——后来每次部署新环境我都强制走一遍这个脚本确认 gsql、建表、查询、备份四条路都通再交给应用层。如果你手里正好有这份实验报告书建议别只当作业看把它当成 openGauss 的最小验证集。九个实验覆盖了数据库日常操作的八成场景跑通一遍后面遇到连接问题、权限问题、事务问题至少知道从哪查起。希望帮到你。本文还有配套的精品资源点击获取