ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GaussDB 100 欧拉20 SP8 安装部署与主备容灾实战解析

GaussDB 100 欧拉20 SP8 安装部署与主备容灾实战解析

简介:华为云GaussDB 100 1.0.1数据库安装部署资源包,聚焦EulerOS 20 SP8 64位环境,面向需要搭建分布式数据库的DBA、运维人员和开发者。GaussDB是华为自研的企业级分布式数据库,具备分布式扩展、高可用与强一致事务等能力,该版本适合在云环境下快速完成基础部署与功能验证。资源共6个文件,以4个Python自动化脚本为主,另含GaussDB RUN安装包与SHA256校验文件,整体大小7.39MB;脚本覆盖自动化安装、平滑升级、公共函数封装和SSH免密配置,配合校验文件可确保包体完整,省去手动下载与依赖配置的繁琐步骤。利用这套工具,用户可从环境准备、部署安装到后续升级形成完整闭环,显著降低GaussDB 100的上手与运维成本,适合在测试环境先行验证再切换生产。已有1310人学习下载,对于希望低成本搭建实验环境、学习华为分布式数据库落地流程的开发者来说,是一份轻量实用的离线部署参考,尤其适合内网或网络受限场景。

1. GaussDB 100 安装包实战:在欧拉 20 SP8 上拆包、建库、搭主备

如果你手里正好有一台欧拉 20 SP8 的 64 位服务器,又需要一个能扛住在线交易类业务的数据库,这个 GaussDB 100 1.0.1 安装包就是为这类场景准备的。它解决的是在自主可控环境下数据落盘、容灾和并发控制的问题:单机部署轻、主备同步有现成通道、语法和运维习惯贴近 Oracle 那套,老 DBA 迁移成本低。适合正在评估国产数据库的团队、需要内网离线部署的项目,以及想完整跑一遍“安装—建库—备份—主备切换”流程的开发者。下面按实际部署顺序展开:先装通单机,再搭主备,最后把日常巡检和踩过的坑一起讲掉。

2. GaussDB 100 单机部署:解包、环境检查与 zsql 建库

2.1 解包前的三个确认:架构、目录规划、运行用户

动手之前先看包名:GaussDB_100_1.0.1-DATABASE-EULER20SP8-64bit.tar.gz。命名拆开是版本 1.0.1、目标系统欧拉 20 SP8、64 位架构。第一件事就是确认你的系统跟这个包匹配,uname -m出 x86_64 只是第一步,还要看发行版版本。

目录规划我会按一套约定来写,后端维护会省心很多:

mkdir -p /data/gaussdb groupadd dba useradd -g dba -d /home/gaussdb -s /bin/bash gaussdb tar -zxvf GaussDB_100_1.0.1-DATABASE-EULER20SP8-64bit.tar.gz -C /data/gaussdb chown -R gaussdb:dba /data/gaussdb

逻辑说明:软件目录和数据目录分开是最常见的做法,/data/gaussdb只是安装根目录,实际数据文件在它的子目录下。专用运行用户是为了隔离权限,数据库进程绝不能拿 root 跑,这是所有现场部署的底线。

参数说明:-C指定解压目标;groupadd dba这一步不是必须叫 dba,但 GaussDB 100 的很多初始化脚本默认找 dba 用户组,保持一致最省事。如果你服务器上已经有 dba 组,跳过 groupadd 直接建用户即可。

解压后再看一层,包内通常有 install 相关脚本和配套文档目录。我的习惯是先把包内自带的安装说明打开扫一遍,因为这个版本的脚本入口在不同小版本里有差异,可能是 Python 也可能是 Perl,以包内实际脚本为准。这不算偷懒,是避免把 1.0.1 的脚本路径记错然后做无用功。

2.2 环境准备与初始化:别急着敲安装命令

环境检查比安装本身更容易翻车。常见问题集中在三块:SELinux、防火墙、内核参数。

setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config sysctl -w vm.swappiness=10 sysctl -w vm.overcommit_memory=0 sysctl -w fs.file-max=6815744 firewall-cmd --permanent --add-port=1888/tcp firewall-cmd --reload

逻辑说明:SELinux 不关的话,数据库进程访问数据文件经常被拦,日志里报权限 denied,排查起来非常耗时,不如部署期直接关掉。vm.swappiness调到 10 是避免系统过早把数据库内存页换到磁盘,fs.file-max则跟连接数上限相关。

参数说明:1888 是 GaussDB 100 默认监听端口,如果你打算用其他端口,比如 3888,那后续所有连接串和配置都得跟着改,建议一开始就定死。防火墙没有图形界面时,用ss -lntp验证端口是否真正监听,比对着配置猜靠谱得多。

