GaussDB 100安装部署与运维实战:从tar.gz到JDBC连接
简介这是华为 GaussDB 100 1.0.1 面向 EulerOS 2.0 SP8 的 64 位数据库安装包适合正在评估或部署 GaussDB 的企业 DBA、运维与开发人员使用。该版本以分布式架构、强一致事务、高可用和并行分析能力为核心可支撑海量数据存储、高并发在线事务处理及 OLAP 场景是华为云数据库生态的重要基础组件。压缩包共 6 个文件约 7.39MB主要包含 .gz 数据库发行包、Python 编写的安装/升级辅助脚本含 SSH 密钥处理、公共函数库等以及 sha256 校验文件文件分工清晰便于在部署前核对包完整性并按脚本推进安装、升级等操作。目前已有 1313 人学习/下载。内含脚本可辅助完成环境准备与安装参数校验提升部署效率校验文件则为下载安全提供保障结合文件组织方式读者能快速理解安装入口、升级流程与校验逻辑为后续在 EulerOS 环境完成真实部署和调优提供直观参考。1. 拿到GaussDB 100安装包从tar.gz到跑通一个国产数据库某公司内部系统做信创适配迁移目标选定了 GaussDB 100我从内部拿到一个离线安装包GaussDB_100_1.0.1-DATABASE-EULER20SP8-64bit.tar.gz。单看文件名就能读出关键信息这是 GaussDB 100 的 1.0.1 版本目标系统是 EulerOS 20 SP8 64 位。这个包解决的是在国产操作系统上快速部署一套事务型 OLTP 数据库的问题。装它本身不复杂但坑点不少尤其是操作系统的版本检测、初始化时的内存参数、以及启动后的日志管理。这篇笔记写给负责安装和维护它的 DBA、运维工程师也写给那些刚接触 GaussDB 的开发同学按着步骤走能少走很多弯路。2. 安装前的准备系统环境、依赖与安装包校验2.1 系统与硬件要求EulerOS 20 SP8 只是基础我习惯在安装前先把系统信息打出来避免装上之后才发现内核版本不匹配。GaussDB 100 1.0.1 对操作系统是有版本要求的包名里写明了是 EulerOS 20 SP8这意味着它是针对这个系统的内核和 glibc 编译的所以先执行下面几条命令确认。uname -a cat /etc/os-release free -g df -h/etc/os-release里的VERSION_ID是安装脚本重点读取的内容。常见做法是要求20.03这样的版本号如果小版本号比它高比如20.06脚本可能直接拒绝执行。free -g输出中swap 可以小但物理内存建议至少 2GB。我第一次在一台 1GB 的虚拟机上尝试安装安装过程正常但启动后跑一个稍微复杂点的查询就报内存不足最后被 OOM 杀掉了。磁盘上解压安装包至少预留 3GB数据目录独立挂载可用空间不要低于 10GB否则后面归档日志和在线日志会把分区写满。除了版本和内存网络环境也要提前确认。数据库启动后需要监听业务网卡的 IP如果/etc/hosts里主机名解析到了127.0.0.1数据库会只监听回环地址远程应用完全连不上。我一般这样修改192.168.10.21 gaussdb-host改完用ping gaussdb-host验证解析到了内网 IP。这个不起眼的步骤能避免后面“进程起来了但 tcp 端口不对”的排查。防火墙方面测试环境直接关闭生产环境放行数据库端口。GaussDB 100 默认端口是 1888生产环境放行命令大致如下firewall-cmd --add-port1888/tcp --permanent firewall-cmd --reload另外还要处理 SELinux。安装脚本对 SELinux 的兼容性并不好我见过数据库管理器进程起来后马上退出最后定位到 SELinux 拦截了数据文件访问。如果允许建议把 SELinux 置为 permissive。2.2 安装包内容与校验先确认没下错拿到 tar.gz 后先别急着解压我一般先打印包内文件列表确认是可用的安装包。tar -tzf GaussDB_100_1.0.1-DATABASE-EULER20SP8-64bit.tar.gz | head -20输出里应该能看到install.py、bin、lib、admin、license等目录和脚本。install.py是安装入口bin里放着数据库进程和运维工具lib里是运行时依赖库。如果包前半部分列出来的文件不完整或者有奇怪的路径就要怀疑包是否损坏或被人改过。校验文件的完整性我习惯用 md5sum大多数离线包没有附带签名文件。md5sum GaussDB_100_1.0.1-DATABASE-EULER20SP8-64bit.tar.gz拿到哈希值后和提供方给的参考值比对。网络传输导致的文件损坏表现很隐蔽tar 解压可能不报错但安装到一半动态库加载失败日志里全是cannot open shared object file这种问题查起来非常费劲不如装之前花十秒钟做校验。解压后可以进一步检查核心二进制对系统库的依赖tar -zxf GaussDB_100_1.0.1-DATABASE-EULER20SP8-64bit.tar.gz cd GaussDB100-1.0.1 ldd bin/gaussdb | grep not found如果输出里出现not found说明系统缺了对应的基础库。GaussDB 100 的安装包里已经把大部分运行库打进去了如果还缺通常集中在libc.so、libstdc.so这些基础库上这时候就要检查操作系统的软件源和兼容层是否完整。2.3 创建用户和目录数据库不能跑在 root 下这是一个安全基线也是 GaussDB 100 安装脚本的硬约束数据库实例不能用 root 用户启动。安装前我会新建专用用户规划好数据目录。groupadd gaussdb useradd -g gaussdb -m -s /bin/bash gaussdb mkdir -p /opt/gaussdb chown -R gaussdb:gaussdb /opt/gaussdb mkdir -p /data/gaussdb chown -R gaussdb:gaussdb /data/gaussdb软件目录放在/opt/gaussdb数据目录单独挂载在/data/gaussdb。不要习惯性把数据放在根目录数据库的在线日志和归档会持续增长和系统文件混合在一个分区很容易把根分区撑爆。若数据目录不是独立分区至少保证所在分区有足够的剩余空间。接下来修改系统资源限制在/etc/security/limits.conf追加gaussdb soft nofile 65535 gaussdb hard nofile 65535 gaussdb soft stack unlimited gaussdb hard stack unlimited gaussdb soft memlock unlimited gaussdb hard memlock unlimited改完重新登录 gaussdb 用户执行ulimit -n验证。这个步骤经常被跳过等数据库在高并发下报too many open files再改就得重启实例不如一开始就配好。内核参数的调整也建议放在安装前。GaussDB 100 对vm.max_map_count有要求默认值在大量并发会话时不够容易触发Cannot allocate memory。我一般这样设置cat /etc/sysctl.conf EOF vm.max_map_count 262144 kernel.shmmax 4294967295 kernel.shmall 1073741824 EOF sysctl -pshmmax和shmall的取值要结合物理内存大小上面两组值在 8GB 内存的服务器上比较合适内存更大可以按比例上调。这些参数必须在数据库启动前生效否则初始化实例时共享内存相关的报错会接踵而至。3. 静默安装与初始化从tar.gz到可用数据库3.1 解压与安装install.py 的常规用法切换到 gaussdb 用户开始解压和安装。安装包放在/opt/gaussdb目录下。su - gaussdb cd /opt/gaussdb tar -zxf GaussDB_100_1.0.1-DATABASE-EULER20SP8-64bit.tar.gz cd GaussDB100-1.0.1解压后的目录名视包内容而定这里以GaussDB100-1.0.1为例。执行安装脚本前先确认数据目录不为空如果目录下有旧实例文件脚本会拒绝覆盖。静默安装的做法是直接传入参数python install.py -U gaussdb -P /opt/gaussdb/GaussDB100-1.0.1 -G /data/gaussdb -D 1888 -T sys -V GaussDB_123参数说明如下-U指定操作系统用户必须是安装目录和数据目录的所有者-P指定软件安装路径-G指定数据目录-D指定实例监听端口-T指定初始数据库用户默认是sys-V设置sys用户的初始密码。这里密码要满足一定强度大小写字母加数字是最低要求。执行过程中install.py会做环境检查、写配置文件、初始化实例数据文件然后尝试启动数据库。整个过程输出到终端的同时也会写日志。看到类似Installation completed successfully的提示说明安装阶段完成。有些版本安装完会自动启动实例有些不会我习惯在安装后手动执行一次状态查询不依赖脚本的提示。3.2 初始化参数修改 zengine.ini 而不是无脑默认安装脚本会基于系统资源生成参数文件路径通常在数据目录下的cfg/zengine.ini。这个文件相当于数据库的启动参数黑匣子很多问题的根源都在这里。我不建议直接改完所有参数再启动先把关键项检查一遍。cat /data/gaussdb/cfg/zengine.ini | grep -E ^(LISTEN|PORT|LOG|DATA_DIR|SHARED)重点关注LISTEN_ADDR和PORT。如果脚本没有拿取到内网 IP可能会把地址写成127.0.0.1这时候必须改成业务网卡地址或0.0.0.0否则远程应用连接不上。另一个关键项是DATA_DIR确认它指向/data/gaussdb避免后续数据文件散落在多个目录。缓冲区参数DATA_BUFFER_SIZE默认值偏保守我在一台 8GB 内存的机器上看到过默认只有 64M跑并发查询很容易成为瓶颈。常见做法是按物理内存的 20% 左右调整单位是字节。比如 8GB 内存写成1073741824即 1GB。这个参数不是越大越好设置过大时系统 swap 占用会增加反而拖慢读写。修改参数后必须重启数据库实例才能生效。我第一次改完没重启直接跑了半天还埋怨优化无效后来才发现参数一直没生效。这个细节值得记下来。3.3 验证安装看进程、端口和日志安装结束后先用三个层面验证实例可用性。第一层是进程ps -ef | grep gaussdb | grep -v grep正常情况下能看到gaussdb主进程并且运行用户是 gaussdb。如果进程消失第一个要看的就是刚才提到的zengine.ini和系统日志。第二层是端口监听ss -lnpt | grep 1888如果监听的是127.0.0.1:1888说明前面的LISTEN_ADDR没有改对。如果完全没有输出检查 firewalld 或脚本日志。第三层是用命令行工具登录。GaussDB 100 自带的客户端叫zsql在安装目录的bin下。cd /opt/gaussdb/GaussDB100-1.0.1/bin ./zsql sys/GaussDB_123127.0.0.1:1888回车后能进入 SQL 提示符说明数据库连接层正常。在 SQL 提示符下执行一条简单查询SELECT version();输出里能看到数据库版本信息。此时再去看日志目录通常位于数据目录的log子目录alert.log记录实例启动和崩溃信息。我一般会在安装后手动重启一次然后对比alert.log里最近的启动时间戳确认日志记录正常这样才能放心把应用接到后面。4. 日常启停与基本运维让数据库稳着跑4.1 启动与停止zctl 命令和它的脾气GaussDB 100 的实例管理命令是zctl同样在安装目录的bin下。启动数据库cd /opt/gaussdb/GaussDB100-1.0.1/bin ./zctl -t start -D /data/gaussdb-D指定数据目录如果目录不对命令会直接报错。启动过程会检查zengine.ini和所有数据文件日志会追加到alert.log。停止数据库./zctl -t stop -D /data/gaussdb注意zctl在执行停止前会检查是否存在活动会话。我在一次联调时直接执行 stop等了五分钟都没有退出以为卡死了。实际上它是在等待一个未提交的事务结束。解决方法是先通过zsql把应用账号的会话终止或者等长事务跑完。不能无脑 kill 掉进程强制杀进程容易导致数据文件不一致恢复起来很麻烦。查看状态./zctl -t status -D /data/gaussdb输出会出现RUNNING或STOPED。状态查询不会自动检查进程是否真的存活如果主进程被外部 kill 掉但状态文件还残留可能看到假 RUNNING 状态所以状态查询后最好再执行一次ps -ef | grep gaussdb交叉验证。4.2 登录与 SQL用 zsql 干实际活zsql是日常维护最常用的客户端连接方式前面已经演示过。登录后第一步建议修改 sys 用户初始密码避免后续所有人都知道默认密码ALTER USER sys IDENTIFIED BY NewPassword_123;密码复杂度要求不低太简单的字符串会被拒绝。生产环境建议关闭 sys 远程登录只允许本机维护业务账号通过独立的数据库账号连接。创建业务账号和授权语法和 Oracle 风格类似CREATE USER app IDENTIFIED BY App123; GRANT CONNECT, RESOURCE TO app;这里要说明的是GaussDB 100 的授权粒度比传统数据库细致具体权限名可以查阅安装包自带的 SQL 参考文档。手头没有文档时可以用HELP命令查看支持的语法。日常巡检我习惯跑一条表空间使用率语句SELECT TABLESPACE_NAME, USED_SPACE, TOTAL_SPACE FROM ADM_TABLESPACES;这个视图在 GaussDB 100 中通常可以看到每个表空间的使用情况。如果表空间使用率超过 80%就要考虑扩展数据文件或者清理历史数据。很多性能问题的根源就是表空间碎片化及时巡检能起到预警作用。应用侧开发同学常问的一个问题是怎么查某张表的字段结构。用下面的 SQL 可以拿到列名和类型SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME DEMO_TABLE;字段名是 Oracle 风格实际使用的视图名可能是ADM_TAB_COLUMNS不同版本略有差异。这条语句能省去翻文档的时间。4.3 备份与恢复给数据库留后悔药备份是运维里最不能省的事。GaussDB 100 的逻辑备份工具通常是exp命令行位置在 bin 目录下。导出一个 schema./exp sys/GaussDB_123127.0.0.1:1888 file/backup/db_$(date %F).dmp ownerappfile参数指定备份文件路径owner指定导出哪个用户下的对象。备份文件是二进制格式文本编辑器打不开保留时间根据业务要求定我一般保留 7 天以上。恢复时使用imp./imp sys/GaussDB_123127.0.0.1:1888 file/backup/db_2026-01-01.dmp ignoreYignoreY表示目标表存在时忽略错误。如果要迁移到另一个用户可以用fromuserapp touserapp2参数。血泪教训是恢复前一定要确认目标库的数据目录空间足够。我有一次导入 10GB 备份恢复到一半磁盘满整个实例直接进入只读态业务全部停摆最后清理了归档日志才恢复过来。从那以后我每次执行导入前先执行df -h确认可用空间。逻辑备份适合中小数据量对于上百 GB 的库逻辑备份的恢复时间会非常长。更推荐的做法是用物理备份直接对数据目录做一致性快照配合归档日志实现时间点恢复。这部分和存储环境强相关但基本思路是一致的备份窗口选择业务低峰备份完成后要定期做恢复演练不能只备份不恢复否则备份可能是个摆设。5. 避坑与常见问题我装 GaussDB 100 翻过的四个跟头5.1 现象安装脚本报 “OS version is not supported”我曾在某个版本的欧拉系统上执行install.py系统版本号是 20.06而安装包文件名只精确到 20SP8。脚本检查系统版本未通过直接退出了。原因在于安装脚本里硬编码了允许的VERSION_ID列表列表里可能只有20.03没有20.06。解决方法是查看安装脚本中负责系统版本匹配的函数找到那个列表把当前系统的小版本号手工加进去。这个方法的风险点在于绕过了兼容性检查但只要你确认内核和 glibc 版本与目标系统差异不大问题不大。有些安装脚本支持跳过系统检测的参数用之前需要确认当前系统确实属于同一个发行版系列。装完以后我建议立刻做一次全量备份这样即便后续出现问题也能恢复到初始状态。5.2 现象数据库启动后端口监听在 127.0.0.1远程连不上安装完成后我用ss -lnpt | grep 1888看到监听地址是127.0.0.1:1888远程客户端全部连接超时。原因就是安装脚本默认绑定回环地址没有自动获取内网 IP。解决办法是修改zengine.ini里的LISTEN_ADDR改成内网 IP 或0.0.0.0然后重启实例。这个坑很容易被误判为防火墙问题我第一次排查时先关了防火墙发现没用最后才注意到监听地址。现在我在安装完第一步就是确认监听地址而不是等业务反馈说连不上。如果你在云环境可能要同时检查安全组规则和系统 firewalld多层网络隔离叠加时排查起来更费时间。5.3 现象zsql 登录提示 “invalid username/password”使用zsql sys/密码127.0.0.1:1888登录时提示密码无效。实际原因不一定是密码错而是初始化时密码复杂度不达标比如只设置了小写字母和数字数据库直接拒绝了。另一种原因是多次输错密码导致 sys 用户被锁。解决方式是通过本地免密方式登录./zsql / as sysdba这条命令在系统用户与数据库启动用户一致时才有效可以绕过密码验证。进入后执行ALTER USER sys IDENTIFIED BY NewPassword_123; ALTER USER sys ACCOUNT UNLOCK;重置完成后要马上提醒所有使用人更新连接串。我曾见过密码已经重置但同事还在用旧密码反复试最后又把用户锁了的情况。5.4 现象/data 分区被写满数据库进入只读模式有次监控报警/data分区使用率到了 95%数据库开始拒绝新的写入操作应用侧报错 “database is in read-only mode”。原因是日志目录下的在线日志和trace.log不断增长而数据库默认的日志清理策略比较保守。解决方法是启用日志轮转在zengine.ini中调整归档保留参数或者用系统的 logrotate 定期清理log目录下的历史文件。我一般把分区告警阈值设置为 80%并写一个凌晨执行的清理脚本保留最近 7 天的归档日志。强制清理日志时要谨慎必须在数据库停止或确认归档已完成的情况下进行否则可能破坏日志链。如果是物理备份需要同时保证归档日志与数据文件的时间点一致。6. 进阶把 GaussDB 100 接到业务系统的一个实战6.1 获取 JDBC 驱动并加载数据库装上只是开始业务系统能连上才是目的。GaussDB 100 提供了标准的 JDBC 驱动驱动包通常是一个 jar 文件放在安装包的driver目录下。把驱动拷贝到项目的lib目录并在构建文件里依赖它。这里用一个简化的 Java 项目。import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class GaussDbDemo { public static void main(String[] args) throws Exception { Class.forName(com.gaussdb.Driver); String url jdbc:gaussdb://127.0.0.1:1888/gaussdb; Connection conn DriverManager.getConnection(url, app, App123); Statement stmt conn.createStatement(); stmt.execute(CREATE TABLE IF NOT EXISTS demo (id int, name varchar(50))); stmt.execute(INSERT INTO demo VALUES (1, gaussdb)); ResultSet rs stmt.executeQuery(SELECT id, name FROM demo); while (rs.next()) { System.out.println(rs.getInt(1) rs.getString(2)); } rs.close(); stmt.close(); conn.close(); } }驱动类名和 URL 前缀以驱动包内的说明为准不同的版本会有差异。Class.forName加载驱动DriverManager.getConnection建立连接随后直接执行 SQL。这段代码是单连接模式生产环境不要这么写要使用连接池。6.2 连接池配置与基本参数生产环境最常见的做法是配置连接池保证数据库连接可以被复用避免每次请求都新建连接。连接池的核心参数有初始连接数、最大连接数、最大等待时间。按照业务并发量调整不要上限设得过大否则数据库端会话数会飙升内存占用跟着失控。连接池配置里数据库 URL 建议加上连接超时和 socket 超时参数。比如jdbc:gaussdb://127.0.0.1:1888/gaussdb?socketTimeout30connectTimeout5连接超时设得短一些能让应用在数据库故障时快速失败。应用侧还要设置空闲连接的回收时间避免被数据库端断开后客户端还拿着失效连接。6.3 快速验证从迁移脚本到日常巡检接入业务后第一件事就是做数据迁移验证。从一个源库通过查询读出表数据再写入 GaussDB 100。过程中最容易出问题的是数据类型映射比如源库的DATE类型在 GaussDB 100 里是否兼容。我一般先建一张结构最简单的表插入一条数据再把应用里的真实查询语句跑一遍确认没有语法兼容问题。从那以后我每上线一套 GaussDB 100 环境都会强制走一遍完整的安装、参数调整、备份恢复和连接池验证流程。这个过程能过滤掉八成以上的隐性故障。希望这篇笔记里的步骤和踩坑记录能帮你把这套数据库顺利跑起来。本文还有配套的精品资源点击获取