openGauss单机安装实战:openEuler环境与gsql连接 简介这份《数据库系统原理实验》报告文档面向计算机科学与技术、软件工程等专业学生及数据库入门学习者围绕 openGauss 环境下的课程实验展开可用于巩固数据库理论、完成实验报告撰写与操作复盘。全文按实验一至实验九组织覆盖认识 DBMS 与 gsql 工具、创建数据库表及索引、交互式 SQL 查询更新、视图抽象与查询优化、完整性控制、权限与安全性控制、事务并发及锁机制、备份恢复和 JDBC 编程连接等内容并记录实验目的、操作过程、问题更正与结果分析。资源包共 1 个 docx 文件约 3.23MB正文含目录、前言、实验步骤与结果分析并说明截图、图题及表格排版要求便于按章节查阅。已有 1527 人学习适合需要对照 openGauss 安装连接、用户与数据库创建、SQL 命令使用、权限分配和事务处理等环节快速定位实验报告应包含的步骤与材料也可作为课程报告内容组织的参考。1. 一份实验报告卡在第一步库起不来九个实验全是空的上周又有人拿着一份《数据库系统原理实验》报告来找我实验一到实验九写得满满当当从认识 DBMS 到 JDBC 连接数据库唯独截图里没有一条能跑通的 SQL。问题不在 SQL 写得对不对而在装库这一步就翻车了解压完安装包敲gs_install报互信失败折腾两小时后改成了「先装 openEuler 再装 openGauss」这条最老实也最费事的路线才走通。这套环境在计算机类、软件工程专业里几乎是标配实验报告要求手写内容加电子截图装不好连第一张图都拍不出来。这篇记录的就是我把这台单机 openGauss 从零装到能用 gsql 连上的全过程包含系统预置、安装参数、建库建表顺序和几个把我卡到凌晨的坑。2. 装之前把环境定死openEuler 虚机、内存和 26000 端口装数据库这件事最贵的不是安装本身是装到一半发现内存不够、主机名没配、端口被占然后推倒重来。所以这一章不讲 openGauss只讲把它要住的那间房先收拾干净。2.1 三种安装路径的取舍为什么我选「先装 openEuler 再装库」实验指导里给了三条路云上直接开实例、虚拟机一键部署脚本、虚拟机装 openEuler 之后再手动装 openGauss。三条路都能得到同一个能连的数据库但对做实验报告的人来说价值完全不同。云上开实例最快十分钟就能连上代价是你什么都没看见。它把安装过程的参数、目录、用户全部藏起来了报告里「实验一 认识 DBMS 系统」要求写的安装模式对比、启动方式、连接方式你只能照着文档抄截图也只有一张连接成功的终端。一键部署脚本稍微好一点命令行跑完就有一个集群。但它把gs_preinstall、gs_install、集群配置文件这些环节包成了黑匣子一旦失败输出里只剩几行 log 路径新手根本不知道从哪儿看起。我一般推荐第三条先在虚拟机里装一个干净的 openEuler再手动装 openGauss。理由是后面八个实验都要在这个库上做只要环境是你自己一步步搭起来的出问题时你知道改哪个文件更实际的一点是实验报告要求「说明实验过程中遇到的问题如何更正」你亲手踩过的坑才有东西可写。提示三条路选一条走完就行别中途切换。我在一台机器上混用过一键脚本和手动安装残留的 omm 用户和旧数据目录会让后面的gs_preinstall报一堆莫名其妙的权限错误。2.2 虚机规格内存、swap、磁盘三件必须先定openGauss 单机对硬件不算苛刻但也不是随便给 1G 内存就能跑。安装前gs_check会做环境检查内存、swap、磁盘空间不达标会直接中断。下面这张表是我常用的规格左边是最低线右边是我实际给实验环境配的值项目最低要求我常用的配置说明vCPU2 核2 核再少安装过程会明显变慢内存2 GB8 GB4 GB 能装能跑多表关联查询会吃力swap与内存同量级8 GB内存小的时候 swap 别省系统盘20 GB40 GBopenEuler 本身占得不多留余量数据盘 /opt20 GB50 GB安装目录、数据目录、日志都在这端口2600026000openGauss 默认端口别改成被占用的磁盘这块有个血泪经验很多人把/opt和根分区放一起装完数据库再灌数据、做备份恢复实验/一满数据库直接起不来报错还特别含糊。条件允许就把/opt单独挂一块盘。系统装完之后第一件事是把主机名和 hosts 定下来因为后续的集群配置文件里要用节点名gs_preinstall会拿这个名字做 ssh 互信# 固定主机名重启后不变 hostnamectl set-hostname node1 # 写入 hostsIP 换成你自己虚机的私网地址 cat /etc/hosts EOF 192.168.56.10 node1 EOF # 立刻验证能 ping 通再往下走 ping -c 2 node1主机名这一步看着琐碎但它是后面 ssh 互信的地基。gs_preinstall会在 omm 用户下生成密钥对然后ssh node1免密登录自己如果node1解析不到或者解析到了一个 DHCP 变过的地址互信就会失败报的错是Failed to establish trust relationship第一次见很容易懵。接着关掉两个拦路的东西# 关闭防火墙openGauss 节点间和客户端连接都要用端口 systemctl stop firewalld systemctl disable firewalld # 关闭 SELinux改成 disabled 后建议重启一次 setenforce 0 sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config getenforce防火墙和 SELinux 是典型的玄学问题来源本地gsql能连、远程 JDBC 连不上或者安装到一半某个端口探测失败十有八九是这两个没关干净。实验环境里直接关掉生产环境按需放行 26000 端口即可。2.3 内核参数与资源限制两份配置一次写对openGauss 对信号量、共享内存、文件句柄有要求这些参数不配安装阶段可能侥幸通过跑并发事务实验的时候就开始报错。常见做法是提前写进/etc/sysctl.confcat /etc/sysctl.conf EOF # 网络相关减少 TIME_WAIT 堆积 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_keepalive_time 30 net.ipv4.tcp_max_tw_buckets 10000 # 信号量与共享内存数据库进程通信要用 kernel.sem 250 32000 100 128 kernel.shmall 1073741824 kernel.shmmax 4398046511104 kernel.shmmni 4096 fs.file-max 6815744 EOF # 让配置立刻生效 sysctl -p这几个参数里kernel.sem是信号量数组四个数字依次是每组的信号量数、系统级信号量总数、每次 semop 可操作数、信号量组数kernel.shmmax是单个共享内存段的最大字节数我习惯给到物理内存量级fs.file-max是系统级文件句柄上限。改完用sysctl -p回显一遍确认没写错行。第二份是用户资源限制。注意这里可以先给omm写上虽然用户还没建但limits.conf是按用户名匹配的等gs_preinstall建出这个用户限制自动生效cat /etc/security/limits.conf EOF omm soft nofile 1000000 omm hard nofile 1000000 omm soft nproc 65536 omm hard nproc 65536 omm soft stack unlimited omm hard stack unlimited EOFnofile是打开文件数数据库每个连接、每个数据文件都占句柄小了会报Too many open filesnproc是进程数stack是栈大小安装过程里有些步骤对栈有要求。写完最好重新登录一次终端让限制生效用su - omm之后ulimit -n验证看到 1000000 才算数。3. openGauss 安装从解压到 gs_om -t start环境定死之后安装本身其实只有三条主命令真正花时间的是理解每一步在干什么以及出错时知道去看哪个日志。3.1 解压安装包与 cluster_config.xml 的写法把安装包传到/opt/software/openGauss下。企业版的 all 包里套着一个 om 包om 包才是真正提供gs_preinstall、gs_install、gs_om这些工具的东西所以两层都要解# 统一放安装介质权限给足 mkdir -p /opt/software/openGauss cd /opt/software/openGauss # 版本号按官方发布页选同架构的 all 包x86 和 aarch64 别拿错 tar -zxvf openGauss-版本号-openEuler-64bit-all.tar.gz tar -zxvf openGauss-版本号-openEuler-64bit-om.tar.gz # 解压后应该能看到 script 目录和几个 xml 模板 ls -l解压出来的script目录很关键gs_preinstall、gs_install这两个可执行文件都在里面同时还有cluster_config.xml的模板。单机部署可以直接在模板基础上改我一般自己写一份干净的?xml version1.0 encodingUTF-8? ROOT CLUSTER PARAM nameclusterName valuedb_cluster/ PARAM namenodeNames valuenode1/ PARAM namegaussdbAppPath value/opt/gaussdb/app/ PARAM namegaussdbLogPath value/var/log/gaussdb/ PARAM nametmpMppdbPath value/opt/gaussdb/tmp/ PARAM namegaussdbToolPath value/opt/gaussdb/om/ PARAM namecorePath value/opt/gaussdb/corefile/ PARAM namebackIp1s value192.168.56.10/ /CLUSTER DEVICELIST DEVICE snnode1 PARAM namename valuenode1/ PARAM nameazName valueAZ1/ PARAM nameazPriority value1/ PARAM namebackIp1 value192.168.56.10/ PARAM namesshIp1 value192.168.56.10/ /DEVICE /DEVICELIST /ROOT这份 xml 里每一项都不是随便填的重点看这几个clusterName集群名单机也必须有后面gs_om -t status显示的实例名跟它有关。nodeNames节点名必须和hostname输出完全一致包括大小写。gaussdbAppPath程序安装目录空间要给够我放在/opt下。gaussdbLogPath日志目录这个路径以后会天天用出问题第一时间来这里翻。corePathcore dump 目录很多人不填出问题时连崩溃现场都没留下后悔药都没得吃。backIp1s和backIp1节点 IP必须和/etc/hosts里配的一致。注意xml 里所有目录都必须存在且属主正确或者由安装程序自动创建父目录。我见过最典型的翻车是gaussdbLogPath写成了/var/log/gaussdb/末尾多一个斜杠安装工具解析出空目录名直接报路径非法。3.2 gs_preinstall 与 gs_install两条命令分别在做什么gs_preinstall是准备工序它替你做四件事创建 omm 用户和 dbgrp 用户组、创建安装目录并改属主、配置 ssh 互信、检查系统参数。所以它是用 root 跑的# 权限先放开避免解压出来的文件 omm 读不到 chmod 755 -R /opt/software/openGauss cd /opt/software/openGauss/script # 交互模式会提示输入 omm 用户密码 ./gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/cluster_config.xml命令里的-U是数据库安装用户固定用 omm 最省事-G是用户组-X指向刚才那份 xml。执行过程中会提示给 omm 设置密码这个密码后面第一次登录数据库还要用复杂度要求是至少 8 位且包含大写字母、小写字母、数字、特殊字符中的至少三类别用纯数字或者纯字母会直接被拒。如果想让脚本无人值守跑完可以加--non-interactive再配合-p传密码但实验环境里我一般不用交互模式每一步的输出更容易看清哪一步出了问题。preinstall 跑完屏幕上会出现Preinstallation succeeded之类的字样这时候去ls -l /opt/gaussdb看目录属主是不是 omm是就说明这一步真的成了。真正的安装用 omm 用户跑# 切到安装用户注意是 su - 不是 su要带上环境变量 su - omm cd /opt/software/openGauss/script gs_install -X /opt/software/openGauss/cluster_config.xml \ --gsinit-parameter--encodingUTF8 \ --dn-gucmax_connections200 \ --dn-gucpassword_encryption_type1这行的参数值得单独说清楚--gsinit-parameter--encodingUTF8初始化数据库时用 UTF8 编码。这一条别省实验里要建中文姓名的学生表、教师表编码不对插进去就是问号后面所有查询结果都是乱的。--dn-gucmax_connections200数据库节点的最大连接数实验环境 200 足够多开几个 gsql 窗口加一个 JDBC 程序也不会顶掉。--dn-gucpassword_encryption_type1密码加密方式改成 1 是为了兼容一些老版本 JDBC 驱动的认证方式。如果你只用 gsql 连不写也行要跑实验九的 JDBC 连接加上更稳。安装过程会打印进度最后提示集群安装成功。如果中途失败先别急着删库重装去$GAUSSLOG下面找gs_install的日志路径一般是/var/log/gaussdb/omm/om/gs_install-*.log日志最后二十行基本就能定位原因。3.3 omm 用户与 gsql连上 26000 端口的默认 postgres安装完成后oom 用户的家目录下会多出一份.bashrc里面写好了GAUSSHOME、LD_LIBRARY_PATH、PATH。这些变量不生效gsql就会提示找不到命令# 保持 omm 身份加载环境变量 source ~/.bashrc # 确认三个关键变量都在 echo $GAUSSHOME echo $LD_LIBRARY_PATH echo $PATH | grep -o $GAUSSHOME/bin # 查看集群状态Normal 才算健康 gs_om -t status --detailgs_om -t status是最常用的健康检查命令输出里会列出每个实例的数据目录、端口和状态。状态不是Normal的先gs_om -t start拉起来起不来再看日志。然后连默认库# -d 指定数据库-p 指定端口-r 让提示符更友好 gsql -d postgres -p 26000 -r第一次连接会要求你改密码因为初始化时设的是临时密码不改不让进-- 把旧密码替换成你自己的新密码注意两个密码都要满足复杂度 ALTER ROLE omm IDENTIFIED BY NewPass2024 REPLACE OldPass2023;进去之后先认几个元命令实验一的报告内容基本都靠它们出截图-- 列出所有数据库 \l -- 切换数据库 \c db_school -- 列出当前库的所有表 \dt -- 看某张表的完整定义包括索引和约束 \d students -- 看表空间 \db -- 看用户和角色 \du -- 退出 \q到这里数据库就算装完了。端口是 26000默认库是 postgres管理员用户是 omm这三个信息在后续所有实验里都会反复用到。4. 建库建表配参数把实验二到实验六的前置条件一次搭好装完只是有了一个空库接下来要按实验报告的路径建用户、表空间、数据库、模式、表和索引。顺序错了就得返工所以这一章按真实执行顺序写。4.1 用户、表空间、数据库、模式创建顺序不能乱依赖关系是这样的数据库要挂在某个表空间上表空间要由某个用户拥有所以先建用户再建表空间再建库。很多人一上来就CREATE DATABASE跑完才发现默认落在系统表空间里后面想挪还得重建。-- 1. 建实验用普通用户密码同样要满足复杂度 CREATE USER u_exp WITH PASSWORD Exp2024db; -- 2. 建表空间relative location 是相对于数据目录的路径 CREATE TABLESPACE tpcds_local RELATIVE LOCATION tablespace/tablespace_1; -- 3. 建库并指定表空间和属主 CREATE DATABASE db_school WITH TABLESPACE tpcds_local OWNER u_exp; -- 4. 改名把演示用的库名改成实验要求的名字 ALTER DATABASE db_sc RENAME TO db_school;RELATIVE LOCATION这个写法是 openGauss 的特点路径相对于实例的数据目录不是绝对路径。它有两个隐含要求目标目录必须是空目录或者不存在且属主是 omm。如果目录里已经有文件会直接报directory is not empty。我一般先手工建好空目录再建表空间# 在 omm 用户下执行路径要和 SQL 里的相对路径对上 mkdir -p $PGDATA/tablespace/tablespace_1建完库切过去再建模式。实验报告里对 schema 有专门的辨析概念上的 schema 是一组 DDL 语句集物理上的 schema 是库里的命名空间实际建出来的是后者-- 切到新库 \c db_school -- 建一个实验用的模式 CREATE SCHEMA book_eg; -- 验证应该能在列表里看到 book_eg \dn\dn列出的就是当前库下所有模式。之后建表时如果不加模式前缀表默认落在public下想归到book_eg里要么写全名book_eg.teachers要么SET search_path TO book_eg一把切过去。4.2 表、索引、视图与完整性约束外键顺序和 \d 自检建表最容易出错的地方不是语法是顺序。Departments表有一个外键指向Teachers(Tno)Students又指向Departments(Dno)所以必须先建教师表再建院系表最后建学生表。-- 教师表主键 非空 性别检查约束 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) ); -- 院系表外键引用教师表必须在教师表之后建 CREATE TABLE Departments( Dno CHAR(20) PRIMARY KEY, Dname CHAR(20), Dheadno CHAR(20), FOREIGN KEY (Dheadno) REFERENCES Teachers(Tno) );列级约束和表级约束的区别在这里体现得很清楚Sex的CHECK写在列定义后面是列级约束FOREIGN KEY单独一行写是表级约束。规则很简单只要约束涉及多个列就必须写成表级。建完一张就自检一张别等全建完才发现错-- 看表的完整定义字段、类型、约束、索引、所属表空间 \d teachers -- 只看结构输出更简洁 \d teachers\d的输出里会明确列出Primary Key、Check constraints、Foreign-key constraints逐条对一遍比事后查错省时间。所有表建完用\dt看总数用\di看索引主键会自动带一个索引这一点实验报告里也要求说明。创建索引的语法没什么花头关键是选对列-- 学生表的院系编号经常出现在连接条件里给它建索引 CREATE INDEX student_dept ON Students(Dno); -- 验证索引是否建上 \di索引不是越多越好。这张学生表如果只有几十行数据建了索引查询也不会变快反而插入变慢。实验里要的是「会用」和「能解释为什么」理由写「减少连接查询时的全表扫描」就够了。视图这块实验四的要求是用视图做数据抽象-- 只暴露学生姓名、专业和院系名隐藏学号和出生日期 CREATE VIEW v_student_info AS SELECT s.Sname, s.Speciality, d.Dname FROM Students s JOIN Departments d ON s.Dno d.Dno; -- 查视图和查表一样 SELECT * FROM v_student_info;4.3 备份恢复与 JDBC两处最容易被漏掉的配置实验八的备份恢复、实验九的 JDBC 连接是整份报告里最容易卡住的两个因为它们的失败往往不在 SQL 层而在文件路径和网络配置上。备份用gs_dump导出的是纯文本 SQL# 在 omm 用户下执行先建好备份目录 mkdir -p /home/omm/backup # -f 输出文件-p 端口最后一个参数是数据库名 gs_dump -U u_exp -W Exp2024db -f /home/omm/backup/db_school.sql -p 26000 db_school恢复用gs_restore或者直接gsql -f# 恢复到已有的库里 gsql -d db_school_new -p 26000 -f /home/omm/backup/db_school.sql # 或者用 gs_restore 走自定义格式包 gs_restore -d db_school_new -p 26000 /home/omm/backup/db_school.dmpJDBC 连接需要两处改动缺一不可。第一处是监听地址让数据库接受非本机连接# 在 omm 用户下找到数据目录 gsql -d postgres -p 26000 -c SHOW data_directory; # 编辑 postgresql.conf把监听地址放开 vim $PGDATA/postgresql.conf # 找到 listen_addresses改成 # listen_addresses *第二处是客户端认证在pg_hba.conf末尾加一行允许实验网段用密码登录vim $PGDATA/pg_hba.conf # 追加一行网段换成你虚机所在网段 # host all all 192.168.56.0/24 sha256改完必须重启集群配置才生效gs_om -t restartJava 侧的连接代码大致是下面这样重点是驱动类名和 URL 前缀openGauss 用的是jdbc:opengauss://不是jdbc:postgresql://// 加载 openGauss 驱动jar 包要放在 classpath 里 Class.forName(org.opengauss.Driver); // sslmodedisable 用于实验环境的无证书连接 String url jdbc:opengauss://192.168.56.10:26000/db_school?sslmodedisable; Connection conn DriverManager.getConnection(url, u_exp, Exp2024db); // 简单查询验证链路 Statement st conn.createStatement(); ResultSet rs st.executeQuery(SELECT count(*) FROM Students); while (rs.next()) { System.out.println(rs.getInt(1)); }sslmodedisable这个参数不加很多情况下会报 SSL 握手失败因为服务端没配证书而客户端默认要求加密。5. 避坑与排查五个把我卡到凌晨的场景下面这五条都是实际装的时候撞出来的按「现象是什么、为什么会这样、怎么解」记。第一条gsql连本机也报 connection refused。现象是gs_om -t status显示 Normal但gsql -d postgres -p 26000提示连接被拒。原因通常是集群只是「已安装」进程没真正起来或者端口被别的服务占着。先gs_om -t start再试还不行就看端口占用ss -lntp | grep 26000以及$GAUSSLOG/pg_log下最新的日志里面会写清楚是监听失败还是启动参数不对。第二条gs_preinstall卡在 ssh 互信报 trust relationship failed。现象是脚本跑到配置互信那一步停住反复重试后失败退出。原因基本是hostname和/etc/hosts对不上或者 omm 用户的家目录权限被别人动过。解法是先ping node1和ssh node1手工验证确认能通再把/home/omm权限改回700属主 omm然后重跑 preinstall。重跑之前记得把上一次残留的~/.ssh清掉。第三条建表空间报 directory is not empty。现象是CREATE TABLESPACE ... RELATIVE LOCATION提示目录非空。原因是那个相对路径下已经有文件可能是上一次实验留下的也可能是你手工mkdir之后往里放了东西。解法是清空目录再建或者换一个新的子目录名。注意别直接用rm -rf删数据目录先ls看清楚。第四条远程 JDBC 连接报 no pg_hba.conf entry。现象是本地 gsql 一切正常Java 程序连过来报认证条目缺失。原因是pg_hba.conf里只有本地 socket 的规则没有 host 规则。改pg_hba.conf加一条host all all 网段 sha256再gs_om -t restart。改完用gsql -h 192.168.56.10 -p 26000 -d postgres先验证远程能连再跑 Java。第五条中文数据插进去变成问号。现象是建表时字段类型没问题插入「张三」查出来是乱码。原因是数据库初始化时没有指定 UTF8 编码或者客户端client_encoding跟服务端不一致。前者只能重装解决所以第 3 章那条--encodingUTF8千万别省后者在 gsql 里执行SET client_encoding TO UTF8;就能当场验证。6. 装完怎么验证从 gs_om 到 JDBC 跑通一条完整链路装完不等于装好我现在每次装完都强制走一遍下面这条链路全程不超过五分钟但能挡掉九成的隐患。第一步看集群状态这是所有检查的起点su - omm source ~/.bashrc gs_om -t status --detail输出里每个实例的状态必须是Normal端口必须是 26000。状态不对的后面的步骤全都不用做了直接去$GAUSSLOG翻日志。第二步验证本地连接和对象可见性一条命令串起来gsql -d db_school -p 26000 -r -c \dt -c \di -c \dn三个元命令分别对应表、索引、模式。表清单跟你建的对得上索引里能看到主键自动生成的索引和手工建的那一个模式列表里有book_eg说明实验二到实验四的东西都在。第三步验证远程连接和权限用主机 IP 而不是 localhostgsql -h 192.168.56.10 -p 26000 -d db_school -U u_exp -W Exp2024db -c SELECT count(*) FROM Students;这一步能过说明listen_addresses和pg_hba.conf两处配置都对了。过不了就回到第 5 章第四条。第四步验证备份恢复这是最容易被跳过、又最能暴露路径问题的一步gs_dump -U u_exp -W Exp2024db -f /home/omm/backup/check.sql -p 26000 db_school ls -lh /home/omm/backup/check.sql head -20 /home/omm/backup/check.sql导出的文件应该有实际内容head能看到CREATE TABLE语句。如果文件是 0 字节或者只有几行注释多半是权限问题或者库名写错了。最后一步是 JDBC跑一个只有 main 方法的小程序打印一行查询结果就行。表里数据不多的时候我习惯用SELECT count(*)加上一条SELECT Sname FROM Students LIMIT 3既能验证连接又能顺带确认中文没有乱码。验证项命令入口通过标准集群状态gs_om -t status --detail所有实例 Normal本地连接gsql -d db_school -p 26000能进提示符\dt有表远程连接gsql -h IP -U u_exp能连能查备份gs_dump -f xxx.sql文件非空含建表语句JDBCJava 小程序打印出查询结果无乱码这套检查我第一次写的时候嫌麻烦觉得装都装好了还查什么。后来有一次交实验报告前夜发现备份文件是空的从头查到凌晨三点才定位到是gs_dump的-p参数写成了本机另一个实例的端口。从那以后我每次装完环境不管多晚gs_om -t status、\dt、gs_dump这三步都强制走一遍确认过了再去写报告里的实验内容。希望这套流程能帮你少走一遍我走过的夜路。本文还有配套的精品资源点击获取