DMHS数据同步工具

DMHS数据同步工具

​ 本章节主要介绍DM数据同步工具DMHS的使用,通过将oracle11g的数据同步到DM8的过程来理解DMHS的功能和作用。

安装前的准备

端口、服务信息

IP地址 服务名称 版本 端口 安装路径
192.168.19.136 Oracle Oracle11.0.2 1521 /opt/oracle
/ DMHS源端 dmhs_V3.3.20_oracle_rev141041_rh6_64_20231010 5345 /opt/dmhs
192.168.19.133 DM DM8 5236 /home/dmdba/dmdbms
/ DMHS目的端 dmhs_V4.3.32_dm8_rev163952_rh6_64_20240710 5345 /home/dmdba/dmhs

Oracle11g源端的准备

开启归档
  • 切换至oracle用户,创建目录

    shell 复制代码
    mkdir /data/oracle/oradata/orcl/archlog
  • 连接数据库,进行归档设置

    SQL 复制代码
    # 关闭数据库服务
    SQL> shutdown immediate
    # 以 mount 方式启动 oracle 数据库
    SQL> startup mount
    # 开启归档
    SQL> alter database archivelog;
    # 设置归档文件路径(如果使用本地路径存放归档日志,需要将 db_recovery_file_dest 参数置空,然后设置 log_archive_dest 参数
    SQL> alter system set db_recovery_file_dest='';
    SQL> alter system set log_archive_dest='/opt/oracle/oradata/orcl/archlog';
    # 恢复为 open 状态
    SQL> alter database open;
    # 再次检查归档
    SQL> archive log list;
开启附加归档

附加日志(supplemental log)指数据库在日志中添加额外信息到日志流中,以支持基于日志的工具,进行数据的分析。

  • 检查附加日志

    SQL 复制代码
    SQL> select SUPPLEMENTAL_LOG_DATA_MIN min,SUPPLEMENTAL_LOG_DATA_PK  pk,SUPPLEMENTAL_LOG_DATA_UI ui,SUPPLEMENTAL_LOG_DATA_FK fk, SUPPLEMENTAL_LOG_DATA_ALL "all" from v$database;
  • 开启数据库最小附加日志级全列日志

    SQL 复制代码
    SQL> alter database add supplemental log data;
    SQL> alter database add supplemental log data (all) columns;
    # 再次检查附加日志
    SQL> select supplemental_log_data_min, supplemental_log_data_all from v$database;
关闭Oracle的回收机制
  • 检查Oracle的回收机制

    SQL 复制代码
    SQL> show parameter recyclebin;
    # 如果是on,需要关闭oracle回收机制
    SQL> alter system set recyclebin=off deferred;
    • 重启数据库生效

检查字符集是否一致
  • 先查询Oracle数据库的字符集

    SQL 复制代码
    SQL> select userenv('language') from dual;
    • Oracle数据库字符集:AMERICAN_AMERICA.WE8MSWIN1252
  • 再查询系统字符集

    shell 复制代码
    echo $NLS_LANG
    
    # 如果该变量值为空或者与查询结果不一致,则将该变量设置为查询结果的值
    vi ~/.bash_profile
    # 增加 export NLS_LANG="sql查询结果"
    source ~/.bash_profile
创建同步用户及授权
  • 启动Oracle数据库,进行同步用户的相关创建与授权

    SQL 复制代码
    SQL> create user DMHS identified by "DMHS" default tablespace  USERS temporary tablespace TEMP profile DEFAULT;
    SQL> grant connect to DMHS;
    SQL> grant create any table to DMHS;
    SQL> grant select any table to DMHS;
    SQL> grant select any dictionary to DMHS;
    SQL> grant create session to DMHS;
    SQL> grant lock any table to DMHS;
    SQL> grant execute on dbms_flashback to DMHS;
    SQL> grant unlimited tablespace to DMHS;