环境就绪后执行初始化。常见做法是切换到 gaussdb 用户,用包内安装脚本指定单机模式:

su - gaussdb cd /data/gaussdb python install.py --mode=single \ --data_dir=/data/gaussdb/data \ --log_dir=/data/gaussdb/log \ --charset=UTF8 \ --listen_ip=0.0.0.0

逻辑说明:--mode=single明确当前是单机部署,后续要转主备再改配置。--data_dir是数据文件根目录,--log_dir是运行日志目录,两个目录必须分开,否则日志写满会把数据盘搞爆。

参数说明:--charset=UTF8在中文环境下建议直接写死,否则默认字符集可能在导入含中文的数据时出现乱码。--listen_ip=0.0.0.0表示监听所有网卡,如果只允许本机访问,改成 127.0.0.1;后面搭主备时,备机要通过网络连主机,这里必须监听业务网卡地址。

初始化过程中会要求设置 SYS 用户密码。这条密码别随便给,它相当于数据库的 root。密码复杂度策略在 GaussDB 100 里默认要求大小写加数字,长度不低于 8 位,现场如果装到一半被密码策略卡住,按提示加上特殊字符即可。

2.3 启动、连接、建库:验证安装结果的三个动作

安装脚本跑完不代表能用,要看到 zsql 能敲出 SQL 才算数。

cd /data/gaussdb/bin zctl.py -t start zsql sys/密码@127.0.0.1:1888

逻辑说明:zctl.py -t start是启动数据库实例的控制命令,-t指定操作类型。zsql 是 GaussDB 100 自带的命令行客户端,语法风格跟 Oracle 的 sqlplus 很像,连上以后看到 SQL 提示符即安装成功。

参数说明:连接串格式是用户名/密码@IP:端口。第一次登录 SYS 用户建议顺手验证一下当前版本信息,用SELECT VERSION FROM V$INSTANCE;这种动态视图查询,确认跑起来的是 1.0.1,防止现场有多套环境连错实例。

接下来按业务规划建表空间和用户。GaussDB 100 默认提供 SYSTEM、USER、TEMP、UNDO 等表空间,但业务数据不要直接塞 USER,单独建一个业务表空间更清晰。

CREATE TABLESPACE TBS_APP DATAFILE '/data/gaussdb/data/app01.dbf' SIZE 8G AUTOEXTEND ON NEXT 256M MAXSIZE 32G; CREATE USER app_user IDENTIFIED BY 'App@12345' DEFAULT TABLESPACE TBS_APP; GRANT CONNECT, RESOURCE TO app_user;

逻辑说明:CREATE TABLESPACE时指定数据文件路径、初始大小、自动扩展步长和上限。把数据文件放到独立表空间,后续做表空间级备份、迁移都能单独操作,不会牵一发动全身。

参数说明:AUTOEXTEND ON NEXT 256M表示每次自动扩 256M,扩展太频繁会有 IO 抖动,一次性给足 8G 初始空间更适合业务稳定的系统。MAXSIZE 32G是上限,防止某个表空间无限膨胀把磁盘写满。这里的数据文件路径要和--data_dir保持一致,不然目录权限会出问题。

3. 主备容灾:ZSYN 日志同步、参数设计与切换决策

3.1 为什么选主备而不是共享存储

单机部署只解决“能用”的问题,现场环境一旦要求高可用,第一反应往往是共享存储。但 GaussDB 100 在中小规模场景下,主备架构更务实:不需要额外采购存储设备,备机就是一台普通服务器,通过 ZSYN 进程把主机的 redo 日志拉到备机并应用,备机始终维护一份跟主机差距很小的数据映像。

这个方案的取舍点在于:RPO 取决于同步策略,同步模式下主机提交事务前要等备机确认,数据零丢失;异步模式下主机不用等,性能好但可能丢最后一批日志。如果你的业务是订单、支付这类不能丢数据的,选同步;如果是日志、报表类,异步更合适。

我一般把主备部署拆成两台机器,角色写死在配置文件里,避免脑裂时两边都以为自己是主机。备机同时可以承担只读查询,把一部分报表查询放到备机跑,能明显减轻主机压力,但要注意别跑太重的分析任务,否则日志应用会滞后。

3.2 主备配置文件与 ZSYN 相关参数

先看主机的配置文件/data/gaussdb/cfg/gaussdb.conf里几个关键项:

