DMHS介绍
DMHS主要有3个模块
CPT,日志分析,捕获并装载源端数据库的redo日志,会连接源端数据库。
NET,消息发送,将CPT捕获的内容发往EXEC。
EXEC,数据入库,将收到的内容进行执行,会连接目的端数据库。
另有一个模块用于管理上方这3个模块——MGR,它可以启动并加载这3个模块,类似个中控台。

NET模块一般在网络有物理隔离,或需要跨网段传输时使用。我们只用它的子模块,后续说明。
DMHS可以装在源端或目的端机器上,也可以单独装在其他机器上,根据情况而定。
有时候还需要安装ODBC,即unixodbc驱动,用于连接数据库,一般在使用对比工具时需要,当源端是oracle时装在源端,目标端是oracle时装在目标端(说白了oracle在哪,就装在哪),dm8不需要它。
另:本文所说的 “bin目录” ,均为dmhs的安装目录下的bin目录,例如:/home/dmdba/dmhs/bin
标注【可选项】的,可以跳过阅读。
1、环境准备
这里以2台Linux机器为例(实在是没资源了……),每台机器4G内存(2G也行不够再加),本文以部署dmhs的cpt和exec为例,mgr不部署,因此所有配置方式均为命令行形式,没有图形化内容。也不单独部署net,因为是局域网。
本文以Oracle数据库作为源端(数据来源,也叫捕获端),以达梦数据库DM8作为目的端(接收源端发过来的数据并同步,也叫执行端),dmhs也跟数据库一起装在这2台机器上,生产大多分开。
【源端】
第一台机器作为源端数据库,安装oracle数据库,关闭防火墙,创建TEST用户,在TEST模式下任意建一张表T1,并插入一点数据,后续验证需要使用。
【目的端】
第二台机器作为目的端数据库,安装DM8,配置好实例,并启动数据库服务,关闭防火墙,创建TEST表空间并创建TEST用户,后续验证需要使用。
DM8试用版下载地址:产品下载 | 达梦数据库
2、安装dmhs
oracle的可用oracle用户安装,dm8的用dmdba用户安装。从现在开始,所有操作均为这些用户。
(1)执行:chmod +x <安装包>,否则没权限安装。
(2)直接执行文件即可安装:./<安装包> -i #因为是命令行安装,得加-i,图形化不加。下方安装步骤没说明的都是选了默认配置。
(3)语言建议选英文,因为可能有乱码(后续可改)。
(4)可选择“精简安装”,也可选择自定义安装,这里选“精简安装”。
(5)可选“现在初始化”(会自动生成dmhs.hs文件),或者“统一部署”,这里选“统一部署”。
(6)将key文件放入dmhs/bin目录下,改名为dmhs.key(购买dmhs后获得)。
3、 目的端机器,配置
3.1 开启归档和逻辑日志
编辑服务器配置文件dm.ini,修改如下:
ARCH_INI = 1
RLOG_APPEND_LOGIC = 1
新建dmarch.ini配置文件
vim dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmarch #归档目录,输入自己的归档目录
ARCH_FILE_SIZE = 128 #归档文件大小,单位 MB
ARCH_SPACE_LIMIT = 0 #空间大小限制,0 表示不限制
重启数据库服务
3.2 检查归档配置是否正确
disql执行命令:
SELECT ARCH_DEST, ARCH_FILE_SIZE FROM SYS.V$DM_ARCH_INI WHERE ARCH_TYPE='LOCAL' AND ARCH_IS_VALID='Y';
行号 ARCH_DEST ARCH_FILE_SIZE
------- ---------------------------- --------------
1 /dmarch 128
已用时间: 128.384(毫秒). 执行号:3.
3.3 检查逻辑日志配置是否正确
SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_LOGIC';
行号 PARA_VALUE
---------- ----------
1 1
已用时间: 20.685(毫秒). 执行号:4.
3.4 检查在线日志
SELECT PATH FROM SYS.V$RLOGFILE;
行号 PATH
---------- ----------------------------------------
1 /dmarch/src_db01.log
2 /dmarch/src_db02.log
已用时间: 1.096(毫秒). 执行号:5
3.5 检查FAST_COMMIT参数是否为0
select para_value from v$dm_ini where para_name = 'FAST_COMMIT';
行号 PARA_VALUE
---------- ----------
1 0
已用时间: 8.691(毫秒). 执行号:585.
4、源端机器,配置
4.1 检查归档
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /mnt/arch
Oldest online log sequence 1
Next log sequence to archive 1
Current log sequence 1
没开则执行:
shutdown immediate --关闭数据库服务
startup mount --以mount方式启动oracle数据库服务
alter database archive log; --开启数据归档
--设置归档文件路径
alter system set db_recovery_file_dest='';
alter system set log_archive_dest='/archlog';
shutdown immediate
startup mount
alter database open;
--再次检查归档
archive log list;
4.2 检查附加日志
SQL> select supplemental_log_data_min, supplemental_log_data_all from v$database;
SUPPLEME SUP
-------- ---
YES YES
没开则执行
--开启数据库最小附加日志级全列日志
alter database add supplemental log data;
alter database add supplemental log data (all) columns;
--再次检查附加日志
select supplemental_log_data_min, supplemental_log_data_all from v$database;
4.3 检查回收站
SQL> show parameter recycle;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle string
db_recycle_cache_size big integer 0
recyclebin string OFF
4.4 创建DMHS用户,并赋权
grant connect to dmhs;
grant select any table to dmhs;
grant select any dictionary to dmhs;
grant create session to dmhs;
grant lock any table to dmhs;
grant execute on dbms_flashback to dmhs;
--如果是oracle12c
grant all on sys.dmhs_ddl_sql to C##dmhs
grant all on sys.col$ to C##dmhs;
grant all on sys.cdef$ to C##dmhs;
grant all on sys.lobfrag$ to C##dmhs;
grant all on sys.obj$ to C##dmhs;
grant all on sys.user$ to C##dmhs;
4.5 检查odbc配置
lrwxrwxrwx 1 oracle oinstall 57 Aug 16 08:30 libclntsh.so -> /u01/app/oracle/product/11.2.0/db_1/lib/libclntsh.so.11.1
lrwxrwxrwx 1 oracle oinstall 52 Aug 16 08:28 libclntsh.so.10.1 -> /u01/app/oracle/product/11.2.0/db_1/lib/libclntsh.so
4.6 配置listener
若已知oracle的数据库服务名,并确定能连接上,那么此步骤略过。否则执行:
ehco $ORACLE_HOME
显示的是oracle的安装位置,进入该目录,再进入下面这个目录
network/admin/
修改2个文件,建议先备份
vim listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.134)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = orcl)
)
)
HOST 填写源端机器的ip,或者写localhost 或 127.0.0.1,PORT 写oracle的端口,SID_NAME 是oracle的数据库服务名,若是之前已配好的,可忽略此步。
vim tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.134)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
HOST 写源端机器的ip,或者写localhost 或 127.0.0.1,PORT 写oracle的端口,多写一个SERVICE_NAME,若是之前已配好的,可忽略此步。
配置完成后,将oracle的监听重启:
lsnrctl stop #关闭监听
lsnrctl start #启动监听
lsnrctl status #查看监听状态,数据库服务名是否为orcl
5、配置dmhs
【目的端】
进dmhs的bin目录,创建配置文件dmhs.hs(选择现在初始化安装的,会有此文件,无需创建)
vim dmhs.hs
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base> <!-- 管理模块的基本配置 -->
<lang>en</lang> <!-- 语言选项,ch 为中文,en 为英文 -->
<mgr_port>5345</mgr_port> <!-- 管理端口号,默认为5345-->
<ckpt_interval>60</ckpt_interval> <!-- 检查点间隔,默认60 -->
<siteid>2</siteid> <!-- 站点ID,这个ID配置时要注意,全局唯一,最小值0,最大值65535 -->
<version>2.0</version>
</base>
<exec> <!-- 执行模块的基本配置 -->
<recv>
<data_port>5346</data_port> <!-- 当数据传递采用网络直连时,需要配置该参数,表明同步数据从该端口号获取。 -->
</recv>
<db_type>dm8</db_type> <!-- 目标端数据库类型 -->
<db_server>192.168.1.135</db_server> <!-- 目标端数据库服务名或IP -->
<db_user>TEST</db_user> <!-- 目标端数据库用户 -->
<db_pwd>test12345678</db_pwd> <!-- 用户的密码 -->
<db_port>5237</db_port> <!-- 目标端数据库端口 -->
<db_name></db_name> <!-- 默认数据库名,默认为空串(只针对dm6有用)-->
<exec_thr>4</exec_thr> <!-- 执行线程个数,只有当 exec_mode 为 1 时才会生效!默认为1 -->
<exec_sql>1024</exec_sql> <!-- SQL 缓存大小,默认为 512M -->
<exec_trx> 5000 </exec_trx> <!-- 事务缓存个数,默认为 5000 -->
<exec_rows>1000</exec_rows> <!-- 批量绑定行数,默认为 250 -->
</exec>
</dmhs>
其中<base>元素为MGR模块使用,虽然本文没部署MGR,但是依然要写,因为需要使用它的子模块,即<base>元素里的那些子元素。<exec>就是EXEC模块的元素,其中<recv>就是NET模块的子模块的一种。
【源端】
进dmhs的bin目录,创建配置文件dmhs.hs(选择现在初始化安装的,会有此文件,无需创建)
vim dmhs.hs
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base> <!-- 管理模块的基本配置 -->
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>45</ckpt_interval>
<siteid>1</siteid> <!-- 站点ID,这个ID配置时要注意,全局唯一,最小值0,最大值65535 -->
<version>2.0</version>
</base>
<cpt> <!-- 捕获器模块,这项配置可以配置多个 -->
<db_type>ORACLE11g</db_type> <!-- 源端数据库类型 -->
<db_server>orcl</db_server> <!-- 源端数据库服务名,DM8和ORACLE为OCI连接的服务名,DM6为连接的服务器IP -->
<db_user>TEST</db_user> <!-- 源端数据库用户名 -->
<db_pwd>test1234</db_pwd> <!-- 用户的密码 -->
<db_port>1521</db_port> <!-- 源端数据库端口 -->
<ddl_mask>TABLE:VIEW:INDEX:OP</ddl_mask> <!--DDL配置项,写的是掩码,需同步DDL时使用,详见末尾-->
<arch> <!--归档信息配置,该标签是一个功能标签,需要配置它的子项-->
<clear_interval>600</clear_interval> <!--归档日志清理间隔,取值范围在60-65535,单位秒 -->
<clear_flag>0</clear_flag> <!--归档日志清理选项,选配0(不操作),默认为0 -->
</arch>
<send> <!-- 此处仅以发送到网络为例,其他配置详见本手册 4.2NET 发送子模块 -->
<ip>192.168.1.135</ip> <!-- 目标端dmhs的服务器ip -->
<mgr_port>5345</mgr_port> <!-- 目标端dmhs的管理端口号 -->
<data_port>5346</data_port> <!-- 目标端dmhs的data_port -->
<filter> <!-- 过滤配置项,必须指定 -->
<enable> <!-- 白名单,允许同步所有的表 -->
<item>TEST.*</item> <!-- 要同步的模式名.表名,*代表所有 -->
</enable>
</filter>
<map> <!--映射配置项-->
<item>TEST.*==TEST.*</item> <!-- 要同步的模式名,左边是源端,右边是目标端 -->
</map>
</send>
</cpt>
</dmhs>
其中<base>元素为MGR模块使用,上文已说这里不重复唠叨了。<cpt>就是CPT模块的元素。<send>就是NET模块的子模块的一种,但是需要写在<cpt>元素里,作为子元素。<ddl_mask>是启用ddl同步,配置这个之后就会同步ddl,不配不同步ddl操作。掩码在末尾有说明。
<enable>里的<item>子元素,当有多个模式时,可以写多个<item>。下方的<map>元素的<item>子元素也是同理。
6、目的端开启、验证dmhs
【开启dmhs】
(1)先前台启动,方便查阅。进dmhs的bin目录
./dmhs_server
(2)若报错找不到.so,可以ldd查看下libcpt_ora.so
ldd libcpt_ora.so
(3)可以看到需要的.so文件。缺少的.so文件,去stat目录查找,找到后复制到bin目录下。或切换root用户全盘找
find / -name 缺少的.so
(4)还是没找到的,找达梦公司要。找到后需要对文件赋权
chmod 755 *.so
(5)再次启动,没看到MGR[ERROR]的报错就可以了。
MGR[INFO]: DMHS start up, current version: V4.1.48-Build(2021.09.09-102088trunc)_D64(Enterprise Edition)
MGR[WARN]: License will expire on 20xx-xx-xx
MGR[INFO]: load config file successful,site no:2, manager port :5345, poll interval:3
MGR[INFO]: loading the execute module...
MGR[INFO]: manager listening port:5345
【验证dmhs】
新开一个会话窗口,上面server的会话窗口不要最小化,放到方便查看的地方。
(1)新会话窗口进入bin目录,执行:
./dmhs_console
(2)连接目的端dmhs
DMHS> connect 127.0.0.1:5345
execute success
很奇怪?这个console其实类似MGR的一种工具,把它理解成客户端,类似oracle的sqlplus、mysql的./mysql,dm8的disql。第一次启动时默认不连接任何,所以需要手动连,成功后每次启动dmhs_console时,都会自动连。当自动连的机器不是自己想连的机器时,再执行一次connect即可。
(3)启动exec
DMHS> start exec
execute success
(4)此时查看server的窗口,没有报错就ok
error in load libodbcinst.so!!: No such file or directory
EXE[INFO]: CONNECT: SERVER=192.168.238.135;DRIVER=DM8 ODBC DRIVER;UID=TEST;PWD=******;TCP_PORT=5237;
EXE[INFO]: EXEC_V3.1.2_D64
EXE[INFO]: create execute thread 1, enable merge:TRUE
EXE[INFO]: create execute thread 2, enable merge:TRUE
EXE[INFO]: create execute thread 3, enable merge:TRUE
EXE[INFO]: create execute thread 4, enable merge:TRUE
REV[INFO]: exec server data receiving thread created successfully, listening data port : 5346
MGR[INFO]: monitor 127.0.0.1(dmhs_console) 's login
MGR[INFO]: connection from 127.0.0.1(dmhs_console) has broken!
MGR[INFO]: monitor 127.0.0.1(dmhs_console) 's login
(5)若按着本文接着往下走,则不退出,保持这两个窗口开启。若不往下走可退出,在server窗口输入exit回车,退出server,回到console窗口输入exit回车退出。
start exec后若是报错少.so文件,解决办法与【开启dmhs】 相同。
7、源端开启、验证dmhs
【开启dmhs】
也是前台启动,方式、报错处理等都跟“6、目的端开启、验证dmhs”的【开启dmhs】相同。
【验证dmhs】
新开一个会话窗口,上面server的会话窗口不要最小化,放到方便查看的地方。
因为源端这边要验证dmhs的cpt,需要目的端配合,所以要开启目的端并start exec
先开启目的端exec,再开启源端cpt,否则报错连不上目的端。
(1)新会话窗口进入bin目录,执行:
./dmhs_console
(2)连接源端dmhs
DMHS> connect 127.0.0.1:5345
execute success
(3)初始化日志起始位置;装载数据,配置同步掩码
DMHS> clear exec lsn
execute success
DMHS> LOAD 0 "SCH.NAME='TEST' AND TAB.NAME='T1'" DICT|CREATE|INSERT
装载数据字典时要clear exec lsn,为了初始化日志的起始位置。
【可选项】还可以新指定日志分析的起始位置: SET EXEC LSN 0
(4)此时源端会将模式TEST下的表T1进行装载。(T1表在“1、环境准备”处就要求建了,若没建的可返回去创建或把TAB.NAME改成别的表,SCH.NAME=是表所在模式,也改下使其对应)
因为dmhs是装载的redo日志,所以如果T1的redo日志没了会装不上(虽然配了归档但谁知道会不会有人动),因此可以再建一张表并插入一点数据使其生成redo日志,同时别忘了修改TAB.NAME='新表名',和SCH.NAME='新表所在模式'
(5)查看源端server会话窗口,有没有报错,没有报错表示正常。
若报错no listener,就是没启动oracle监听,若报错无效的服务名,就是 “4.6 配置listener” 没写好,若报错连不上目的端,就是目的端防火墙没关闭。诸如此类的还有目的端没start exec等。报错.so文件没找到请看 “6、目的端开启、验证dmhs” 。
(6)查看目的端server是否报错,没有报错表示正常。
打开disql或者manager连接达梦数据库dm8,查看刚才那张表T1是否有同步过来。
(7)启动cpt,开启实时同步
DMHS> start cpt
execute success
此时可连接源端oracle数据库再新建一两张表并插入一些数据,看看目的端是否都同步完成。
执行start cpt后,若没有需要同步的redo日志就会报错,属正常现象。
必须先装载日志,即执行COPY或LOAD语句,才能执行start cpt,否则报错。
至此,源端dmhs验证完成。
【装载初始数据说明】
装载初始数据、字典的语句:
LOAD|COPY <VID> "<过滤条件>" <装载选项>
(1)这个LOAD|COPY是二选一的意思,这俩写哪个都可以,两种写法罢了。
(2)<VID>:指CPT模块的虚拟编号,虚拟编号是指配置文件中CPT配置从上到下的顺序编号,从0开始编号,可以用STATE命令来查看每个CPT模块的虚拟编号。
(3)"<过滤条件>":指的是装载表的过滤条件,这里面有两个重要的对像前缀,分别是SCH和TAB,分别代表系统表中的模式系统表和对像系统表。[SCH是模式名,TAB是前面那个模式里的表名]
(4)<装载选项>:它是装载命令中最复杂的参数,由一组掩码组成,并且可以按照约定组合使用。常用的有:CREATE|TABLE|INDEX|COMMENT|CHECK|PARTITION|THREAD|20(指20个线程,可不写)
例1:COPY 0 "sch.name='TEST'" CREATE|TABLE|INDEX|COMMENT
例2:LOAD 0 "SCH.NAME='TEST' AND TAB.NAME='T1'" DICT|CREATE|INSERT
此时如果目的端的exec是启动状态,那么就会将装载好的日志发往目的端。再次提醒,必须先执行装载命令,才能start cpt。
关闭顺序:
源端server会话窗口输入exit回车,console也是一样操作
源端退出后,目的端server会话窗口输入exit回车,console也是一样操作开启顺序:
目的端开启server,开启console连接后执行start exec
源端开启server,开启console连接装载后执行start cpt后台启动同理
8、【可选项】配置后台启动
源端、目标端,都去bin目录下的service_template目录,将DmhsService复制出来(建议同时改名,方便区分),并修改配置信息:
vim DmhsService
#找到并修改内容,根据自己安装目录改
DMHS_HOME="/home/dmdba/dmhs/bin"
PROG_DIR="/home/dmdba/dmhs/bin"
CONF_PATH="/home/dmdba/dmhs/bin/dmhs.hs"
然后赋权并执行:
chmod +x DmhsService
./DmhsService start
ok后查看,有进程即可
ps -ef | grep dmhs
#返回内容可看到dmhs进程即可
dmdba 8866 1 1 15:59 pts/1 00:00:00 /home/dmdba/dmhs/bin/dmhs_server /home/dmdba/dmhs/bin/dmhs.hs -noconsole
dmdba 8949 8658 0 16:00 pts/1 00:00:00 grep --color=auto dmhs
附:ddl_mask掩码
含义:DDL 操作功能掩码,默认值 TABLE:OP,需要同步DDL操作时使用。
1) TABLE:允许捕获表的 DDL 操作。
2) VIEW:允许捕获视图的 DDL 操作。
3) PROCEDURE:允许捕获过程的 DDL 操作,支持简写 PRO。
4) FUNCTION:允许捕获函数的 DDL 操作,支持简写 FUN。
5) TRIGGER:允许捕获触发器的 DDL 操作,支持简写 TR。
6) INDEX:允许捕获索引的 DDL 操作。
7) CHECK:允许捕获检查约束的 DDL 操作。
8) SEQUENCE:允许捕获序列的 DDL 操作,支持简写 SEQ。
9) PACKAGE:允许捕获包的 DDL 操作,支持简写 PKG。
10) TYPE:允许捕获 TYPE 类型的 DDL 操作。
11) SYNONYM:允许捕获同义词的 DDL 操作,支持简写 SYN。
12) TABLESPACE:允许捕获表空间的 DDL 操作,支持简写 TS。
13) USER:允许捕获用户的 DDL 操作。
14) ROLE:允许捕获角色的 DDL 操作。
15) SCHEMA:允许捕获模式的 DDL 操作。
16) NTEMP:不允许捕获临时表 CREATE 操作。(仅支持DM7以上版本或ORACLE)
操作部分:
1) CREATE:允许捕获所有数据库对象的创建操作。
2) ALTER:允许捕获所有数据库对象的修改操作。
3) DROP:允许捕获所有数据库对象的删除操作。
4) TRUNCATE:允许捕获表的清空操作。
5) GRANT:允许捕获所有数据库对象的授权操作。
6) REVOKE:允许捕获所有数据库对象的权限回收操作。
7) COMMENT: 允许捕获表和视图的注释操作。
其它:
1) OBJECT:允许捕获所有数据库对象的 DDL 操作,支持简写 OBJ。
2) OPERATION:允许捕获对象的所有DDL操作,支持简写OP,但不包含COMMENT。
3) DEFINE:表的 DDL 同步时,只同步定义,不同步 DDL 带来的数据。
4) PARTITION:允许对分区表的分区 DDL 操作进行同步。
5) PTABLE:分区表 DDL 同步时,直接以源端捕获到的 SQL 语句进行同步。
6) SQL:DDL 同步,通过转发 CPT 捕获到的客户端执行的原始 SQL 语句来进行同步。
7) REC:是否在运行日志中记录捕获的 DDL 操作信息,供研发调试使用。
本文详细介绍了如何在Linux机器上部署和配置DMHS,涉及Oracle源端数据库与达梦DM8目的端的CPT、EXEC模块设置,包括安装、环境配置、数据同步过程和验证。
2466

被折叠的 条评论
为什么被折叠?