root用户安装ODBC
  • 查看是否安装ODBC

    shell 复制代码
    rpm -qa|grep unixODBC
  • 添加ODBC的环境变量

    shell 复制代码
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
  • 安装ODBC

    shell 复制代码
    yum -y install unixODBC unixODBC-devel
  • 配置unixODBC

    shell 复制代码
    vim /etc/odbc.ini
    • 写入内容:

      shell 复制代码
      [ORACLE]
      Description = Oracle ODBC driver for Oracle 11g
      Driver= Oracle in OraDb11g_home1
      SERVER = 192.168.19.136
      ServerName = orcl
      UserID = DMHS
      Password = DMHS
      Port = 1521
  • 配置odbcinst.ini文件

    shell 复制代码
    vim /etc/odbcinst.ini
    • 增加以下内容:

      shell 复制代码
      [Oracle in OraDb11g_home1]
      Description = ODBC DRIVER FOR ORACLE
      Driver = /opt/oracle/product/11.2.0/db_1/lib/libsqora.so.11.1
      Threading = 0
  • 查看是否缺少依赖项

    shell 复制代码
    ldd /opt/oracle/product/11.2.0/db_1/lib/libsqora.so.11.1 
    • 缺少libodbcinst.so.1文件
  • 查找系统其他地方是否有这个依赖

    shell 复制代码
    find / -name libodbcinst*
  • 将其他地方有的文件复制到路径下

    shell 复制代码
    cp /usr/lib64/libodbcinst.so.2 /lib64/libodbcinst.so.1 
    
    ldd /opt/oracle/product/11.2.0/db_1/lib/libsqora.so.11.1 
    • 这里就把依赖的路径给写进去了
  • 使用issql进行测试(在oracle用户下进行测试)

    shell 复制代码
    isql -v ORACLE DMHS DMHS
    • 连接成功,说明配置啥的都是可以使用的

DM8目的端的准备

开启归档
  • 连接数据库,查询归档是否开启

    SQL 复制代码
    SQL> select arch_mode from v$database;
    • 我这里是开启了归档

    • 如果没有开启,需要用下面的命令进行开启归档

      SQL 复制代码
      alter database mount;
      alter database archivelog;
      alter database add archivelog 'TYPE=LOCAL,DEST=/dmdata/arch,FILE_SIZE=1024,SPACE_LIMIT=10240';
      alter database open;
开启逻辑日志
  • 使用SYSDBA连接数据库执行命令

    SQL 复制代码
    SP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',1);
    select para_value from v$dm_ini where para_name in ('RLOG_APPEND_LOGIC');
  • dm.ini 配置参数中"FAST_COMMIT"必须为 0,否则会导致逻辑日志不全而影响同步

    SQL 复制代码
    SQL> select para_value from v$dm_ini where para_name = 'FAST_COMMIT';
创建同步用户及授权
  • 创建用户

    SQL 复制代码
    CREATE TABLESPACE HSEXEC DATAFILE 'HSEXEC.DBF' size 128;
    CREATE USER HSEXEC IDENTIFIED by "1314520dsy" DEFAULT TABLESPACE HSEXEC DEFAULT INDEX TABLESPACE HSEXEC;
    GRANT VTI TO HSEXEC;
    GRANT PUBLIC TO HSEXEC; 
    GRANT RESOURCE TO HSEXEC;
    GRANT DBA TO HSEXEC;
  • 授权

    SQL 复制代码
    SQL> grant resource to HSEXEC;
    SQL> grant select any table to HSEXEC;
    SQL> grant dba to HSEXEC;
    SQL> grant unlimited tablespace to HSEXEC;

DMHS服务部署

DM8目的端的部署

部署dmhs服务
  • 修改可执行文件的权限,然后执行安装程序

    shell 复制代码
    chmod +x /opt/dmhs_V4.3.32_dm8_rev163952_rh6_64_20240710.bin 
    ./dmhs_V4.2.60_dm8_rev106302_rh6_64_veri_20220225.bin -i
  • 开始安装,根据提示进行选择

    • 至此,DMHS已经安装好了