ROLE=PRIMARY PORT=1888 REPL_PORT=1889 LOG_ARCHIVE=ON ARCHIVE_DEST_1='LOCATION=/data/archive'

逻辑说明:ROLE决定实例是主还是备,两台机器的配置差别主要就在这里。REPL_PORT是主备之间同步日志专用的端口,不能跟PORT重复。LOG_ARCHIVE=ON打开归档模式,主备同步依赖归档日志,不开归档,备机是追不上主机的。

参数说明:ARCHIVE_DEST_1指定归档目录,建议归档目录和数据目录分盘。现场见过把归档放同盘把数据盘塞满的案例,归档日志增长速度往往比预想快,尤其是有大批量更新任务时。

备机的配置基本复制主机,只需要改两处:

ROLE=STANDBY PORT=1888 REPL_PORT=1889

逻辑说明:备机端口建议跟主机保持一致,这样应用切换时连接串不用改。真正搭建时,先跑一遍全量备份,然后把备份恢复到备机,再启动备机进入恢复模式,ZSYN 进程会自动从主机拉取归档日志并保持同步。

搭建步骤我习惯写成下面这样,避免遗漏:

# 在主机执行全量备份 zsql sys/密码@127.0.0.1:1888 <<EOF BACKUP DATABASE TO '/backup/full_20250101.dmp'; EOF # 把备份文件传到备机 scp /backup/full_20250101.dmp gaussdb@备机IP:/backup/ # 在备机执行恢复 zsql sys/密码@127.0.0.1:1888 <<EOF RESTORE DATABASE FROM '/backup/full_20250101.dmp'; RECOVER DATABASE; EOF

逻辑说明:BACKUP DATABASE TO生成物理备份,包含数据文件和日志信息。RESTORE把备份文件还原到备机数据目录,RECOVER让备机进入可接收归档日志的状态。整个过程需要在备机实例启动前完成,顺序反了会报数据文件不一致。

参数说明:备份文件路径要选在容量充足的位置,全量备份文件大小通常接近实际数据量。如果数据量上百 G,建议直接走存储层面的拷贝或者分段备份,不要用单一大文件传输,容易中断且不好续传。

主备启动后,用动态视图确认同步状态:

SELECT NAME, OPEN_MODE, ROLE FROM V$DATABASE;

逻辑说明:OPEN_MODE显示主备机各自的状态,主机应该是 PRIMARY,备机是 STANDBY。如果备机一直处于 MOUNT 或 RECOVER 状态,说明日志应用没跟上,需要检查 ZSYN 进程是否存活。

3.3 主备切换:什么时候该人工干预

主备切换有两条路径:一是主机故障触发自动切换,二是计划内维护手动切换。自动切换依赖集群管理组件的探活机制,但现场很多部署只用双机配置,没有额外集群软件,这时人工切换就是唯一手段。

人工切换的操作顺序是固定的:

# 备机执行,把备机提升为主 zsql sys/密码@127.0.0.1:1888 <<EOF ALTER DATABASE ACTIVATE STANDBY; EOF # 原主机恢复后,降级为新备机 zsql sys/密码@127.0.0.1:1888 <<EOF ALTER DATABASE CONVERT TO STANDBY; EOF

逻辑说明:ACTIVATE STANDBY让备机接管成为新主机,这一步执行前必须确认原主机已经无法提供服务,否则两台机器同时写数据,必然出现数据分叉。CONVERT TO STANDBY是把恢复后的原主机变成新备机,重新接回同步链路。

参数说明:做切换决策前,先看备机日志应用延迟。延迟几分钟以内可以切,延迟超过半小时就要评估丢失的数据量是否可接受。生产环境我会设定一个硬阈值:同步模式下延迟超过 30 秒就不允许切换,直接走数据找回流程。

4. 备份恢复与日常巡检:不能只靠 tar 包

4.1 备份策略:全量、增量和归档的配合

很多新手拿到安装包,以为数据文件在就行,这是最危险的想法。数据库的物理文件处于运行状态时不能直接拷贝,必须通过备份接口生成一致性的备份集。GaussDB 100 的常规备份思路是:每周全量、每天增量、实时归档。

-- 全量备份 BACKUP DATABASE TO '/backup/full_20250108.dmp'; -- 增量备份 BACKUP DATABASE INCREMENTAL TO '/backup/incr_20250109.dmp'; -- 查询备份集 LIST BACKUPS;

逻辑说明:全量备份是恢复的基础,增量备份只记录变化的数据块,恢复时按“全量 + 最近增量 + 归档日志”的顺序回放,可以把数据库恢复到任意时间点。LIST BACKUPS查看现有备份集清单,定期清理过期备份,避免备份目录被撑爆。

