注册
达梦 DTS 数据迁移排障实录(失败记录)
技术分享/ 文章详情 /

达梦 DTS 数据迁移排障实录(失败记录)

何处惹尘埃 2026/07/31 189 0 0

环境

  • 管理机:macOS(用于 SSH 连接和 X11 转发)
  • 目标服务器:CentOS 7(虚拟机,IP 10.36.41.11,SSH 端口 5264)
  • 达梦数据库版本:V8(开发版)
  • 已安装 DEM(达梦企业管理器),后台库端口 5237
  • 已有源端实例:端口 5238,含测试数据(TEST.EMPLOYEE 表,3 条记录)

一、任务目标

学习并完成达梦数据库间的静态数据迁移(DM → DM),并记录过程中遇到的所有问题及处理方法。


二、初次尝试:使用 DEM 的迁移模块

2.1 环境准备

  • DEM 已部署,通过 SSH 隧道访问:
    ssh -p 5264 -L 8081:127.0.0.1:8080 root@10.36.41.11
    浏览器访问 http://127.0.0.1:8081/dem,默认账号 admin/888888。
  • 源端数据库:127.0.0.1:5238,SYSDBA/Dameng123,已有 TEST.EMPLOYEE 表。
  • 目标端数据库:127.0.0.1:5237(即 DEM 后台库),空库。

如下图所示:截屏20260727 14.58.31.png截屏20260727 14.59.05.png截屏20260727 15.00.15.png截屏20260727 15.00.36.png截屏20260727 15.06.25.png
截屏20260727 14.57.54.png
截屏20260727 14.58.00.png
截屏20260727 14.58.04.png

2.2 DEM 迁移配置过程

  1. 进入“迁移”模块,点击“新建迁移”,命名为 test
  2. 配置数据源:
    • 源端:主机 127.0.0.1,端口 5238,用户 SYSDBA,密码 Dameng123,测试连接 成功
    • 目标端:主机 127.0.0.1,端口 5237,用户 SYSDBA,密码 Dameng123,测试连接 成功
  3. 迁移选项:保持默认(出错后继续、使用默认映射)。
  4. 指定模式:勾选 TEST 模式,并勾选“创建模式”和“表”选项。
  5. 指定对象:确认选中 EMPLOYEE 表。
  6. 进入“执行方式”步骤:界面显示“远程执行”,代理列表为空,无“本地执行”选项

具体操作如下图所示:
截屏20260727 14.58.31.png截屏20260727 14.59.05.png截屏20260727 15.00.15.png截屏20260727 15.00.36.png截屏20260727 15.06.25.png

2.3 问题与解决尝试

  • 问题:无法选择“本地执行”,必须添加 DTS 代理。
  • 尝试添加代理
    • 点击“添加”,填写主机 127.0.0.1,端口 6364(默认),校验 KEY 999999,执行端口和启动参数留空。
    • 点击“测试”,返回“连接失败”,但可继续添加。
    • 添加后仍无法执行迁移。
  • 排查代理连接失败
    • 检查 dmagent 是否运行:ps -ef | grep dmagent,发现未启动。
    • 尝试启动 dmagent(以 dmdba 用户):
      su - dmdba cd /home/dmdba/dmdbms/tool/dmagent ./start.sh agent.ini
      报错:Agent service key invalid, agent start fail, use INSTALL_SERVICE_KEY to install service key first!
    • 安装 service key:
      ./start.sh INSTALL_SERVICE_KEY 999999
      生成 service.key 文件。
    • 再次启动 dmagent:成功,进程出现,端口 6364 监听(ss -tlnp | grep 6364)。
    • 重新在 DEM 中添加代理,测试连接 成功
  • 但 DEM 迁移仍无法继续:选择该代理后,点击“执行”却无响应,或提示“执行失败”。原因可能为 DEM 版本与 dmagent 版本不匹配,或迁移任务需要本地执行但代理为远程模式。

结论:DEM 迁移模块在无可用本地执行方式时,即使配置了远程代理也可能因权限或版本问题无法使用。决定放弃 DEM 迁移,转向独立 DTS 工具。


三、第二次尝试:Linux 下通过 X11 转发启动 DTS

3.1 前提

  • 服务器为无图形界面的 CentOS 7,需通过 Mac 的 XQuartz 进行 X11 转发。

3.2 配置 Mac 端 XQuartz

  • 下载:官网 或 GitHub Releases,下载 .dmg(如 XQuartz-2.7.11.dmg)。

    重启 Mac 确保生效。

  • 启动 XQuartz:从 Launchpad 打开,保持运行。

3.3 SSH 连接启用 X11 转发

  • 命令:
    ssh -X -p 5264 root@10.36.41.11
  • 登录后检查 DISPLAY 变量:
    echo $DISPLAY
    期望输出 localhost:10.0 或类似。
  • 第一次尝试:输出为空。
    • 原因:SSH 服务端未开启 X11Forwarding。
    • 修改 /etc/ssh/sshd_config,添加或修改:
      X11Forwarding yes
      X11UseLocalhost no
      
    • 重启 sshd:systemctl restart sshd
    • 重新 ssh -Xecho $DISPLAY 显示 localhost:10.0,成功。

