openGauss 7.0 Docker 部署 + 跨版本迁移全流程(aarch64)
沉淀范围:镜像资源获取 → Compose 部署 → 环境认知 → 跨版本数据迁移 → 全链路踩坑根因与解决方案
适用场景:arm/aarch64 环境、Docker 单机部署、旧版(RC3)→ 新版(7.0 正式)逻辑迁移、MySQL 兼容 B 模式
价值:后续同类场景直接复用步骤、快速定位踩坑,避免重复排错
一、镜像资源获取(aarch64 架构)
1. 国内可用稳定路径(避开海外仓库超时坑)
表格
| 方案 | 操作命令 / 地址 | 适用场景 |
|---|---|---|
| 华为 SWR 仓库在线拉取(推荐) | docker pull swr.cn-south-1.myhuaweicloud.com/opengauss/arm/opengauss:7.0.0-RC3 |
公网服务器,快速部署 |
| 离线 tar 包下载 | 下载:wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/7.0.0-RC3/openEuler22.03/arm/openGauss-Docker-7.0.0-RC3-aarch64.tar加载:docker load -i 包名.tar |
内网 / 离线环境 |
2. 镜像选型认知
- 7.0.0 正式版:官方无公开预构建 Docker 镜像,仅提供裸机二进制包;需自行构建镜像,测试场景无需追求
- 7.0.0-RC3:功能完整,支持 B 模式 + dolphin 插件,满足 MySQL 迁移、业务测试需求
- 底层系统:官方预构建 Docker 镜像基于 openEuler 22.03 LTS;openEuler 24.03 只有裸机包,无成品 Docker 镜像
- 架构严格匹配:aarch64 镜像无法在 x86 服务器加载,反之亦然
3. 避坑记录
- Docker Hub、quay.io 海外仓库:国内服务器普遍超时、且无对应 7.0 标签,不要浪费时间尝试
- 不要尝试修改镜像底层系统,测试场景优先用官方预构建镜像,减少环境问题
二、Docker Compose 部署与核心环境认知
1. 可复用 compose 模板
services:
openGauss7:
image: opengauss:7.0.0
container_name: openGauss7
restart: always
privileged: true
shm_size: 1g
ports:
- "5432:5432"
volumes:
- /zkhome/openGauss-Docker/openGauss7:/var/lib/opengauss # 数据持久化
- /zkhome/all_backup/og_dump:/backup:ro # 备份目录只读挂载
- /etc/localtime:/etc/localtime:ro
environment:
- GS_USERNAME=root
- GS_PASSWORD=ZongKe@888
networks:
- zk_net
2. 核心认知(高频混淆点)
GS_USERNAME / GS_PASSWORD 本质
- 作用 :容器首次初始化空数据库实例 时,自动创建 1 个数据库普通账号,同时设置超级管理员
omm的数据库密码 - 生效边界 :仅全新空数据目录第一次启动生效;实例初始化完成后,修改环境变量重启容器,不会新增 / 修改数据库用户
- 误区纠正 :
- 不是容器操作系统账号密码
- 不能批量创建业务账号
- 不会同步到已存在的数据库实例
- 本次验证:配置
GS_USERNAME=root,初始化后数据库内自动创建root账号(sysadmin 角色)
容器启动告警过滤(无需处理)
表格
| 告警内容 | 原因 | 影响 |
|---|---|---|
| could not create any HA TCP/IP sockets | 单机容器无集群高可用 | 无 |
| libubsm_sdk.so 等库缺失 | 鲲鹏硬件加速库,非必需 | 无 |
| Failed to obtain $GAUSSLOG | 日志路径环境变量未配置 | 无 |
| gscgroup_omm.cfg 不存在 | 容器内无需 cgroup 资源管控 | 无 |
三、跨版本数据迁移全流程(旧 RC3 → 新 7.0 正式版)
迁移方案:gs_dump 逻辑备份 → gs_restore 导入
适用:10G 以内中小库,跨版本兼容性好,风险可控,回滚简单
1. 备份文件挂载与权限处理
方案:宿主机备份目录只读挂载
- 配置:
/zkhome/all_backup/og_dump:/backup:ro - 核心坑:挂载 ≠ 授权,文件权限独立
-
现象:
omm用户执行gs_restore报Permission denied -
根因:宿主机 dump 文件属主 root、权限 600(仅 root 可读);挂载只是目录映射,文件权限原样带入容器,
omm无读取权限 -
误区:挂载到
/home/omm(omm 家目录)也无法解决,目录权限 ≠ 目录内文件权限 -
解决方案二选一:
- 【长期推荐】宿主机端执行
chmod 644 备份文件,开放其他用户读权限,保留:ro挂载的安全性 - 【本次迁移用】容器内 root 账号将备份拷贝到
/home/omm,修改副本属主为omm,不改动原始备份
root复制dump到omm家目录(必须用容器内的 root 用户来复制文件)
cp /backup/backup_logistics_zkch_opengauss_20261014_0200.dump /home/omm/
修改副本文件属主给omm
chown omm:omm /home/omm/backup_logistics_zkch_opengauss_20261014_0200.dump
- 【长期推荐】宿主机端执行
-
验证(root 下校验)
ls -lh /home/omm/
看到 dump 文件属主是 omm:omm 就成功。
2. 目标数据库创建
踩坑:zh_CN.utf8 字符集报错
- 现象:建库指定
LC_COLLATE='zh_CN.utf8'报invalid locale name - 根因:openEuler 容器镜像默认仅带
C.utf8、en_US.utf8,无中文 locale 包 - 方案:使用
en_US.utf8,中文存储完全不受影响,仅文本排序规则为英文,业务无感知
建库标准 SQL(MySQL 兼容 B 模式)
进入 opengauss7 容器,切换 omm,预创建用户和库
docker exec -it opengauss7 bash
su - omm
# 登录postgres库
gsql -U omm -d postgres
-- 创建业务账号
CREATE USER logistics WITH PASSWORD 'ZongKe@888';
GRANT ALL PRIVILEGES TO logistics;
-- 创建目标库,B模式必须在建库时指定,后续不可修改
CREATE DATABASE logistics_zkch_opengauss
ENCODING 'UTF8'
LC_COLLATE 'en_US.utf8'
LC_CTYPE 'en_US.utf8'
TEMPLATE template0
DBCOMPATIBILITY = 'B';
-- 查看所有数据库
\l
-- 执行完`\q`退出 gsql
3. 数据导入执行
常用可选参数
-
-c:导入前先删除库内已有对象(测试环境重置使用,生产割接不要随便加) -
-e:遇到报错直接终止,方便排查问题 -
-v:verbose 详细日志输出,推荐加上看进度omm 用户下执行,输出详细日志
gs_restore -U omm -d logistics_zkch_opengauss -v /home/omm/备份文件.dump > /tmp/restore.log 2>&1
导入完成后可以查看日志:
cat /tmp/restore.log
导入结果校验
- 日志校验 :
grep -i error /tmp/restore.log
注意:字段注释文本中包含
error单词不是报错,是表注释内容
- 成功标志 :日志无 ERROR 级报错、末尾出现
Finished restore - 库内校验:
sql
-- 1. 查看所有业务表清单
\dt
-- 2. 统计表总数量,和旧库对比
SELECT count(*) FROM pg_tables WHERE schemaname='public';
-- 3. 抽样核对核心业务表行数(替换为你的实际表名)
SELECT count(*) FROM eqp_device;
SELECT count(*) FROM base_user;
-- 4. 确认兼容模式生效
show sql_compatibility;
四、核心踩坑沉淀(同类问题快速定位)
表格
| 问题现象 | 根因本质 | 标准解决方案 |
|---|---|---|
| docker pull 海外仓库超时 / 镜像不存在 | 国内网络限制 + 官方镜像未发布到海外仓库 | 改用华为 SWR 国内仓库 / 离线 tar 包 |
| 修改 GS_USERNAME 后数据库没新增用户 | 环境变量仅数据库首次初始化生效 | 手动执行 CREATE USER 创建业务账号 |
| 挂载备份后 omm 读不了文件,Permission denied | 挂载只是目录映射,文件权限原样继承;目录权限≠文件权限 | 宿主机 chmod 644 或 容器 root 拷贝文件并改属主 |
| 建库指定 zh_CN.utf8 报错 | 容器系统无中文 locale 包 | 改用 en_US.utf8,不影响中文存储 |
| gsql 粘贴 SQL 报空行语法错误 | 粘贴带入多余换行符,解析失败 | 短 SQL 手动输入;或输入 \r 重置当前语句 |
Navicat 迁移报 selected_dependencies 递归 CTE 类型错误 |
Navicat 内部依赖分析 SQL 与 openGauss 类型不兼容 | 取消迁移外键 / 视图,只迁表结构 + 数据,后续手动建外键 |
| A 模式下字段内联 COMMENT 报错 | A 模式不支持 MySQL 风格行内注释 | 改用 COMMENT ON COLUMN 独立语句;或使用 B 模式库 |
五、可复用命令速查
容器操作
# 直接在宿主机执行容器内 omm 用户命令
docker exec -it 容器名 su - omm -c "gsql -V"
# 进入容器交互
docker exec -it 容器名 bash
su - omm # 切换数据库管理员账号
数据库常用操作
\du -- 查看所有数据库用户
\l -- 查看所有数据库
\dt -- 查看当前库所有表
show sql_compatibility; -- 查看兼容模式
迁移专用
# 全库导出自定义格式 dump
gs_dump -U omm -d 源库名 -F c -f 导出文件路径
# 导入 dump 并输出日志
gs_restore -U omm -d 目标库 -v dump文件路径 > 日志路径 2>&1
# 过滤导入错误
grep -i error 日志文件
六、方法论沉淀
- 迁移类工作前置验证优先:先确认版本兼容性、字符集、兼容模式,再全量导入,避免大规模返工
- 权限问题分层排查:区分「挂载层面权限」「文件系统权限」「数据库权限」三层,逐层定位,不要混淆概念
- 环境变量确认生效时机:所有配置先明确是「初始化生效」还是「运行时生效」,不要默认修改就立即生效
- 官方镜像能力有边界:复杂初始化(多业务账号、预制库表)优先用 SQL 脚本实现,不要依赖镜像环境变量
后续遇到 openGauss Docker 部署、数据迁移、权限类问题,可直接对照本沉淀快速定位解决。