修改服务配置
  • 进入DMHS安装目录下的bin子目录,通过修改示例服务脚本,准备当前的服务启动脚本

    shell 复制代码
    cd /home/dmdba/dmhs/bin
    cp TemplateDmhsService DmhsService
    vim DmhsService
    • 需要修改的内容:

      shell 复制代码
      #set execute environment
      #REPLACE DMHS_HOME path
      DMHS_HOME=/home/dmdba/dmhs
      #REPLACE program dir
      PROG_DIR=/home/dmdba/dmhs/bin
      #REPLACE program config path
      CONF_PATH=/home/dmdba/dmhs/bin/dmhs.hs
      #REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
      NEED_LIB_PATH=/home/dmdba/dmhs/bin:/home/dmdba/dmhs/hs_agent:/home/dmdba/dmhs/db/bin
      HS_NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
  • 在dmhs的bin目录下,新增dmhs.hs配置文件

    shell 复制代码
    cd /home/dmdba/dmhs/bin
    vim dmhs.hs
    • 配置内容如下:

      XML 复制代码
      <?xml version="1.0" encoding="GB2312"?>
      <dmhs>
          <base>
              <lang>en</lang>
              <mgr_port>5345</mgr_port>
              <chk_interval>2</chk_interval>
              <ckpt_interval>45</ckpt_interval>
              <siteid>4</siteid>
              <version>2.0</version>
          </base>
          <exec>
              <recv>
                  <data_port>5346</data_port>
              </recv>
              <db_type>dm8</db_type>
              <db_server>192.168.19.133</db_server>
              <db_user>HSEXEC</db_user>
              <db_pwd>1314520dsy</db_pwd>
              <db_port>5236</db_port>
              <char_code>PG_UTF8</char_code>
              <db_name></db_name>
              <exec_thr>8</exec_thr>
              <exec_sql>1024</exec_sql>
              <exec_trx>2000</exec_trx>
              <exec_rows>2000</exec_rows>
              <msg_col_size>30000</msg_col_size>
              <ddl_continue>1</ddl_continue>
              <affect_row>0</affect_row>
              <exec_policy>2</exec_policy>
              <enable_rowid>0</enable_rowid>
              <clear_trx_file>1</clear_trx_file>
              <trx_max_file>8</trx_max_file>
          </exec>
      </dmhs>
启动DMHS服务
  • 进入dmhs安装的bin子目录,执行配置好了的服务脚本

    shell 复制代码
    ./DmhsService start
    ./dmhs_console
    # 启动 exec 模块
    DMHS> start exec
    • 这里我遇到报错:(ORACLE NLS_LANG) is not set in this script, starting failed!!!
    • 分析原因,是DmhsService的参数没写完整,解决方法:写参数HS_NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
  • 可以在/home/dmdba/dmhs/log下看到相关的日志

Oracle源端的部署

部署dmhs服务

root权限下执行操作

  • 进入到dmhs的目录下,先赋予安装程序权限,执行安装

    shell 复制代码
    ##赋予权限
    chmod a+x dmhs_V4.3.28_oracle_rev152326_rh6_64_20240223_sp7.bin
    
    [root@localhost dmhs]# ./dmhs_V4.3.28_oracle_rev152326_rh6_64_20240223_sp7.bin -i
    • 操作过程跟上面DM数据库的一样
  • 修改配置文件

    shell 复制代码
    cd /opt/dmhs/bin/
    vi /opt/dmhs/bin/dmhs.hs
    • 修改内容如下:(注意修改两个IP)

      XML 复制代码
      <?xml version="1.0" encoding="GB2312"?>
      <dmhs>
          <base>
              <lang>en</lang>
              <mgr_port>5345</mgr_port>
              <ckpt_interval>45</ckpt_interval>
              <siteid>1</siteid>
              <version>2.0</version>
          </base>
          <cpt>
              <db_type>oracle11g</db_type>
              <db_server>192.168.19.136:1521/orcl</db_server>
              <db_user>DMHS</db_user>
              <db_pwd>DMHS</db_pwd>
              <ddl_mask>op:obj</ddl_mask>
              <char_code>PG_UTF8</char_code>
              <constraint>1</constraint>
              <arch>
                  <clear_interval>600</clear_interval>
                  <clear_flag>0</clear_flag>
              </arch>
              <send>
                  <ip>192.168.19.133</ip>
                  <mgr_port>5345</mgr_port>
                  <data_port>5346</data_port>
                  <filter>
                      <enable>
                          <item>DMHS.*</item>
                      </enable>
                      <disable>
                      </disable>
                  </filter>
                  <map>
                      <item>DMHS.*==DMHS.*</item>
                  </map>
              </send>
          </cpt>
      </dmhs>