3.4 启动 DTS(首次)

  • 切换至 dmdba 用户:
    su - dmdba
  • su - 会重置环境变量,导致 DISPLAY 丢失。需手动设置:
    export DISPLAY=:0.0
  • 启动 DTS:
    /home/dmdba/dmdbms/tool/dts
  • 现象:DTS 窗口成功弹出(在 Mac 上显示),但界面中文乱码,且按钮点击无响应(鼠标事件未传递)。但至少程序启动了。

截屏20260727 16.16.25.png

3.5 中文乱码处理

  • 安装中文字体(root 用户):
    yum install -y wqy-microhei-fonts wqy-zenhei-fonts yum install -y fontconfig fc-cache -fv
  • 设置环境变量:
    export LANG=zh_CN.UTF-8 export LC_ALL=zh_CN.UTF-8
  • 重启 DTS,乱码仍存在(可能因 X11 字体渲染问题),但不影响功能。

3.6 关闭 DTS 后无法再次启动

  • 关闭 DTS 窗口后,再次执行 dts,出现 Java 崩溃,报错:
    # A fatal error has been detected by the Java Runtime Environment:
    # SIGSEGV (0xb) at pc=0x00007f... C [libgdk-x11-2.0.so.0+0x7b597] gdk_window_enable_synchronized_configure+0x7
    
  • 分析:GTK2 库版本(CentOS 7 默认为 2.24.31)与 DTS 依赖的图形库不兼容,导致崩溃。第一次成功可能是偶然,后续因库加载顺序或 X11 会话状态改变而崩溃。

3.7 尝试修复

3.7.1 环境变量调整

  • 设置 GDK_SYNCHRONIZE=0GTK_MODULES=""LIBOVERLAY_SCROLLBAR=0 等,均无效。
  • 命令示例:
    export GDK_SYNCHRONIZE=0 export GTK_MODULES="" export LIBOVERLAY_SCROLLBAR=0 /home/dmdba/dmdbms/tool/dts

3.7.2 使用 Xvfb(虚拟显示)

  • 安装 Xvfb:
    • 默认 yum 仓库找不到包,需启用 EPEL:
      yum install -y epel-release yum install -y xorg-x11-server-Xvfb
  • 启动虚拟显示:
    Xvfb :99 -screen 0 1024x768x24 &
  • 设置 DISPLAY=:99,启动 DTS,仍然崩溃,错误相同。

3.7.3 修改 SSH 配置,尝试受信任转发

  • /etc/ssh/sshd_config 增加 X11UseLocalhost no 并重启 sshd。
  • 使用 ssh -Y(受信任转发)代替 -X,仍然崩溃。

3.7.4 尝试其他 Java 版本

  • 系统 OpenJDK 1.8.0_492,DTS 自带 JDK,尝试切换 JAVA_HOME:
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
    无效。

3.7.5 查看崩溃日志

  • 崩溃后生成 hs_err_pid*.log,查看关键帧:
    # Problematic frame:
    # C  [libgdk-x11-2.0.so.0+0x7b597]  gdk_window_enable_synchronized_configure+0x7
    
    明确是 GTK2 库问题,无法通过环境变量解决。

3.8 最终结论

  • 在 CentOS 7 默认 GTK2 版本下,DTS 图形界面极不稳定,无法可靠运行。
  • 尝试了 X11 转发、Xvfb、环境变量调整、SSH 配置修改,均未成功。

四、问题总结与经验记录

问题 尝试的解决方法 最终结果
DEM 无本地执行方式 添加 DTS 代理,启动 dmagent 代理连接成功,但任务仍无法执行
X11 转发 DISPLAY 为空 修改 sshd_config,重启 sshd 成功显示 DISPLAY
第一次启动 DTS 成功但乱码 安装中文字体,设置 LANG 乱码仍存在,但功能可用
关闭后再次启动崩溃 调整 GTK_MODULES、GDK_SYNCHRONIZE 无效
Xvfb 安装 启用 EPEL,安装 Xvfb 成功安装但启动 DTS 仍崩溃
受信任 X11 转发 使用 ssh -Y 无效

根本原因:DTS 的 Java 图形层依赖特定版本的 GTK2 库,而 CentOS 7 默认版本为 2.24.31,与 DTS 不兼容。

可用替代方案

  • 使用达梦命令行工具 dexp/dimp 完成迁移(逻辑导出导入)。
  • 迁移至 Windows 环境运行 DTS(图形界面稳定)。
  • 在 Linux 上使用 Docker 容器运行兼容的图形环境(未尝试)。

五、后续步骤

鉴于 Linux 环境下 DTS 图形界面无法稳定运行,决定转向 Windows 虚拟机执行 DTS,迁移成功(此部分不在本文档范围内)。


评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服