参数说明:备份语句里没有指定压缩参数时,备份文件是不压缩的,几百 G 的业务库备份出来就是几百 G。磁盘预算按数据量的 2 到 3 倍规划比较稳。增量备份的频率取决于业务变更量,日增量超过全量的 20% 时,增量意义就不大了,直接考虑加大全量频率。

恢复流程跟备份对应,按顺序执行:

RESTORE DATABASE FROM '/backup/full_20250108.dmp'; RECOVER DATABASE;

逻辑说明:先恢复全量备份,再用归档日志把数据推进到故障前的最新状态。如果恢复了增量备份,RECOVER 时数据库会自动读取归档目录里的日志并应用。恢复完成后手动执行一次SELECT COUNT(*) FROM 核心表;做抽查,确认数据量正确再开放业务。

4.2 巡检 SQL:十项检查覆盖日常健康

日常巡检不用搞得多复杂,固定跑下面几条 SQL,能在三分钟内把数据库基本状态摸清楚。

-- 1. 实例状态 SELECT NAME, OPEN_MODE, ROLE FROM V$DATABASE; -- 2. 当前活跃会话 SELECT SID, STATUS, USERNAME, SQL_ID FROM V$SESSION WHERE STATUS = 'ACTIVE'; -- 3. 核心参数当前值 SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME IN ('MAX_CONNECTIONS', 'DATA_BUFFER_SIZE'); -- 4. 表空间使用率 SELECT TABLESPACE_NAME, FILE_SIZE, FILE_SIZE - FREE_SIZE AS USED FROM DBA_DATA_FILES;

逻辑说明:前两条负责“数据库活着没有”,第三条确认连接数和内存配置是否被意外改动,第四条看磁盘空间水位。表空间使用率超过 85% 就要预警,特别是 UNDO 和 TEMP 表空间,涨起来很突然。

参数说明:MAX_CONNECTIONS的值是否够用,不能只看数字,要结合活跃会话数量判断。DATA_BUFFER_SIZE是内存缓存大小,设太小会频繁读写磁盘,现场如果业务响应慢,优先看这个参数而不是先去调 SQL。

巡检不只看 SQL 结果,还要看系统层的磁盘空间:

df -h /data/gaussdb

逻辑说明:数据库盘写满的前兆往往是归档目录先爆,然后实例直接 hang 住。每天定时跑一遍df -h,比任何监控系统都直接。

4.3 日志文件:从启动日志和告警日志判断状态

GaussDB 100 运行日志在/data/gaussdb/log下,常见的文件是运行日志和告警日志。实例起不来、连接异常、备份失败,第一反应都应该是看日志而不是改参数。

tail -n 100 /data/gaussdb/log/alert.log

逻辑说明:告警日志记录实例启动、关闭、错误、主备切换等关键事件,格式是时间戳加描述。排查问题时按时间点先定位告警日志,再翻运行日志里对应的报错堆栈,比漫无目的翻整个目录高效很多。

参数说明:日志文件会持续增长,日志轮转按大小或日期配置。默认如果没有开启轮转策略,建议定期清理超过 30 天的日志,否则日志目录会悄悄涨到几十 G,到时候再清就晚了。

5. 避坑记录:安装与主备现场的五个常见问题(现象 → 原因 → 解决)

5.1 安装脚本报 /dev/shm 空间不足

现象:执行初始化时提示 shared memory 不足,实例启动后自动退出。

原因:GaussDB 100 的内存相关参数会占用共享内存,而/dev/shm默认只有物理内存的一半,数据库初始化时创建的共享内存段超出了限制。

解决:调大/dev/shm,在/etc/fstab里修改挂载参数,然后重新挂载。

mount -o remount,size=16G /dev/shm

参数说明:按物理内存的 1/4 到 1/2 设置,16G 是常见起步值。改完务必执行df -h /dev/shm确认生效,再重新跑初始化脚本。

5.2 zsql 连接一直超时,1888 端口不通

现象:zsql sys/pwd@IP:1888卡住很久然后报网络超时。

原因:最常见是数据库监听只绑定了 127.0.0.1,或者防火墙没放行 1888 端口。还有一次现场是服务器上有多个网卡,应用走业务网卡,数据库却监听在管理网卡上。

解决:先用ss -lntp | grep 1888看监听地址,再用curl或telnet从应用端测端口连通性。确认是监听问题就改配置:

# 修改监听 IP ALTER SYSTEM SET LISTEN_IP = '0.0.0.0' SCOPE = BOTH;