配置服务文件
  • 将模版文件复制一份为正式服务并授权

    shell 复制代码
    cp TemplateDmhsService DmhsService
    chmod +x DmhsService
  • 编辑文件

    shell 复制代码
    vi DmhsService
    • 编辑内容:

      shell 复制代码
      #set execute environment
      #REPLACE DMHS_HOME path
      DMHS_HOME=/opt/dmhs/bin
      #REPLACE program dir
      PROG_DIR=/opt/dmhs/bin
      #REPLACE program config path
      CONF_PATH=/opt/dmhs/bin/dmhs.hs
      #REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
      NEED_LIB_PATH=
      HS_NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
启动服务器
  • oracle 用户到 /opt/dmhs/bin 目录下执行命令

    shell 复制代码
    ./DmhsService start
    ./dmhs_console
    shell 复制代码
    DMHS> clear exec lsn
    DMHS> COPY 0 "SCH.NAME='DMHS'" CREATE
    DMHS> COPY 0 "SCH.NAME='DMHS'" INSERT|THREAD|2
    DMHS> start cpt

验证同步效果

登录DM检查表是否存在

  • 使用dmdba用户登录DM数据库,看数据表情况

    SQL 复制代码
    disql HSEXEC/1314520dsy
    # 查看此时表数据量
    SQL> select table_name from user_tables;
    • 这里就只有系统表格,没有其他多余的
  • 登录Oracle创建表及添加数据

    • 使用oracle用户登录,创建数据表,添加数据

      SQL 复制代码
      # 创建表
      SQL> create table dmhs.test(id int,name varchar2(20));
      # 添加数据
      SQL> insert into dmhs.test values(1,'老吴');
      SQL> insert into dmhs.test values (2,'小吴');
      SQL> insert into dmhs.test values (3,'小圆');
      SQL> commit;
      # 查看表记录
      SQL> select * from dmhs.test;
      • 这里oracle出现了乱码(目前来说不是重要问题)
  • 登录DM验证同步结果

    • 在dmdba用户执行命令

      shell 复制代码
      disql HSEXEC/1314520dsy
    • 查看同步情况

      SQL 复制代码
      # 查看系统表,确定数据表 "DMHS.TEST" 在达梦数据库中已创建
      SQL> select table_name from user_tables;
      # 查询表记录,数据跟 Oracle 数据库中数据表记录一致
      SQL> select * from DMHS.TEST;
      • 也能够勉强看出,这是同步过来了

总结

  • 本次主要搭建DMHS进行Oracle到DM8数据库之间的数据同步,总结上面的安装部署,我踩了很多坑,特别是在oracle数据库上。在完成安装部署后回头一看,上面步骤写的很容易,但自己搭建的时候绝对是问题百出,当然,积极解决问题而不是抱怨问题,最终都会解决。
  • 此外还有些小问题,像编码有误等我就没怎么在这里展示,主要还是以DMHS的搭建为主。

参考

相关推荐
做梦敲代码6 分钟前
达梦数据库-读写分离集群部署
数据库·达梦数据库
奶香臭豆腐15 分钟前
C++ —— 模板类具体化
开发语言·c++·学习
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger1 小时前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
微服务 spring cloud1 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡1 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷1 小时前
Redis
数据库·redis·缓存
m0_748256782 小时前
WebGIS实战开源项目:智慧机场三维可视化(学习笔记)
笔记·学习·开源