openGauss 7.0 Docker 部署 + 跨版本迁移全流程(aarch64)

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 家目录)也无法解决,目录权限 ≠ 目录内文件权限

    • 解决方案二选一:

      1. 【长期推荐】宿主机端执行 chmod 644 备份文件,开放其他用户读权限,保留 :ro 挂载的安全性
      2. 【本次迁移用】容器内 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

导入结果校验
  1. 日志校验 :grep -i error /tmp/restore.log

注意:字段注释文本中包含 error 单词不是报错,是表注释内容

  1. 成功标志 :日志无 ERROR 级报错、末尾出现 Finished restore
  2. 库内校验:
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 日志文件

六、方法论沉淀

  1. 迁移类工作前置验证优先:先确认版本兼容性、字符集、兼容模式,再全量导入,避免大规模返工
  2. 权限问题分层排查:区分「挂载层面权限」「文件系统权限」「数据库权限」三层,逐层定位,不要混淆概念
  3. 环境变量确认生效时机:所有配置先明确是「初始化生效」还是「运行时生效」,不要默认修改就立即生效
  4. 官方镜像能力有边界:复杂初始化(多业务账号、预制库表)优先用 SQL 脚本实现,不要依赖镜像环境变量

后续遇到 openGauss Docker 部署、数据迁移、权限类问题,可直接对照本沉淀快速定位解决。

相关推荐
下辈子不要当码农1 小时前
Linux驱动(2)
linux·运维·单片机
筑梦之路1 小时前
Alibaba Cloud Linux 4 制作 Ansible RPM包实践(离线可复用)——筑梦之路
linux·运维·ansible
无垠的广袤1 小时前
【ED-CLAWBOX】智能家居枢纽
linux·物联网·docker·智能家居·树莓派·aiot·home assistant
IT利刃出鞘1 小时前
Linux权限--adduser和useradd的区别
linux·运维·服务器
Ruiery1 小时前
Linux 6.6内核内存管理深度解析(五):page cache(页缓存)— 读缓存在内存、写延迟回写
linux·运维·服务器·缓存
研发小能1 小时前
金融行业 DevOps 流水线解决方案:从环境准备到发布门禁的全链路提效
运维·金融·devops
海宇大数据1 小时前
零信任架构实战:基于海宇企业综合风险报告构建自动化供应链保理对公尽调网关
运维·人工智能·架构·自动化
LMT_Lanmantech1 小时前
LS-DYNA许可降本增效:不增购,也能让现有Token发挥更大价值
运维·软件工程·软件许可证·ladyna
ZeroNews内网穿透1 小时前
内网穿透公网暴露防护:边缘网关 IP 黑白名单运维实践
运维·网络协议·tcp/ip·内网穿透·api安全·企业网络安全·运维实践