数据库原理实验全流程拆解:openGauss从建表到JDBC编程

发布时间:2026/10/19 7:31:46
数据库原理实验全流程拆解:openGauss从建表到JDBC编程
简介这份郑州大学数据库实验报告书是计算机科学与技术及软件工程专业的《数据库系统原理实验》课程配套材料面向需要系统掌握数据库操作的学生。报告详细记录了实验一至实验九的完整过程从认识数据库管理系统并安装国产数据库软件使用命令行工具连接数据库到创建数据库表与索引、交互式结构化查询语言语句、创建视图再到完整性控制、安全性控制中的用户权限分配、事务与并发控制中的锁定与死锁处理以及数据库备份恢复和编写程序连接数据库循序渐进地覆盖了数据库管理的主要环节。每个实验均包含实验目的、内容、类型、学时分配和结果分析并配有操作截图与排错思路能够帮助读者理解数据库安全、完整性、并发等核心概念提升数据库实际操作能力。资源为单个Word文档大小约三点二三兆字节结构清晰已有一千五百余人学习下载适合作为课程实验参考、期末复习或数据库入门自学材料。1. 这份实验报告书能解决什么数据库原理课最容易出现的情况是理论听懂了一打开终端就不知道从哪敲起。这份《数据库系统原理实验》报告书恰好是把整个数据库实验过程从头到尾走了一遍从认识 openGauss 这种 DBMS、用 gsql 命令行工具连上默认的 postgres 数据库到建库建表、写交互式 SQL、创建视图、做完整性控制和安全性控制再到事务并发、备份恢复最后用 JDBC 把 Java 程序和数据库连起来——九个实验一个不少每一步都有对应的操作命令和 SQL 语句。适合正在上数据库原理课、需要交实验报告的学生也适合想快速把 openGauss 环境跑起来、看看一个数据库管理系统从安装到编程接入完整链路怎么走的开发者。你拿到这份资料要做的不是读而是开一台虚拟机跟着实验一敲到实验九。数据库这东西光看永远觉得简单真正动手才知道坑在哪。2. 实验体系拆解九大实验如何覆盖数据库原理全流程这份报告书最值得先看的地方是它把数据库原理课程里最难啃的几块——完整性、安全性、事务并发——全部拆成了可操作的具体实验而不是停留在概念描述层面。2.1 从 DBMS 识别到 JDBC 编程实验的递进逻辑九个实验的顺序不是随便排的它遵循了「环境 → 结构 → 操作 → 抽象 → 保护 → 编程」这条完整链路。实验一的任务是认识 DBMS 系统本质上是解决「数据库软件怎么装、怎么启动、怎么连上」这个最基础的问题。报告里给了 openGauss 的三种安装模式华为弹性云上安装、虚拟机一键安装、先装 openEuler 再装 openGauss。这一步卡住了后面所有实验都做不了所以放在第一个。实验二和实验三是一对。实验二解决「怎么把表建出来」包括创建数据库、模式、表和索引修改基本表结构。实验三则是往这些表里填充数据练习 SELECT、INSERT、UPDATE、DELETE 这些交互式 SQL 语句。先有表再有数据逻辑上完全对应教材里「定义数据库 → 查询检索」的顺序。实验四到实验六是数据库的「软能力」。视图实验四解决的是让不同用户看到不同数据形态的问题完整性控制实验五保证数据在增删改查过程中不出错安全性控制实验六管理谁能访问哪些数据。这三个实验分别对应数据库原理里的「抽象视角、数据一致、访问控制」三大核心概念。实验七和实验八解决的是「数据坏了怎么办、多人同时用会不会乱」。事务与并发控制讨论锁机制、死锁处理、隔离级别备份与恢复则是给数据上保险。最后实验九跳出了纯 SQL 操作用 JDBC 从 Java 程序里连接数据库这已经是在向真实的数据库应用开发过渡了。这九个实验连起来看就是一个精简版的数据库工程师训练路径。2.2 知识点映射完整性、安全性、并发控制分别练什么把每个实验对应的知识点拆开看能更清楚它练的是什么能力。完整性控制实验实验五是很多学生容易划水的部分。它在 openGauss 里主要通过约束来实现NOT NULL 保证字段不能为空PRIMARY KEY 保证唯一且非空CHECK 约束限制取值范围FOREIGN KEY 保证从表引用主表时数据有效。报告书里建的 Teachers 表就是一个典型例子性别字段用 CHECK(Sex男 OR Sex女) 限制输入Dno 字段通过 FOREIGN KEY 引用 Departments 表的主键。这练的不是「背出约束的定义」而是「在建表时想清楚哪些数据需要约束、约束应该加在列级还是表级」。安全性控制实验六练的是权限模型的落地。openGauss 里用户和角色是有区别的角色是一组权限的集合用户是具体账户。仓库管理员的例子在书里写得很清楚——给用户分配角色等于一次赋予一串权限人员变动时只需要换角色不用逐个改权限。这个实验要动手做的是 CREATE USER、GRANT、REVOKE 这类操作同时理解为什么不能所有用户都用管理员账号操作数据库。事务与并发控制实验七则是从「单用户操作」进入「多用户并发」的关键一步。这个实验里会接触 BEGIN、COMMIT、ROLLBACK会看到两个会话同时改一行数据时出现的锁等待甚至会遇到死锁。报告书把这些放在一个实验里本质上是在训练处理「数据一致性」问题的能力。2.3 实验报告书结构一份可直接参照的课程实验文档模板这份报告书除了实验内容本身它的文档结构也值得留意。每个实验都按统一的格式组织实验目的、实验内容、实验类型演示/验证/综合/设计、学时分配、主要仪器及材料、对实验报告的要求。最后的实验报告要求还专门提到了排版规范——截图下面需要图编号和图题表格上方要有表名和数据行段首要空两个字。这意味着它不只是一份操作手册更是一份可参照的实验报告写作模板。如果你是要给课程设计实验的老师或者要按学校格式写实验报告的学生这个结构可以直接套用。九个实验正好是一学期十六周课程去掉考试周的实验安排插入时间和学时分配都是现成的。3. 环境准备openGauss 安装与 gsql 操作基础数据库实验的前置条件是有一套能跑的数据库环境。这一章把实验一的完整操作流程展开包括安装方式选择、数据库启动、gsql 连接和基础命令。3.1 三种安装模式怎么选从 elastics 云到本地虚拟机报告书里给出 openGauss 的三种安装模式华为弹性云上安装、虚拟机一键安装、虚拟机安装 openEuler 后再安装 openGauss。作为一个已经踩过坑的人我的建议很直接本地做课程实验选虚拟机一键安装最省时间。弹性云安装适合团队协作或需要公网访问的场景但它依赖云资源需要申请、付费、开安全组规则对单机做实验来说成本偏高。先装 openEuler 再装 openGauss 是更接近生产环境的做法但对操作系统的熟悉程度有要求遇到依赖问题排查起来需要 Linux 基础。虚拟机一键安装则把这些前置条件都打包好了OS 和数据库一起装完启动虚拟机就能开始实验。安装完成后默认会生成一个名为 postgres 的数据库端口号通常是 26000。第一节课最好先确认两件事虚拟机网络模式是不是正常、数据库服务有没有自启动。3.2 数据库启动、连接切换与 gsql 常用命令实验一开始的实际操作分两步启动服务和连接数据库。在数据库主节点服务器上先切换到数据库安装用户 omm 的环境su - omm然后启动数据库服务gs_om -t start服务启动后使用 gsql 连接默认数据库gsql -d postgres -p 26000 -r这里的 -d 指定数据库名-p 指定端口号-r 启用只读模式避免误操作。连接成功后就能执行 SQL 语句了。进入 gsql 交互界面后有一套快捷命令很实用\l 列举数据库列表\dt 列举表\d 查看表、视图和索引的完整属性\dn 列举 schema查询帮助用 ?退出用 \q。切换数据库用 \c dbname切换用户用 \c - username。另一个值得记住的是从系统表查询信息的方式SELECT datname FROM pg_database;这条语句直接从 pg_database 系统表查出所有数据库名字相当于命令行的 \l 的 SQL 版本。用系统表查询的好处是后面做程序化数据库管理时写代码更方便命令行只能看结果SQL 可以拿去做二次计算。3.3 用户、角色、schema 与表空间四个易混淆概念的一次说清第一次接触 openGauss 的时候用户、角色、schema、表空间这几个概念最容易混。报告书里对它们的辨析很到位我把结论再压缩一下。用户是具体到某一个人或应用的账户角色是某类权限的集合。仓库管理员是个角色公司里好几个仓库管理员是不同用户给用户分配角色就等于一次性赋予一组权限。数据库里也是同样道理有些用户只能查询特定表有些用户能执行存储过程全在 GRANT 的时候通过角色配好。schema 容易被当成「数据库里的数据库」。它实际是一个名字空间包含一组表、视图、存储过程等对象。一个用户建了 Teachers 表、Departments 表和索引这些对象合在一起就构成这个用户的 schema。可以用 CREATE SCHEMA 和 DROP SCHEMA CASCADE 来管理CASCADE 表示级联删除其中所有对象。表空间则更偏物理存储。报告书里打了个比方表空间如同创建一个文件夹专门放某类资料查找时只搜索这个文件夹而不是整个硬盘。一个表空间可以拥有多个数据文件一个数据文件只能属于一个表空间。创建表空间和数据库的语句如下CREATE TABLESPACE tpcds_local RELATIVE LOCATION tablespace/tablespace_1; CREATE DATABASE db_sc WITH TABLESPACE tpcds_local;RELATIVE LOCATION 后面跟的是表空间相对路径必须在数据库安装目录下事先建好空目录否则会报错。这个报错是我当年踩过的第一个坑后来习惯是先创建目录、再建表空间、最后建数据库顺序不能反。4. 核心 SQL 实践拆解从建库建表到权限控制实验二到实验六是整份报告书里 SQL 量最大的部分。这一章把最核心的建库、建表、完整性约束、索引、视图与权限操作的实现细节展开讲。4.1 建库建表从 CREATE DATABASE 到完整表结构实验二的第一步是创建数据库。前面已经创建了表空间 tpcds_local紧接着创建数据库并指定表空间然后改名CREATE DATABASE db_sc WITH TABLESPACE tpcds_local; ALTER DATABASE db_sc RENAME TO db_school; \c db_school这里有两个参数需要说明。WITH TABLESPACE 指定数据库的默认表空间不指定则使用系统默认表空间RENAME TO 用于修改数据库名修改前要确保没有活跃连接。\c db_school 是切换当前会话到新数据库后续建表操作都在这个库里执行。建表是整个实验的核心动作。以 Students 表为例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) );这段 DDL 里包含了主键约束、非空约束、CHECK 约束和外键约束四种完整性控制对应的逻辑分别是学号唯一标识一行、姓名不能为空、性别只能取两个值、院系编号必须存在于 Departments 表中。这几个约束加在一起就保证了新插入的数据不会破坏整体一致性。另一个必须掌握的是用 ALTER TABLE 修改表结构。比如给 Teachers 表补主键约束ALTER TABLE Teachers ADD PRIMARY KEY (Tno);注意如果原表已经有数据且 Tno 列存在重复或空值这条语句会执行失败。我给学生的血泪经验是建表的时候就把约束写全ALTER TABLE 只用来补漏不要指望用它来兜底已经脏了的数据。4.2 列级约束与表级约束什么时候必须用表级约束的创建位置直接决定代码怎么写。列级约束跟在列的定义后面用空格分隔只需作用于这一列。表级约束与列定义相互独立放在所有列定义之后必须指明约束的列名并且当约束涉及多个列时只能用它。举个例子如果选课表 SC 需要联合主键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) );PRIMARY KEY (Sno, Cno) 就是典型的表级约束它把两个列组合成一个联合主键。还有一个细节值得注意列级约束不能起约束名表级约束可以起名字主键除外。这意味着如果你想给某个外键约束一个可识别的名字方便后面删掉或修改必须用表级写法。常见的 DROP CONSTRAINT 操作只对具名约束有效这在实际运维中是个大坑。4.3 索引、视图与权限控制三类对象的创建与辨析索引的实验在三张表上完成最典型的是给 Students 的 Dno 列建索引CREATE INDEX Student_Dept ON Students(Dno);建完后用 \di 查看索引列表。数据库会自动为主码建立索引但非主码列上的普通索引需要手动创建。在 Dno 这种经常作为查询条件的外键列上建索引能明显加快按院系检索学生的速度。视图的实验是另一个重点。视图本质是一张虚拟表它不存储数据只保存一条 SELECT 语句。例如创建一个只包含计算机系学生的视图CREATE VIEW CS_Students AS SELECT Sno, Sname, Sex, Birthday FROM Students WHERE Dno 01;查询视图时数据库会执行里面保存的 SELECT 语句。视图的价值在于表结构变了视图可以不跟着变某些列的权限也可以借此隔离。实验四所有内容的核心就一句话视图是对底层表的一种受控投影。安全性控制实验里权限操作集中在 GRANT 和 REVOKE。分配一个只读用户CREATE USER readonly_user PASSWORD Read12345; GRANT SELECT ON Students, Courses, SC TO readonly_user;普通用户如果要修改表数据再用 GRANT INSERT/UPDATE 授予对应权限。如果这个用户要能看到所有底层数据还可以把权限提升到 TABLE 级别但这样也意味着用户对表的操作不受列级限制。权限的粒度决定了安全边界实验六的目的就是让你亲手体验这种边界的划分。5. 事务并发与 JDBC 常见问题排查数据库实验越往后越容易出问题尤其是事务并发、备份恢复和 JDBC 连接这三块。这一章把我拆这份报告书时踩过的坑和对应的排查思路整理出来。5.1 事务操作手动提交和自动提交的混乱现象学生写事务实验的 SQL开了两个会话对同一行数据做 UPDATE其中一个会话的 UPDATE 一直卡住不返回整个 gsql 界面像死了一样。原因openGauss 默认是自动提交模式但显式写 BEGIN 或 START TRANSACTION 开启事务后未执行 COMMIT 前事务持有的行锁不会释放。第二个会话的 UPDATE 等待第一个会话的锁形成锁等待。解决在第一个会话里执行 COMMIT 或 ROLLBACK 结束事务第二个会话的 UPDATE 立即继续执行。排查时用 \l 查看有没有开着的事务或者直接查 pg_stat_activity 看会话状态。如果你发现开了事务却忘了提交可以用 gsql 的 \q 退出会话连接断开后未提交的事务会自动回滚锁也会释放。但千万别养成这个习惯程序代码里靠断连回滚是严重的隐患。5.2 备份恢复恢复后数据少了一段现象实验八做数据库备份用 gs_dump 导出 SQL 文件后再把备份导入新库结果发现某些表的数据缺失报错信息提示主键冲突或外键引用不存在。原因常见的有三种。一是备份时数据库处于非静止状态导出的文件本身就是某个时间点的快照不是事务一致的备份二是导入顺序不对先导入了从表数据而主表数据还没进来外键检查直接失败三是备份文件被截断或编码问题导致部分语句没执行成功。解决生产环境用 gs_dump 时加 -F c 生成自定义格式配合 gs_restore 恢复可以按表、按 schema 选择性导入课程实验最简单的方法是先统一用 gs_dump 导出全部表然后在目标库按主表到从表的顺序执行 SQL遇到外键错误先检查导入顺序而不是直接删约束。另外提醒一句备份做完后一定要执行一次恢复或者至少用 gs_restore -l 生成备份文件内容清单验证文件完整性否则很可能到要用备份才发现备份本身是坏的。5.3 JDBC 连接失败最常见的是端口和驱动问题现象实验九用 JDBC 连接 openGaussJava 程序启动后抛异常常见几种Connection refused、The connection attempt timed out、ClassNotFoundException。原因Connection refused 基本可以确定是端口问题或数据库没启动超时多半是网络或防火墙拦截了 26000 端口ClassNotFoundException 是驱动 jar 包没放到 classpath 里。解决先按顺序排查。第一步用命令行确认数据库进程是否在跑ps -ef | grep opengauss第二步确认端口监听状态第三步检查 Java 代码里的连接 URL 是不是 jdbc:opengauss://虚拟机IP:26000/postgres第四步确认驱动 jar 已经加载。openGauss 的 JDBC 驱动对应的是 opengauss-jdbc 这个 jar 包别误用 PostgreSQL 的驱动连接虽然协议兼容但版本不匹配会有各种奇怪问题。还有一个容易被忽略的点gsql 里能连不代表 JDBC 也能连。gsql 是本地 socket 或带 -h 参数连接JDBC 是 TCP 连接如果数据库配置里 listen_addresses 只绑定了 localhostJDBC 远程连接必然失败。5.4 权限不足连接成功但查询失败现象JDBC 连接成功但执行 SELECT 时报权限不足或者执行 INSERT 时报没有 table 的权限。原因实验一中创建的新用户没有默认获得所有表的访问权限。openGauss 默认管理员用户才有初始权限新建的用户需要显式 GRANT。解决在实验六安全性控制里已经练过这里再提醒一次。用管理员身份执行GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO readonly_user;注意 ALL TABLES IN SCHEMA 这种写法是批量授权省略了逐表写的麻烦。如果新用户需要建表的权利则要单独 GRANT CREATE ON SCHEMA。处理权限问题前先确认你当前连接的数据库和 schema 一致别在 postgres 库里授权了却在另一个库里查询半个小时后才反应过来。6. 二次开发与实验改造把实验手册变成课程设计框架九份实验报告都跑通一遍后这套东西已经不只属于课堂了。实际上它可以被改造成一个非常顺手的数据库课程设计脚手架或者一份小型数据库应用项目的起步模板。最直接的做法是把它改造成自动化评估脚本。把实验二、实验三的建表语句和 SQL 查询整理成纯 SQL 文件配合 shell 脚本一键执行就能用来验证学生的实验是否完成。比如#!/bin/bash gsql -d db_school -p 26000 -f create_tables.sql gsql -d db_school -p 26000 -f check_constraints.sql这样每个学生提交的文件跑一遍结果一目了然。想更细一点可以在 SQL 文件里故意写几条会违反约束的 INSERT 语句看数据库会不会正确拒绝——这比人工查实验报告高效得多。第二个改造方向是把它升级成一个小型图书管理系统。原有 Students、Courses、SC 表结构可以直接复用加上 Books、BorrowRecord 两张表就能扩展出借阅功能。视图层可以加上 BorrowInfo 视图把学生姓名、书名、借书日期关联起来供前端调用。JDBC 实验从「验证能连上」变成「写一个命令行菜单程序完成图书借阅和归还操作」学习深度完全不同。这个过程中会自然用到事务借书时同时更新库存和借阅记录必须在一个事务里完成、索引按书名模糊查询、权限学生只读书目图书馆管理员可写。整份实验报告书里所有的知识点就全被串起来了。最后一个改造建议是把截图式实验记录改成带输出日志的文档。报告书里强调截图要有图编号和图题这在纸质报告中合理但线上提交可以用 gsql 的 \o 命令把执行记录导出到文件配合 echo 标记每个实验步骤最后自动生成一份带时间戳的实验日志。它比截图更可信也方便复查。每个改完的项目我都会强制走一遍「从头建库 → 跑全量 SQL → JDBC 连接 → 用户权限验证」这条完整链路任何一环断了都说明改造引入的改动破坏了既有实验。这个习惯帮我挡掉了很多次在交付前才发现问题的尴尬。数据库实验的最终目的不是交一份报告而是让你对「数据从哪来、怎么保证它不坏、谁来访问它」这三个问题有真实的操作记忆。希望这份拆解能帮你在 openGauss 上少走几圈弯路。本文还有配套的精品资源点击获取