逻辑说明:SCOPE = BOTH表示参数同时写入内存和配置文件,重启实例也生效。如果不加 SCOPE,修改只对当前会话有效,重启后打回原形。

5.3 主备同步延迟持续上涨,备机永远追不上

现象:备机V$DATABASE里的日志应用位点跟主机差距越来越大,数据落地到备机延迟几十分钟甚至几小时。

原因:备机上跑了重量级报表查询,日志应用进程分不到足够的 IO 和 CPU;或者主机归档目录所在的磁盘空间不足,归档日志被删了,备机断链后只能重新全量同步。

解决:把备机的报表业务限流或迁移走,确保日志应用进程优先;同时给归档目录扩容,并配置归档删除策略,至少保留 24 小时的归档日志作为缓冲。

5.4 主备恢复时报数据文件路径不一致

现象:在备机执行RESTORE DATABASE时报数据文件目录跟备份记录不匹配。

原因:备机的数据目录路径跟主机不一致。备份文件里记录的是主机上绝对路径,备机环境如果目录布局不同,恢复时校验就失败。

解决:保持两台机器数据目录完全一致,我在搭建文档里会固定写成/data/gaussdb/data,不允许定制路径。已经出问题的话,把备机数据目录调整为主机同样的路径,重新执行恢复,不要用软链接糊弄,恢复过程不认这个。

5.5 实例启动后文件权限报错

现象:启动日志里出现大量 permission denied,实例一直无法进入 OPEN 状态。

原因:初始化时用 root 执行了解压或建目录,导致数据文件属主不是 gaussdb 用户;或者 SELinux 没有真正关闭。

解决:递归改属主,确认 SELinux 状态后重新启动。

chown -R gaussdb:dba /data/gaussdb getenforce

注意:setenforce 0只是临时关闭,重启后会恢复 enforcing。必须改/etc/selinux/config里的配置,否则下次重启同样的问题再冒出来。

6. 加一个自动化巡检脚本:跑一遍再下结论

手动巡检每次要敲好几条命令,我的习惯是把它们封成一个脚本,固定在每天的业务低峰期执行一次,异常直接写进告警文件。

#!/bin/bash # 简易巡检脚本,适用于 GaussDB 100 单机和主备场景 DB_USER="sys" DB_PWD="YourPassword" DB_HOST="127.0.0.1:1888" ALERT_LOG="/data/gaussdb/log/alert.log" RESULT_LOG="/data/check_result.log" # 实例状态检查 INST_STATUS=$(zsql $DB_USER/$DB_PWD@$DB_HOST -c \ "SELECT STATUS FROM V$INSTANCE;" | grep -i open) if [ -z "$INST_STATUS" ]; then echo "$(date) [ERROR] instance is not open" >> $RESULT_LOG exit 1 fi # 磁盘空间检查 DISK_USAGE=$(df -h /data/gaussdb | awk 'NR==2 {print $5}' | sed 's/%//') if [ "$DISK_USAGE" -gt 85 ]; then echo "$(date) [WARN] disk usage ${DISK_USAGE}%" >> $RESULT_LOG fi # 告警日志检查最近N条 RECENT_ERR=$(grep -i "error\|failed" $ALERT_LOG | tail -n 20) if [ -n "$RECENT_ERR" ]; then echo "$(date) [WARN] recent error in alert log" >> $RESULT_LOG fi echo "$(date) [INFO] health check done" >> $RESULT_LOG

逻辑说明:脚本第一部分检查实例状态,第二部分检查磁盘水位,第三部分扫告警日志里的错误关键字。三个检查覆盖了数据库最核心的存活、空间、异常三个维度,足够日常值班使用。

脚本放到 crontab 里定时跑:

0 8 * * * /home/gaussdb/check_gaussdb.sh

每次看check_result.log里有没有新增的[ERROR]或[WARN]行就行。这个脚本的定位是兜底,不替代真正的监控系统,但胜在轻量、不依赖外部组件,任何一台部署了 GaussDB 100 的机器都能直接用。把数据库密码写进脚本有风险,现场如果对安全要求高,建议改成从环境变量读取,或使用加密的连接配置。

相信我,比起事到临头到处翻日志,每天扫一眼这个几行输出,心里会踏实得多。从那以后我每次部署 GaussDB 100,装完第一件事就是把这个脚本配上,再手动跑一遍SELECT NAME, OPEN_MODE, ROLE FROM V$DATABASE;确认主备角色正确,然后才敢说环境交付了。希望这些步骤和踩坑记录能帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进