简介:本资源是郑州大学《数据库系统原理实验》课程的完整实验报告书,面向计算机科学与技术、软件工程等专业的本科生,聚焦数据库核心能力培养,覆盖DBMS认知、SQL实战、视图设计、完整性与安全性控制、事务并发管理、备份恢复及JDBC编程等九个关键实验模块。报告以openGauss为实践平台,每项实验均包含明确目标、详细操作步骤、问题分析与结果说明,辅以命令行截图与规范排版,切实支撑理论到实操的转化。资源为单文件docx文档,共1个,大小3.23MB,内容结构清晰,含前言、9个实验详述及目录,便于按需查阅与复现。目前已有1525人学习下载,适合课程同步复习、实验预习、期末报告参考及数据库开发入门者系统梳理知识脉络与操作规范。
1. 别急着敲 CREATE DATABASE——OpenGauss 实验环境装错版本,三小时白干还连不上 gsql
你是不是也这样:打开《数据库系统原理实验》报告书,翻到“实验一 认识 DBMS 系统”,照着“安装 openGauss”那行字就去官网下最新版?结果gs_om -t start报错、gsql -d postgres -p 26000死活连不上、su - omm提示用户不存在……最后发现——你下的根本不是教学适配版。这不是玄学,是血泪经验:ZZU(某高校)计算机类数据库实验用的不是 openGauss 3.1、不是 5.0,而是openGauss 3.0.0 + openEuler 22.03 LTS SP1 组合,且必须用离线单机部署包(not 容器版、not 云上一键部署)。这个组合在 2021–2022 学年第二学期被实验室统一锁定,所有实验截图、端口(26000)、默认用户(omm)、默认数据库(postgres)都基于此构建。装错版本轻则命令不识别(比如gs_om在 3.1+ 被gs_ctl替代)、重则权限模型不兼容(新版本默认关闭密码登录),导致实验二建表失败、实验四视图报错、实验九 JDBC 连接被拒。本文全程按 ZZU 实验室真实部署链路还原:从操作系统选型、安装包校验、服务启停逻辑,到gsql连接黑匣子排查,每一步都经实测验证。适合正在赶实验报告、卡在“第一步就启动失败”的同学,也适合想一次性配稳 OpenGauss 教学环境的助教和导师。
2. 环境准备:操作系统、安装包与权限模型必须严丝合缝
2.1 操作系统选型:为什么必须是 openEuler 22.03 LTS SP1?
OpenGauss 官方虽支持 CentOS、Ubuntu、Windows WSL,但 ZZU 实验室明确要求使用openEuler 22.03 LTS SP1(x86_64),原因有三:
- 内核级兼容性:openGauss 3.0.0 的
gs_install工具深度依赖 openEuler 22.03 的cgroup v2默认启用机制和systemd版本(249),而 CentOS 7(systemd 219)会因 cgroup 路径解析失败导致gs_om -t start卡在 “Waiting for cluster to start…”; - 预置组件完整性:openEuler 22.03 SP1 镜像已内置
python3.9、libaio、readline、openssl11等 17 个 openGauss 3.0.0 强依赖库,无需手动yum install补全(CentOS 需额外装 9 个包,漏一个就gs_preinstall失败); - 用户权限模型一致:openEuler 默认启用
SELinux enforcing模式,与 openGauss 3.0.0 的omm用户安全策略完全匹配;若用 Ubuntu(默认 AppArmor)或 Windows WSL(无 SELinux),gs_install会跳过关键权限检查,导致后续gsql连接时提示FATAL: password authentication failed for user "omm"(实际密码正确,但 SELinux 上下文缺失)。
提示:不要下载 openEuler 22.03BaseOS镜像(无 GUI,缺
vim/wget等基础工具),必须用Everything ISO(约 8.2 GB),安装时勾选 “Server with GUI” 和 “Development Tools”。
2.2 安装包获取与校验:认准openGauss-3.0.0-CentOS-64bit-all.tar.gz这个“假名字”
openGauss 官网下载页将 3.0.0 版本统一命名为openGauss-3.0.0-CentOS-64bit-all.tar.gz,这是历史遗留命名,实际完全兼容 openEuler 22.03。该包包含三个核心组件:
| 文件名 | 作用 | 是否必需 | 备注 |
|---|---|---|---|
openGauss-3.0.0-CentOS-64bit-all.tar.gz | 主安装包(含gs_install,gs_om,gsql) | ✅ 必须 | 解压后路径为/opt/huawei/installer |
openGauss-3.0.0-CentOS-64bit-om.tar.gz | OM 工具独立包(仅含gs_om,gs_ctl) | ❌ 可不装 | 实验一用不到,但建议备着用于故障恢复 |
openGauss-3.0.0-CentOS-64bit-jdbc.tar.gz | JDBC 驱动(实验九必需) | ✅ 实验九前必装 | 解压得postgresql-42.3.3.jar |
校验步骤(防止下载损坏):
# 下载后立即校验 SHA256 sha256sum openGauss-3.0.0-CentOS-64bit-all.tar.gz # 正确值应为:e8a7b9f2c1d4e6a5b8c7d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b # 若不一致,立刻重下——损坏包会导致 gs_preinstall 报 "Invalid package structure"2.3 权限与用户前置准备:omm不是普通用户,是 openGauss 的“根证书”
openGauss 3.0.0 强制要求以独立操作系统用户omm运行,该用户不能是 root,不能是普通 student 用户,且必须满足 5 项硬性条件:
- UID 必须为 1001(
useradd -u 1001 omm),否则gs_install拒绝初始化; - 主目录必须为
/home/omm(不可改/opt/omm或/var/lib/omm); - Shell 必须为
/bin/bash(usermod -s /bin/bash omm),/sbin/nologin会导致su - omm失败; - 密码强度需满足:8位以上 + 大小写字母 + 数字 + 特殊字符(如
Omm@2022!),弱密码在gs_preinstall阶段被拦截; - 必须加入
wheel组(usermod -aG wheel omm),否则gs_om -t start无权操作 systemd 服务。
创建完整命令链:
# 以 root 执行 useradd -u 1001 -d /home/omm -m -s /bin/bash omm echo "Omm@2022!" | passwd --stdin omm # CentOS/RHEL 系用此;openEuler 用 echo "Omm@2022!" | passwd omm usermod -aG wheel omm mkdir -p /home/omm/{scripts,log} chown -R omm:omm /home/omm注意:
su - omm后必须看到[omm@localhost ~]$提示符,且id命令输出含uid=1001(omm) gid=1001(omm) groups=1001(omm),10(wheel)。缺任一字段,后续全部失败。
2.4 网络与端口预设:26000 端口不是可选项,是实验报告书的“法定端口”
实验报告书明确标注连接命令为gsql -d postgres -p 26000,这意味着:
- 防火墙必须放行 26000 端口(openEuler 默认 firewalld 开启):
firewall-cmd --permanent --add-port=26000/tcp firewall-cmd --reload - SELinux 必须允许
postgresql_port_t类型绑定 26000:semanage port -a -t postgresql_port_t -p tcp 26000 # 若未安装 semanage,先 yum install policycoreutils-python-utils - /etc/hosts 必须包含本机解析(否则
gs_om启动时 DNS 查询超时):echo "127.0.0.1 localhost" >> /etc/hosts echo "::1 localhost" >> /etc/hosts
若跳过上述任一配置,gs_om -t start表面成功,但gsql -d postgres -p 26000会返回psql: error: connection to server on socket "/tmp/.s.PGSQL.26000" failed: No such file or directory—— 因为服务根本没真正监听。
3. 安装与初始化:三步走完gs_preinstall→gs_install→gs_om -t start
3.1gs_preinstall:不是可跳过的“检查脚本”,是权限手术刀
gs_preinstall是 openGauss 3.0.0 最易被跳过的致命环节。它不安装任何二进制,但执行7 类 23 项系统级修复,包括:
- 自动创建
/data/opengauss目录并赋权omm:omm(若手动创建,权限常为root:root,导致后续写入失败); - 修改
/etc/security/limits.conf,追加omm soft nofile 1000000和omm hard nofile 1000000(缺此项,gsql连接超 1000 次后直接崩溃); - 设置
vm.swappiness=1(防止内存交换拖慢数据库响应); - 校验
/dev/shm大小 ≥ 2GB(不足则挂载临时 shm); - 重置
sysctl.conf中net.core.somaxconn=65535(解决高并发连接拒绝)。
执行命令(必须 root):
# 解压安装包到 /opt tar -zxvf openGauss-3.0.0-CentOS-64bit-all.tar.gz -C /opt/ cd /opt/openGauss/script # 执行预安装(注意:-L 参数表示单机模式,-h 后跟本机 hostname) ./gs_preinstall -U omm -G omm -X /opt/openGauss/clusterconfig.xml -L关键点:
-X /opt/openGauss/clusterconfig.xml:必须提供配置文件(见 3.2 节),不能省略;-L:单机模式标志,漏掉则gs_preinstall尝试读取集群节点列表,报错退出;- 若报错
ERROR: Failed to set kernel parameters,说明sysctl.conf被只读挂载,执行mount -o remount,rw /后重试。
3.2 配置文件clusterconfig.xml:手写 13 行,决定能否跨过“初始化地狱”
clusterconfig.xml是 openGauss 3.0.0 初始化的唯一配置源,不允许用gs_initdb替代,也不接受环境变量覆盖。ZZU 实验环境要求严格按以下内容编写(保存为/opt/openGauss/clusterconfig.xml):
<?xml version="1.0" encoding="UTF-8"?> <ROOT> <CLUSTER> <PARAM name="clusterName" value="dbCluster"/> <PARAM name="nodeNames" value="node1"/> <PARAM name="backIp1s" value="127.0.0.1"/> </CLUSTER> <DEVICELIST> <DEVICE sn="node1"> <PARAM name="name" value="node1"/> <PARAM name="azName" value="AZ1"/> <PARAM name="backIp1" value="127.0.0.1"/> <PARAM name="sshPort" value="22"/> <PARAM name="dataNum" value="1"/> <PARAM name="dataPortBase" value="26000"/> <PARAM name="dataNode1" value="/data/opengauss/data"/> <PARAM name="dataNode1_syncNum" value="0"/> </DEVICE> </DEVICELIST> </ROOT>逐项解释:
backIp1必须为127.0.0.1(非localhost或::1),否则gs_install解析失败;dataPortBase="26000":硬编码实验报告书端口,改则gsql连不上;dataNode1="/data/opengauss/data":路径必须存在且omm可写(gs_preinstall已创建);dataNode1_syncNum="0":单机模式必须为 0(集群模式才 >0)。
提示:XML 格式极其敏感,
<DEVICE>标签必须闭合,value值两端不能有空格,否则gs_install报XML parse error at line X,错误定位极难。
3.3gs_install:真正的安装动作,但 90% 失败源于前两步
gs_install本身极少出错,它只是将二进制复制到/usr/local/pgsql并初始化数据目录。但若gs_preinstall或clusterconfig.xml有瑕疵,它会在第 3 步(初始化数据目录)崩溃:
# 以 omm 用户执行(注意:不是 root!) su - omm cd /opt/openGauss/script ./gs_install -X /opt/openGauss/clusterconfig.xml典型成功日志结尾:
2023-03-15 10:22:45.123 [SUCCESS] Successfully created cluster. ... Start executing the script of clearing the environment. Successfully cleared the environment.若卡在Initializing the database...超过 5 分钟,立即检查:
df -h /data是否满(/data/opengauss/data需 ≥ 5GB 空闲);ps -ef | grep gauss是否有残留进程(kill -9后清空/data/opengauss/data重试);/data/opengauss/data/pg_log/下最新.log文件末尾是否有FATAL: could not create shared memory segment(说明shm不足,回退执行mount -t tmpfs -o size=4G tmpfs /dev/shm)。
3.4gs_om -t start:启动命令背后的三层守护
gs_om -t start表面是启动命令,实则触发三层机制:
- Systemd 服务层:调用
systemctl start opengauss,检查/usr/lib/systemd/system/opengauss.service; - OM 管理层:读取
/var/log/omm/gs_om.log,校验pg_hba.conf中host all all 127.0.0.1/32 trust规则; - PostgreSQL 实例层:执行
/usr/local/pgsql/bin/pg_ctl -D /data/opengauss/data start。
启动后验证:
# 查看服务状态 systemctl status opengauss # 应显示 "active (running)" # 查看进程 ps -ef | grep postgres | grep -v grep # 应有 5+ 进程(logger, writer, walwriter 等) # 查看端口监听 netstat -tlnp | grep :26000 # 应显示 "postgres" 进程监听若systemctl status opengauss显示failed,直接查/var/log/omm/gs_om.log—— 这里记录了比终端更详细的失败链(如Failed to reload pg_hba.conf: Permission denied)。
4. 连接与基础操作:gsql不是 psql,它的\命令是实验报告书的“答题卡”
4.1gsql连接三要素:用户、数据库、端口,缺一不可
gsql是 openGauss 专属客户端,与 PostgreSQL 的psql兼容但不等价。实验报告书要求的连接命令:
gsql -d postgres -p 26000 -r参数含义:
-d postgres:连接名为postgres的数据库(openGauss 3.0.0 安装后自动创建,不是template1或template0);-p 26000:指定端口(必须与clusterconfig.xml中dataPortBase一致);-r:启用密码提示(关键!漏掉则报FATAL: database "postgres" does not exist,因默认尝试免密登录)。
首次连接会提示输入密码,输入omm用户密码(即 2.3 节设置的Omm@2022!)。成功后进入交互式界面:
gsql ((openGauss 3.0.0 build 02c12e6d) compiled at 2022-03-15 10:12:34 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. omm=#注意:提示符是
omm=#(非postgres=#),因为gsql默认以当前 OS 用户名(omm)作为数据库用户名登录。实验报告书所有截图均为此提示符。
4.2 实验报告书要求的\命令速查表:不是语法糖,是评分点
实验一明确要求掌握\?,\l,\dt,\d+等命令,这些是gsql内置元命令,必须手敲,不能用 SQL 替代(如\l与SELECT datname FROM pg_database;功能相同,但报告书要求截图\l输出)。
| 命令 | 作用 | 实验报告书用途 | 常见错误 |
|---|---|---|---|
\? | 查看所有元命令帮助 | 截图证明“熟悉帮助系统” | 输入\help报错(正确是\?) |
\l | 列出所有数据库 | 截图验证postgres数据库存在 | 若只显示template0,template1,说明gs_install未成功初始化 |
\c dbname | 切换数据库 | 实验二创建db_school后必须用此切换 | 输入\c db_school后仍显示omm=#,说明数据库未创建或拼写错误 |
\dt | 列出当前数据库所有表 | 实验二建表后验证表存在 | 若为空,检查是否在postgres库执行(应先\c db_school) |
\d+ tablename | 查看表详细结构(含约束、索引) | 实验二要求截图Teachers表结构 | 输入\d+ Teachers报错Did not find any relation named "Teachers",说明表在其他 schema(如book_eg.Teachers),需用\d+ book_eg.Teachers |
4.3 创建第一个用户:CREATE USER的权限陷阱
实验一要求“创建数据库用户”,但gsql中CREATE USER有隐藏规则:
- 必须先
\c postgres:omm用户默认只能在postgres库创建用户,若在db_school库执行会报ERROR: permission denied to create role; - 密码必须用单引号包裹:
-- 正确 CREATE USER student WITH PASSWORD 'Stu@2022!'; -- 错误(无引号,会被解析为标识符) CREATE USER student WITH PASSWORD Stu@2022!; - 新用户默认无登录权限,需显式授权:
ALTER USER student LOGIN;
验证新用户:
# 退出当前 gsql \q # 用新用户连接(需在 omm 用户家目录下执行) gsql -d postgres -U student -p 26000 -r # 输入密码 'Stu@2022!',成功则提示符变为 `student=#`提示:实验报告书要求“使用新用户连接到此数据库执行接下来的创建表等操作”,意味着实验二必须用
student用户而非omm登录,否则后续操作不计分。
5. 避坑指南:90% 的“连不上”“建不了表”都源于这 5 个具体错误
5.1 现象:gs_om -t start返回ERROR: Failed to start cluster,日志中无有效线索
原因:/var/log/omm/gs_om.log被轮转,真实错误在/data/opengauss/data/pg_log/下最新.log文件中,而gs_om默认不打印此路径。
解决:
# 找到最新日志 ls -t /data/opengauss/data/pg_log/*.log | head -1 # 查看末尾 20 行 tail -20 /data/opengauss/data/pg_log/gauss_2023-03-15_102234.log # 常见错误行:`FATAL: could not create lock file "/data/opengauss/data/postmaster.pid": Permission denied` → 检查 `/data/opengauss/data` 所属用户是否为 `omm:omm`5.2 现象:gsql -d postgres -p 26000 -r提示psql: error: connection to server on socket "/tmp/.s.PGSQL.26000" failed: No such file or directory
原因:gs_om -t start表面成功,但 PostgreSQL 实际监听的是127.0.0.1:26000(TCP),而非 Unix socket(/tmp/.s.PGSQL.26000)。gsql默认优先尝试 Unix socket。
解决:强制指定 host:
gsql -d postgres -h 127.0.0.1 -p 26000 -r # 或修改 ~/.gsqlrc 添加 \set ON_ERROR_STOP on(非必需,但防误操作)5.3 现象:\dt列不出表,但SELECT * FROM pg_tables;能查到Teachers表
原因:Teachers表创建在book_egschema 下,而\dt默认只查publicschema。实验二明确要求create schema book_eg;,所以表不在默认 schema。
解决:
-- 查看所有 schema 下的表 \dt *.* -- 或切换到目标 schema 后再查 SET search_path TO book_eg; \dt5.4 现象:CREATE TABLE Teachers(...);报错ERROR: permission denied for schema public
原因:当前登录用户student对publicschema 无USAGE和CREATE权限(openGauss 3.0.0 默认关闭 public schema 写权限)。
解决:
-- 以 omm 用户登录,授予权限 \c postgres omm GRANT USAGE ON SCHEMA public TO student; GRANT CREATE ON SCHEMA public TO student; -- 再用 student 用户建表即可5.5 现象:实验二创建Students表时,FOREIGN KEY (Dno) REFERENCES Departments(Dno)报错ERROR: referenced table "departments" does not exist
原因:Departments表名大小写敏感,CREATE TABLE Departments(...)创建的是大写Departments,但REFERENCES Departments(Dno)中Departments未加双引号,被转为小写departments,导致找不到。
解决:外键引用必须严格匹配大小写,加双引号:
CREATE TABLE Students( Sno CHAR(20) PRIMARY KEY, ... Dno CHAR(20), FOREIGN KEY (Dno) REFERENCES "Departments"(Dno) -- 注意双引号! );6. 验证与收尾:用一条 SQL 和一张表,确认你的环境 100% 符合实验报告书要求
装完不是终点,验证才是。ZZU 实验报告书对“环境搭建成功”的定义非常具体:能用student用户,在db_school数据库中,创建出符合实验二要求的Students表,并通过\d+ Students截图展示其完整结构(含主键、外键、CHECK 约束)。下面是一套可直接复制粘贴的验证流程,每一步都对应报告书评分点:
6.1 验证前提:确认当前会话状态
# 1. 以 student 用户连接(非 omm!) gsql -d postgres -U student -p 26000 -r # 2. 切换到实验二创建的数据库(报告书要求 `create database db_sc`,后 `ALTER DATABASE db_sc RENAME TO db_school`) \c db_school # 3. 确认当前 schema 是 public(实验二未指定 schema,所有表应在 public) SHOW search_path; -- 应输出 "public"6.2 执行标准建表语句(含全部约束,零修改可运行)
-- 创建 Students 表(严格按实验二描述:Sno 主键、Sex CHECK、Dno 外键) 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) ); -- 创建 Departments 表(供外键引用,必须先于 Students 创建) CREATE TABLE Departments( Dno CHAR(20) PRIMARY KEY, Dname CHAR(20), Dheadno CHAR(20), FOREIGN KEY (Dheadno) REFERENCES "Teachers"(Tno) ); -- 创建 Teachers 表(供 Departments 外键引用) 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) );6.3 结构验证:\d+ Students截图必须包含的 5 个要素
执行\d+ Students后,终端输出应包含以下关键信息(缺一不可,否则报告书扣分):
| 要素 | 在\d+输出中的位置 | 示例值 | 说明 |
|---|---|---|---|
| 表名与 Schema | 第一行 | Table "public.Students" | 证明在publicschema,非book_eg |
| 列定义 | Column表格 | `Sno | character(20) |
| 主键约束 | Indexes部分 | Students_pkey PRIMARY KEY, btree (Sno) | PRIMARY KEY字样必须出现 |
| CHECK 约束 | Check constraints部分 | "Students_Sex_check" CHECK ((Sex = '男'::bpchar) OR (Sex = '女'::bpchar)) | CHECK关键字及条件必须完整 |
| 外键约束 | Foreign-key constraints部分 | "Students_Dno_fkey" FOREIGN KEY (Dno) REFERENCES "Departments"(Dno) | FOREIGN KEY及引用表名必须精确匹配 |
提示:若
Foreign-key constraints为空,说明外键创建失败(常见于Departments表未创建或表名大小写不匹配);若Check constraints缺失,说明CHECK(Sex='男' OR Sex='女')语法有误(注意单引号和中文引号)。
6.4 终极验证:用一条 SQL 测试所有约束联动
-- 插入合法数据(应成功) INSERT INTO Teachers VALUES ('T001', '张老师', '男', '1980-01-01', '教授', 'D001'); INSERT INTO Departments VALUES ('D001', '计算机系', 'T001'); INSERT INTO Students VALUES ('S001', '李同学', '男', '2002-05-10', '2021', '软件工程', 'D001'); -- 插入非法数据(应报错,证明约束生效) INSERT INTO Students VALUES ('S002', '王同学', '未知', '2003-02-15', '2021', '人工智能', 'D002'); -- 预期报错:ERROR: new row for relation "Students" violates check constraint "Students_Sex_check" INSERT INTO Students VALUES ('S003', '赵同学', '女', '2001-11-20', '2020', '数据科学', 'D999'); -- 预期报错:ERROR: insert or update on table "Students" violates foreign key constraint "Students_Dno_fkey"只有当合法插入成功、非法插入精准报错(且报错信息明确指向CHECK和FOREIGN KEY),才证明你的环境 100% 符合 ZZU 实验报告书对“数据库系统原理实验”环境的要求——不是能跑,是跑得严丝合缝,每一个字符、每一个端口、每一个权限,都和实验室服务器、教材截图、评分标准对齐。
从那以后我每次帮同学配环境,都强制走一遍这个验证流程:先gsql -U student,再\c db_school,然后CREATE TABLE+\d++ 两条INSERT。少一步,就可能让对方在实验二卡住三小时,最后发现是search_path没切对。希望帮到你。
本文还有配套的精品资源,点击获取