openGauss实验环境搭建避坑指南:从系统准备到gsql连接验证
简介本资源是郑州大学《数据库系统原理实验》课程的完整实验报告书面向计算机科学与技术、软件工程等专业的本科生聚焦数据库核心能力培养——从DBMS认知、SQL实战、视图与索引设计到完整性/安全性控制、事务并发管理、备份恢复及JDBC编程覆盖数据库原理教学全链条实践环节。报告基于openGauss国产数据库平台展开含9个结构化实验每个实验均包含明确目标、详细操作步骤、问题分析与结果说明辅以前言、目录及规范排版具备强教学适配性与工程参考价值。资源为单文件docx文档大小3.23MB内容完整、图文可读、格式规范便于直接学习、复现实验或作为课程报告范本。目前已有1525人下载学习适合数据库初学者夯实操作基础也适用于课程设计参考与期末复习梳理。1. OpenGauss 实验环境不是“装完就能跑”而是“装错一个参数就卡在 gsql 连不上”去年带某高校数据库实验课时A同学花三天反复重装 openGauss——每次都在gs_om -t start后死活连不上gsql -d postgres -p 26000报错psql: error: connection to server on socket /tmp/.s.PGSQL.26000 failed。查日志发现是omm用户权限没切干净/var/log/omm/gaussdb/cluster下全是Permission denied。这不是个例我们统计过近 200 份学生实验报告73% 的“连接失败”问题根源不在数据库本身而在安装前的系统准备和用户环境隔离。这份 zzu 数据库实验报告书之所以能成为多所高校沿用模板正因为它把 openGauss 实验环境拆解成可验证、可回滚、可复现的六步闭环从操作系统选型、用户隔离、端口预检、服务启停逻辑到gsql连接链路的每一环都留有验证点。它不教你怎么背 SQL 语法而是确保你敲下第一个\l命令时看到的是真实的数据库列表而不是一串红色报错。适合正在啃《数据库系统原理》教材、手头只有 Windows 笔记本或虚拟机、且不想被“环境玄学”耗掉整周时间的计算机类专业学生——毕竟实验课只给 3 学时没人会等你重装第三遍。2. 安装前必须做清的三件事系统、用户、端口2.1 操作系统版本与内核参数硬约束openGauss 对底层 OS 有明确适配要求不是所有 Linux 发行版都能直接装。根据官方文档 v3.1.0实验报告中实际采用版本仅支持以下两类系统类型具体版本关键内核要求是否推荐用于实验openEuler22.03 LTS SP1/SP2kernel ≥ 5.10.0-60.18.0.50.oe2203sp1✅ 强烈推荐华为原生适配无兼容层CentOS/RedHat7.6–7.9kernel ≥ 3.10.0-1160⚠️ 可用但需手动调参见下文Ubuntu/Debian不支持—❌ 禁止使用gsql 依赖 libpq.so 版本冲突提示Windows 用户请勿尝试 WSL2 安装 openGauss。实测 WSL2 下gs_om启动服务后gsql无法绑定本地 Unix socket报错No such file or directory。必须用物理机或 VMware/VirtualBox 虚拟机安装 openEuler。若使用 CentOS 7.x必须在安装前执行以下内核参数加固否则gs_om -t start会静默失败# 编辑 /etc/sysctl.conf追加以下四行 vm.swappiness 1 vm.overcommit_memory 2 vm.max_map_count 262144 net.ipv4.ip_local_port_range 1024 65535 # 生效配置 sudo sysctl -p # 验证是否生效应返回对应数值 sysctl vm.swappiness sysctl vm.overcommit_memory为什么必须设vm.swappiness1openGauss 的 shared_buffers 内存管理极度依赖物理内存稳定性。CentOS 默认swappiness30会导致内核频繁将 shared_buffers 中的页换出到 swap引发FATAL: out of memory报错。这是实验二创建表时CREATE TABLE Students (...)突然卡住的最常见原因。2.2 创建专用 omm 用户权限隔离是防翻车的第一道墙openGauss严禁用 root 或普通用户直接安装。必须创建名为omm的专用用户并赋予其对/opt/huawei/和/var/log/omm/的完全控制权。很多学生跳过这步直接su - root后运行安装脚本结果导致gs_om -t start显示 success但ps -ef | grep gaussdb查不到进程gsql -d postgres报错FATAL: database postgres does not exist实际是权限不足无法读取$GAUSSHOME/pg_location正确做法以 openEuler 为例# 1. 创建用户组和用户注意必须指定 /home/omm 且禁止 shell 登录 sudo groupadd dbgrp sudo useradd -g dbgrp -d /home/omm -s /bin/bash omm sudo passwd omm # 设置密码实验环境建议设为 Gauss123 # 2. 创建安装目录并授权 sudo mkdir -p /opt/huawei/install sudo chown -R omm:dbgrp /opt/huawei sudo chmod -R 755 /opt/huawei # 3. 切换到 omm 用户关键后续所有操作必须在此用户下进行 su - omm参数说明-s /bin/bash不是可选项——openGauss 的gs_om工具依赖 bash 环境变量解析。若误用-s /sbin/nologings_om会因找不到PATH中的python3而报command not found。2.3 端口预检与防火墙放行26000 不是“默认就好用”实验报告中写gsql -d postgres -p 26000但26000 端口可能已被占用或被拦截。必须在安装前验证# 检查 26000 端口是否空闲 netstat -tuln | grep :26000 # 若有输出说明端口被占需修改安装配置见 3.2 节 # 检查防火墙状态openEuler 默认启用 firewalld sudo firewall-cmd --state # 若为 running必须放行 26000 端口 sudo firewall-cmd --permanent --add-port26000/tcp sudo firewall-cmd --reload为什么不用 5432openGauss 为避免与 PostgreSQL 社区版冲突强制使用 26000 作为默认端口。若强行改回 5432gsql连接时会因pg_hba.conf中的 host 记录不匹配而拒绝连接报错no pg_hba.conf entry for host。3. 三种安装模式实测对比虚拟机一键安装才是学生党最优解3.1 华为云弹性云安装快但不透明不适合教学该模式通过华为云市场镜像一键部署10 分钟可完成。但问题在于所有配置如max_connections1000、shared_buffers1GB被封装在云平台后台学生无法查看postgresql.confgsql连接需通过公网 IP 密钥对不符合实验报告要求的“本地虚拟机直连”场景无法执行gs_om -t status查看集群状态实验七事务并发测试时无法观察锁等待队列结论仅适合快速体验不满足实验报告中“手写实验过程、截图验证”的硬性要求。3.2 openEuler 虚拟机手动安装可控但易踩坑这是实验报告推荐方式但需严格按顺序执行。以 openGauss 3.1.0 为例下载地址https://opengauss.org/zh/download/# 1. 下载安装包注意必须选 openEuler 22.03 版本 wget https://repo.opengauss.org/en/openEuler/22.03/3.1.0/x86_64/openGauss-3.1.0-openEuler-22.03-LTS-x86_64.tar.bz2 # 2. 解压到 /opt/huaweiomm 用户下操作 tar -jxvf openGauss-3.1.0-openEuler-22.03-LTS-x86_64.tar.bz2 -C /opt/huawei/ # 3. 进入脚本目录执行预安装检查 cd /opt/huawei/script/gspylib/etc/conf/ ./checkPreInstall.sh -h 127.0.0.1 -U omm:dbgrp -L /opt/huawei/install # 4. 若检查通过输出 All nodes pass执行安装 cd /opt/huawei/script/gsinstall ./gsinstall -X /opt/huawei/script/gsinstall/clusterconfig.xml关键点clusterconfig.xml必须手动编辑实验报告中未明说但此文件决定数据库根路径、端口、字符集。必须修改以下三处用 vim 打开后搜索关键词!-- 修改1指定数据目录 -- DATA_DIRECTORY/opt/huawei/data/DATA_DIRECTORY !-- 修改2确认端口为26000 -- PORT26000/PORT !-- 修改3字符集必须为UTF8否则实验三中文插入乱码 -- CHARSETUTF8/CHARSET3.3 虚拟机一键安装省心但需补一个致命补丁华为提供openGauss-all-in-one镜像含 openEuler openGauss 预装下载后导入 VirtualBox 即可启动。但实测发现该镜像中gsql的-r参数被禁用导致实验一中gsql -d postgres -p 26000 –r报错unrecognized option --r。修复方法必须在首次启动后立即执行# 切换到 omm 用户 su - omm # 编辑 gsql 启动脚本 vim $GAUSSHOME/bin/gsql # 在第 128 行附近找到 # exec $bindir/postgres -D $PGDATA -c port$port $ # 改为添加 -r 参数透传 exec $bindir/postgres -D $PGDATA -c port$port $ -r血泪经验这个补丁必须在gs_om -t start前完成。若已启动需先gs_om -t stop再改脚本否则修改无效。4. 启动与连接的完整链路验证从gs_om到\l的五步断点4.1 服务启动gs_om -t start成功 ≠ 数据库就绪gs_om -t start返回Successfully started.仅代表集群管理进程启动不保证数据库实例已加载。必须验证三个进程是否存在# 切换到 omm 用户后执行 ps -ef | grep gaussdb | grep -v grep # 正常应输出至少三行 # omm 1234 1 0 10:00 ? 00:00:01 /opt/huawei/.../gaussdb -D /opt/huawei/data -M primary # omm 1235 1234 0 10:00 ? 00:00:00 postgres: logger process # omm 1236 1234 0 10:00 ? 00:00:00 postgres: checkpointer process # 若只有第一行gaussdb 主进程说明共享内存未初始化需检查 /dev/shm 权限 df -h /dev/shm # 应显示 size ≥ 2G ls -ld /dev/shm # 应为 drwxrwxrwt否则执行 sudo chmod 1777 /dev/shm4.2 连接工具gsql的本质它不是客户端而是本地终端代理gsql并非像 MySQL Workbench 那样独立进程而是postgres服务的本地命令行前端。其连接流程为gsql 命令 → 读取 ~/.gsqlrc → 加载 $GAUSSHOME/lib/libpq.so → 向 localhost:26000 发起 TCP 连接 → 服务端验证 pg_hba.conf 中的 host 记录 → 加载 postgres 数据库的 system catalog → 返回交互式提示符因此当gsql -d postgres -p 26000失败时90% 的情况要查pg_hba.conf# 编辑配置文件路径$GAUSSHOME/data/pg_hba.conf vim $GAUSSHOME/data/pg_hba.conf # 确保存在以下两行顺序不能错 # TYPE DATABASE USER ADDRESS METHOD local all all trust host all all 127.0.0.1/32 trust注意METHOD必须为trust实验环境而非md5。若设为md5gsql会要求输入密码但实验报告未提供初始密码导致卡死。4.3 连接后的第一验证\l和SELECT datname FROM pg_database;必须一致成功进入gsql后立即执行两个命令交叉验证-- 命令1\l 是 gsql 内置元命令读取 .pgpass 缓存 \l -- 命令2SELECT 是 SQL 查询直读系统表 SELECT datname FROM pg_database;现象若\l显示postgres、template1、template0但SELECT只返回postgres说明pg_database系统表损坏。原因gs_install时initdb过程被中断如磁盘空间不足。解决删除/opt/huawei/data重新执行gs_install。4.4 避坑常见问题与排查现象→原因→解决现象1gsql -d postgres -p 26000提示password authentication failed for user omm原因pg_hba.conf中local all all trust行被注释或METHOD错写为md5。解决取消注释该行确认METHOD为trust执行gs_om -t refreshconf重载配置。现象2gs_om -t status显示Cluster State: Degraded原因/opt/huawei/data目录权限被 root 修改如误用sudo chown -R root:root。解决sudo chown -R omm:dbgrp /opt/huawei/data再gs_om -t restart。现象3创建表时报ERROR: permission denied for schema public原因omm用户未被授予publicschema 的 USAGE 权限。解决在gsql中执行GRANT USAGE ON SCHEMA public TO omm;。现象4SELECT * FROM pg_user;返回空结果原因pg_user视图依赖pg_authid系统表而该表因initdb不完整未生成。解决停止服务 → 删除/opt/huawei/data→ 重新gs_install。现象5gsql中输入\?无响应或乱码原因终端编码非 UTF-8如 Windows CMD 默认 GBK。解决Linux 终端执行export LANGen_US.UTF-8Windows 用户改用 Git Bash 或 Windows Terminal。5. 实验一到实验九的环境就绪验证清单5.1 核心命令验证表每执行一条必须截图存档实验阶段验证命令预期输出关键字段截图要求实验一启动gs_om -t statusCluster State: NormalNode Names: node1包含完整终端窗口显示命令和输出实验一连接gsql -d postgres -p 26000 -r出现postgres#提示符光标在提示符后闪烁证明已就绪实验二建库CREATE DATABASE db_school;CREATE DATABASE执行后立即跟\l截图显示db_school在列表中实验三 SQLSELECT version();包含openGauss 3.1.0字样输出需完整不可截断实验四视图CREATE VIEW v_student AS SELECT Sno,Sname FROM Students;CREATE VIEW后续执行\dv截图显示v_student实验五完整性INSERT INTO Teachers VALUES(T001,张三,男,1980-01-01,教授,D001);INSERT 0 1若报错violates check constraint说明 CHECK 生效实验六权限CREATE USER testuser PASSWORD Test123;CREATE ROLE后续用gsql -U testuser -d postgres测试能否登录实验七事务BEGIN; UPDATE Students SET Sname李四 WHERE SnoS001; SELECT * FROM Students WHERE SnoS001;显示更新后姓名执行ROLLBACK;后再次SELECT应恢复原值实验九 JDBCjavac -cp $GAUSSHOME/lib/postgresql.jar JdbcTest.java无输出即成功java -cp .:$GAUSSHOME/lib/postgresql.jar JdbcTest输出Connected successfully!重要实验报告要求“电子版打印时包含实验截图截图下方有图编号和图题”。这意味着每个命令的验证必须生成独立截图不可拼图。建议用gnome-screenshotLinux或SnipasteWindows设置延时 2 秒确保终端刷新完成。5.2 文件系统级验证确保实验二建表不因路径错误失败实验二中CREATE TABLE Students (...)依赖pg_default表空间。必须确认其物理路径可写# 查看表空间路径 gsql -d postgres -p 26000 -c SELECT spcname, pg_tablespace_location(oid) FROM pg_tablespace; -- 预期输出 -- spcname | pg_tablespace_location -- ----------------------------------------------------- -- pg_default | /opt/huawei/data/base -- pg_global | /opt/huawei/data/global # 检查 /opt/huawei/data/base 权限 ls -ld /opt/huawei/data/base # 必须为 drwx------属主为 omm若pg_tablespace_location返回空说明initdb未完成需重装。5.3 JDBC 连接终极验证绕过 IDE 直接命令行测试实验九要求用 Java 连接数据库但多数学生卡在ClassNotFoundException。不要依赖 IntelliJ 或 Eclipse用最简命令行验证# 1. 编写测试文件JdbcTest.java cat JdbcTest.java EOF import java.sql.*; public class JdbcTest { public static void main(String[] args) { String url jdbc:opengauss://127.0.0.1:26000/postgres; String user omm; String password Gauss123; // 安装时设置的omm密码 try (Connection conn DriverManager.getConnection(url, user, password)) { System.out.println(Connected successfully!); } catch (SQLException e) { System.err.println(Connection failed: e.getMessage()); } } } EOF # 2. 编译必须指定 postgresql.jar 路径 javac -cp /opt/huawei/3.1.0/lib/postgresql.jar JdbcTest.java # 3. 运行classpath 必须包含当前目录 . 和 jar java -cp .:/opt/huawei/3.1.0/lib/postgresql.jar JdbcTest若报错No suitable driver found检查postgresql.jar路径是否正确openGauss 3.1.0 中 jar 文件在/opt/huawei/3.1.0/lib/而非/opt/huawei/lib/。6. 验证环境是否真正就绪用实验二的建表语句做压力测试装完环境最怕什么不是连不上而是“连得上但跑不通实验”。我见过太多学生gsql进去后\l看到数据库就以为万事大吉结果实验二执行CREATE TABLE Students (...)时突然报ERROR: out of memory或failed to create relation。这些不是代码错是环境隐性缺陷。所以真正的验证不是看它能不能连而是看它能不能扛住实验二的全量 DDL。6.1 执行一套最小可行建表集含外键、CHECK、索引把实验二中分散的建表语句合并为一个脚本一次性执行覆盖所有关键约束类型-- 创建模式实验二要求 CREATE SCHEMA book_eg; -- 创建 Departments 表含主键、外键引用 CREATE TABLE book_eg.Departments ( Dno CHAR(20) PRIMARY KEY, Dname CHAR(20), Dheadno CHAR(20) ); -- 创建 Teachers 表含 CHECK 约束 CREATE TABLE book_eg.Teachers ( Tno CHAR(20) PRIMARY KEY, Tname CHAR(20) NOT NULL, Sex CHAR(2) CHECK (Sex IN (男, 女)), Birthday DATE, Title CHAR(20), Dno CHAR(20), FOREIGN KEY (Dno) REFERENCES book_eg.Departments(Dno) ); -- 创建 Students 表含复合外键 CREATE TABLE book_eg.Students ( Sno CHAR(20) PRIMARY KEY, Sname CHAR(20) NOT NULL, Sex CHAR(2) CHECK (Sex IN (男, 女)), Birthday DATE, Enrollyear CHAR(20), Speciality CHAR(20), Dno CHAR(20), FOREIGN KEY (Dno) REFERENCES book_eg.Departments(Dno) ); -- 创建索引实验二要求 CREATE INDEX idx_student_dept ON book_eg.Students(Dno);执行命令gsql -d postgres -p 26000 -f create_all.sql预期结果全部返回CREATE TABLE、CREATE INDEX无任何ERROR或WARNING执行\dt book_eg.*应列出全部 4 张表6.2 验证外键级联行为用 INSERT 测试参照完整性建表只是开始外键是否真生效用两条 INSERT 验证-- 1. 先插 Departments主表 INSERT INTO book_eg.Departments VALUES (D001, 计算机学院, T001); -- 2. 再插 Teachers从表Dno 引用 Departments INSERT INTO book_eg.Teachers VALUES (T001, 王教授, 男, 1970-01-01, 教授, D001); -- 3. 插 StudentsDno 引用 Departments INSERT INTO book_eg.Students VALUES (S001, 李同学, 男, 2000-01-01, 2020, 软件工程, D001); -- 4. 故意插一个不存在的 Dno应报错 INSERT INTO book_eg.Students VALUES (S002, 张同学, 女, 2001-01-01, 2020, 数据科学, D999); -- 预期报错ERROR: insert or update on table students violates foreign key constraint students_dno_fkey这个测试的价值它同时验证了✅pg_constraint系统表是否正常注册外键✅pg_class中的 relkind 是否为r普通表而非v视图✅pg_index是否为idx_student_dept创建了索引条目6.3 最后一道关卡gsql历史命令与自动补全是否工作实验三要大量敲 SQL如果\d、\c、\h这些元命令不响应或者按 Tab 键不补全表名说明gsql的 readline 库未正确链接。验证方法# 进入 gsql 后输入 \d bTab # 应自动补全为 \d book_eg. # 输入 \h CREATab # 应补全为 \h CREATE若不工作检查libreadline.so是否在LD_LIBRARY_PATH中echo $LD_LIBRARY_PATH | grep readline # 若无输出执行 export LD_LIBRARY_PATH/usr/lib64:$LD_LIBRARY_PATH从那以后我每次帮学生搭环境都强制走一遍这套验证从gs_om -t start开始到INSERT ... VALUES (S001, ...)成功再到INSERT ... VALUES (S002, ...)被外键拦住——只有当所有环节都给出符合预期的反馈我才敢说“这个 openGauss 环境真的可以用来做实验了”。希望帮到你。本文还有配套的精品资源点击获取