使用dmhs veri手动比对ORACLE同步到DM数据
veri介绍
在进行数据库数据的实时同步的时候,需要了解同步的结果是否正确,因此需要有数据对比工具进行数据的对比,并生成详细的对比报告,提供用户参考。对比工具仅仅生成报告,对数据不一致的情况不做任何操作,仅仅提示用户发生了数据不一致情况,并且告诉用户那些数据不一致。目前对比工具支持对比的数据库有:Oracle、DM6、DM7、DM8、KingBase、MySQL、DB2、PostgreSQL
VERI 产品构成:系统主要分为对比代理服务和对比校验进程。
对比代理服务分源对比代理服务和目的对比代理服务。对比代理服务的作用是从数据服
务器取得数据记录,并取得数据记录的 MD5 值发送到对比校验进程进行校验。对比校验进程对数据进行比对后,直接访问源数据库服务器和目的数据库服务器,生成详细的对比报告。
系统结构如下图所示。
术语解释如下:
1) AGENT
对比工具代理服务,主要用作数据获取,并计算行数据的 MD5,发送给对比模块。
2) VERI
对比校验进程,主要进行模式下对象对比,数据对比,并且生成对比报告。
3) DMHS
达梦数据实时同步工具
本产品包含以下功能:
1) 动态对比
对比工具与 DMHS 协同工作,保证源表与目的表都是执行完相同事务后对查询结果集进行对比。
2) 静态对比
对比工具单独对比,没有 DMHS 的协同。
3) 键值对比
按照主键或者唯一索引值排序进行对比。
4) 非键值对比
按照行数据 MD5 值排序后进行对比。
5) 二次确认对比
在对比过程中,由于 DMHS 同步的时间差,第一次对比会存在不一致,因此需要针对第一次对比的结果,再次进行第二次确认对比,确定 DMHS 同步是否存在延迟或失败。
6) 快速对比
仅仅对表进行记录行数的对比。
7) 锁表动态对比
动态对比的一种,通过锁表控制源表与 DMHS 同步数据一致。
8) 闪回查询动态对比
动态对比的一种,通过闪回查询直接取得某 SCN 的结果集,仅仅适用 Oracle 库中不包含 LONG, LONG RAW 类型的表。
一、安装veri前环境准备
数据比对环境
数据库类型 | IP | 操作系统 | DB_PORT | dmhs_veri | |
源端 | ORACLE | 192.168.1.32 | CentOS 6.5 | 1521 | Agent、veri |
目的端 | 达梦8 | 192.168.1.105 | CentOS 7.5 | 5236 | Agent |
1.1 Linux 代理连接为Oracle
1.1.1 安装unixODBC
需要声明的是,只有在校验进程dmhs_veri运行的机器才需要安装并配置unixODBC,且unixODBC版本需要使用2.3.0及以上的版本。
获取unixODBC-2.3.0.tar.gz,
执行tar -xzvf unixODBC-2.3.0.tar.gz
然后cd unixODBC-2.3.0/
路径下执行./configure
然后执行make && make install
配置unixODBC的odbc.ini 和odbcinst.ini文件。
1.1.2 环境变量的检查和配置
在oracle根目录下.bash_profile中添加如下两行:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:$ORACLE_HOME/lib |
使环境变量生效:
source .bash_profile |
1.1.3 监听配置和检查
执行lsnrctl status,确保 listener.ora 文件中HOST参数与当前机器hostname一致,如下图所示。
1.1.4 配置unixODBC源
以root用户进入到/usr/local/etc文件夹下,编辑如下文件odbcinst.ini,其中Driver为oracle的libsqora.so.XX.X文件的路径。
chown oracle.oinstall /usr/local/etc/*
[Oracle in OraDb11g_home1] Description = ODBC DRIVER FOR ORACLE Driver = /mnt/oracle/product/11.2.0/dbhome_1/lib/libsqora.so.11.1 threading = 0 |
在odbc.ini 配置示例中[XXX]是DSN名称。
示例:
[RACDB_ST] Description = ORACLE ODBC DSN Driver = /mnt/oracle/product/11.2.0/dbhome_1/lib/libsqora.so.11.1 SERVER=192.168.1.32 UID = DMHS PWD = DMHS SERVERNAME=RACDB_ST PORT = 1521 注意:SERVERNAME=RACDB_ST配置的是tnsnames.ora 中的tns连接名。 |
配置完成之后,验证配置是否正确:
su - oracle
cd /usr/local/bin
./isql 服务名 用户名 密码
./isql RACDB_ST DMHS DMHS
如果isql连接成功,则配置成功,如果连接不成功,可以检查如下几处的配置:listener.ora/tnsnames.ora,.bash_profile,/etc/hosts。其中源库机器的hosts文件中应添加源机和目的机器的ip以及其对应主机名。
1.2 Linux 代理连接为DM
1.2.1 环境检查和配置
检查代理服务器运行机器的环境变量LD_LIBRARY_PATH,保证包含dm安装路径下的bin文件夹。比如,dm安装在/dm/dmdbms/dm8下,确保执行export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/dm/dmhs_veri/bin:/dm/dmhs_veri/db/bin:/dm/dmdbms/dm8/bin。
[dmdba@centos-05 ~]$ isql dm8 -v
[01000][unixODBC][Driver Manager]Can't open lib '/dm/dmdbms/dm8/bin/libdodbc.so' : file not found
[ISQL]ERROR: Could not SQLConnect
注意:准备好与数据库版本号匹配的libdmoci.so 并放入$DM_HOME/bin
1.2.2 配置unixODBC源
chown dmdba.dinstall /usr/local/etc/*
Su - dmdba
在/usr/local/etc的odbcinst.ini文件中添加(其中unixODBC安装在/usr/local文件夹下):
[DM8 ODBC DRIVER] Description = ODBC DRIVER FOR DM8 Driver = /dm/dmdbms/dm8/bin/libdodbc.so threading = 0 |
在odbc.ini文件里添加:
[DM8] Description = DM ODBC DSN Driver = DM8 ODBC DRIVER SERVER = 192.168.1.105 UID = SYSDBA PWD = dameng123 TCP_PORT = 5236 |
ODBC验证:
二、搭建步骤
2.1 安装DMHS(veri)
[oracle@node32 soft]$ ./dmhs_V4.3.08_oracle_rev126685_rh6_64_veri_20230323_sp5.bin -i Extract install files.......... 1.English(English) 2.Simplified Chinese(简体中文) Select the language to install[2.Simplified Chinese(简体中文)]: /tmp/DMHSInstall/install.log 1.免费试用达梦数据实时同步 2.使用已申请的Key文件 验证许可证文件[1.免费试用达梦数据实时同步]: 1.精简版 2.完整版(web客户端) 3.自定义 安装类型[1.精简版]:2 1.实时同步软件服务器 2.远程部署工具 3.实时同步软件客户端 4.内置数据库 5.实时同步软件配置助手 6.手册 所需磁盘空间:869 MB 安装目录: [/home/oracle/dmhs]/dm/dmhs_veri 该路径不为空,是否继续安装?[Y or N]Y 安装路径可能存在覆盖安装 1.统一部署 2.现在初始化 是否初始化达梦数据实时同步系统[1.统一部署]: 正在安装 default start ... default finished. server start ... server finished. hs_agent start ... hs_agent finished. webmanager start ... webmanager finished. db start ... db finished. hsca start ... hsca finished. doc start ... doc finished. doc start ... doc finished. postinstall start ... postinstall finished. 正在创建快捷方式 安装成功 ora rac 远程部署工具配置 远程部署工具名称[HsAgent]: 主机Ip(外网)[192.168.0.201](192.168.0.201,192.168.1.32):192.168.1.32 远程部署工具管理端口[5456](1000-65535): 内置数据库轮询间隔[3](1-60): 内置数据库IP[192.168.0.201]:192.168.1.32 内置数据库端口[15236]: 内置数据库用户名[SYSDBA]: 内置数据库密码[SYSDBA]:dameng123 服务脚本环境变量设置 依赖库路径 提示:此配置项供用户配置源或目的数据库依赖库路径和odbc依赖库路径, 多个路径以":"隔开(例:/opt/dmdbms/bin:/usr/local/lib),此配置项会添加到服务脚本的NEED_LIB_PATH的变量值中。 请配置依赖库路径: 内置数据库服务 1.自动 2.手动 启动方式:[2.手动] 正在创建内置数据库服务 初始化内置数据库 远程控制服务 1.自动 2.手动 启动方式:[2.手动] 正在创建远程控制服务 web服务 1.自动 2.手动 启动方式:[2.手动] 正在创建web服务 达梦数据实时同步V4.0安装完成 更多安装信息,请查看安装日志文件: /dm/dmhs_veri/log/install.log 查看安装的veri: [oracle@node32 bin]$ ls -rlt *veri* -rwxr-xr-x. 1 oracle oinstall 118626 Jun 13 10:01 veri_xml_crt -rwxr-xr-x. 1 oracle oinstall 831547 Jun 13 10:01 dmhs_veri -rwxr-xr-x. 1 oracle oinstall 678871 Jun 13 10:01 dmhs_veri_repair -rwxr-xr-x. 1 oracle oinstall 380116 Jun 13 10:01 dmhs_veri_local_ora -rwxr-xr-x. 1 oracle oinstall 357438 Jun 13 10:01 dmhs_veri_agent_ora |
注意:dmhs软件安装需要安装源端和目的端,确认好同步系统环境版本;准备好与DM数据库版本号匹配的libdmoci.so 并放入$DM_HOME/bin
2.2 ORACLE到DM的数据比对
2.2.1 源端ORACLE配置
2.2.1.1 环境变量配置
必须将libdodbc.so 所在目录或DM bin 目录添加到LD_LIBRARY_PATH中
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/dm/dmhs_veri/bin |
2.2.1.2 ODBC 配置
源端oracle服务器需要引入dm libdodbc.so 动态库以及相关依赖或直接安装达梦数据库软件。
odbc.ini
vi /usr/local/etc/odbc.ini [RACDB_ST] Description = ORACLE ODBC DSN Driver = /mnt/oracle/product/11.2.0/dbhome_1/lib/libsqora.so.11.1 SERVER=192.168.1.32 UID = DMHS PWD = DMHS SERVERNAME=RACDB_ST PORT = 1521 [DM8] Description = DM ODBC DSN Driver = /dm/dmhs_veri/db/bin/libdodbc.so SERVER = 192.168.1.105 UID = SYSDBA PWD = dameng123 TCP_PORT = 5236 注意此处DM 端口配置为TCP_PORT!!! |
odbcinst.ini
vi /usr/local/etc/odbcinst.ini [Oracle in OraDb11g_home1] Description = ODBC DRIVER FOR ORACLE Driver = /mnt/oracle/product/11.2.0/dbhome_1/lib/libsqora.so.11.1 threading = 0 [DM8 ODBC DRIVER] Description = ODBC DRIVER FOR DM8 Driver = /dm/dmhs_veri/db/bin/libdodbc.so threading = 0 |
检查unixODBC配置是否正确
使用oracle用户连接检查unixODBC配置是否正确
isql RACDB_ST DMHS DMHS isql dm8 -v |
该处确保isql 能够成功连通oracle 和 dm 否则后续启动也会报数据库连接错误。
2.2.1.3 Agent组件配置
在AGENT服务启动前必须完成相关配置,agent.xml文件放至/dm/dmhs_veri/bin目录下
<?xml version="1.0" encoding="utf-8"?> <agent> <!-- AGENT标识 --> <port>6347</port> <!-- Agent服务端口号--> <lang>en</lang> <!--报告和日志语言:en和ch,en是表示英文,ch则表示中文,默认值为en --> <max_session>50</max_session> <!—接收VERI消息的最大连接数,范围为[1, 10000] --> <thr_num>5</thr_num> <!-- 性能调优参数,仅ORACLE/DM7/DM8生效 --> <database> <!-- 数据库连接信息标志 --> <type>ORACLE11g</type> <!-- 数据库类型,详见1.1.2 --> <server>192.168.1.32:1521/RACDB_ST</server> <!-- 数据库连接字符串--> <uid>DMHS</uid> <!-- 数据库连接用户名 --> <psw>DMHS</psw> <!-- 数据库连接密码 --> </database> </agent> |
2.2.1.4 VERI组件配置
在VERI执行前必须完成相关配置,veri.xml文件放至/dm/dmhs_veri/bin目录下
<veri> <lang>en</lang> <!-- language: en or ch, 同AGENT该参数 --> <max_thr>40</max_thr> <max_obj_thr>10</max_obj_thr> <report_left_num>20000</report_left_num> <max_out_sync>100000</max_out_sync> <col_opt>1</col_opt> <src> <agent_server>192.168.1.32</agent_server> <port>6347</port> <db_type>ORACLE11g</db_type> <odbc_str> <driver>dsn=RACDB_ST</driver> <db_server>192.168.1.32:1521/RACDB_ST</db_server> <db_user>DMHS</db_user> <db_pwd>DMHS</db_pwd> </odbc_str> </src> <dest> <agent_server>192.168.1.105</agent_server> <port>5350</port> <db_type>DM8</db_type> <odbc_str> <driver>dsn=DM8</driver> <db_server>192.168.1.105</db_server> <db_user>sysdba</db_user> <db_pwd>dameng123</db_pwd> <db_port>5236</db_port> <char_code>PG_GB18030</char_code> </odbc_str> </dest> </veri> |
2.2.2目的端DM配置
2.2.2.1 Agent组件配置
在AGENT服务启动前必须完成相关配置,agent.xml文件放至dmhs bin目录下
<?xml version="1.0" encoding="utf-8"?> <agent> <port>5350</port> <lang>en</lang> <max_session>50</max_session> <database> <type>DM8</type> <server>192.168.1.105</server> <port>5236</port> <uid>sysdba</uid> <psw>dameng123</psw> </database> </agent> |
三、VERI作业配置
在执行dmhs_veri时除了必带参数conf=veri.xml用于获取VERI组件配置文件位置外,还必须携带table=(源端表==目的端表)或者指定作业文件jobfile=job_scott.xml来确定源端到目的端的比对对象。job_scott.xml放至源端dmhs bin目录下
dmhs_veri conf=veri.xml jobfile=job_scott.xml |
job_scott.xml
<?xml version="1.0" encoding="GB2312" ?> <job> <name>job</name> <table_list> <table_info> <table_name>SCOTT.EMP==SCOTT.EMP</table_name> </table_info> <table_info> <table_name>SCOTT.TEST==SCOTT.TEST</table_name> </table_info> </table_list> </job> |
四、对比执行命令
步骤一:启动源端AGENT
./dmhs_veri_agent_ora agent.xml 或配置服务启动: cd /dm/dmhs_oracle/bin/service_template [oracle@node32 service_template]$ cp AgentOraService ../ [oracle@node32 bin]$ grep "/dm/dmhs_oracle" AgentOraService DMHS_HOME=/dm/dmhs_oracle PROG_DIR=/dm/dmhs_oracle/bin CONF_PATH=/dm/dmhs_oracle/bin/agent.xml [oracle@node32 bin]$ AgentOraService start _REPLACE_SELF_NLS_LANG(ORACLE NLS_LANG) is not set in this script, starting failed!!! [oracle@node32 bin]$ grep "HS_NLS_LANG" AgentOraService HS_NLS_LANG="american_america.AL32UTF8" [oracle@node32 bin]$ AgentOraService start Starting AgentOraService: [ OK ] |
步骤二:启动目的端AGENT
./dmhs_veri_agent_dm8 agent.xml 或配置服务启动: [dmdba@centos-05 service_template]$ cd /dm/dmhs_ora_dm/bin/service_template [dmdba@centos-05 service_template]$ cp AgentDm8Service ../ [dmdba@centos-05 bin]$ grep "/dm/dmhs_ora_dm" AgentDm8Service DMHS_HOME=/dm/dmhs_ora_dm PROG_DIR=/dm/dmhs_ora_dm/bin CONF_PATH=/dm/dmhs_ora_dm/bin/agent.xml [dmdba@centos-05 bin]$ grep "HS_NLS_LANG" AgentDm8Service HS_NLS_LANG="american_america.ZHS16GBK" [dmdba@centos-05 bin]$ AgentDm8Service start Starting AgentDm8Service: [ OK ] |
步骤三:在源端服务器运行对比执行命令
./dmhs_veri conf=veri.xml jobfile=job_scott.xml use_key=0 |
use_key为0时执行非主键比对,当use_key为1时执行主键比对。不使用此参数时,默认使用非主键比对;当use_key为1时,对比的表无主键则自动选择非主键比对。
比对结果:
[oracle@node32 bin]$ ./dmhs_veri conf=veri.xml jobfile=job_scott.xml use_key=0 VERI[INFO]: VERI start up, current version: V1.3.08-Build(2023.03.23-126685trunc)_64_2303_sp5 PUB[WARN]: NLS_LANG user env:american_america.AL32UTF8 conflicts with char_code:PG_GB18030, set NLS_LANG to AMERICAN_AMERICA.ZHS32GB18030 VERI[INFO]: CONNECT: DSN=RACDB_ST;UID=DMHS;PWD=****** PUB[WARN]: user env lang:PG_UTF8 is conflict with char_code:PG_GB18030 PUB[WARN]: use char_code:PG_GB18030 VERI[INFO]: CONNECT: DSN=DM8;UID=SYSDBA;PWD=****** VERI[INFO]: file dmhs.key not found, use default license! MGR[WARN]: License will expire in 10 day(s) on 2023-06-23 VERI[INFO]: veri odbc connect str: DSN=RACDB_ST;UID=DMHS; VERI[INFO]: veri odbc connect str: DSN=DM8;UID=SYSDBA; VERI[INFO]: jobfile: job_scott.xml, configuration total number of need compared table: 2 VERI[INFO]: jobfile: job_scott.xml, real total number of need compared table: 2, org_conf: 2 VERI[INFO]: the job begin VERI[INFO]: the execute mode is NORMAL VERI[INFO]: source agent ip 192.168.1.32:6347 VERI[INFO]: destination agent is 192.168.1.105:5350 VERI[INFO]: the veri of pair tables is starting (1/2 : SCOTT.EMP==SCOTT.EMP)... VERI[INFO]: veri odbc connect str: DSN=RACDB_ST;UID=DMHS; VERI[INFO]: Report job thread start ... VERI[INFO]: the veri of pair tables is starting (2/2 : SCOTT.TEST==SCOTT.TEST)... VERI[INFO]: veri odbc connect str: DSN=RACDB_ST;UID=DMHS; VERI[INFO]: veri odbc connect str: DSN=DM8;UID=SYSDBA; VERI[INFO]: veri odbc connect str: DSN=DM8;UID=SYSDBA; VERI[INFO]: veri get dst agent bulk data (SCOTT.EMP, 2, 14) VERI[INFO]: table sort: (SCOTT.EMP) VERI[INFO]: veri get dst agent bulk data (SCOTT.TEST, 4, 2) VERI[INFO]: table sort: (SCOTT.TEST) VERI[INFO]: veri get dst agent bulk data (SCOTT.EMP, 2, 14) VERI[INFO]: veri get dst agent bulk data (SCOTT.TEST, 4, 2) VERI[INFO]: veri get src agent bulk data (SCOTT.EMP, 1, 14) VERI[INFO]: veri get src agent bulk data (SCOTT.TEST, 3, 3) VERI[INFO]: veri get src agent bulk data (SCOTT.EMP, 1, 14) VERI[INFO]: veri get src agent bulk data (SCOTT.TEST, 3, 3) VERI[INFO]: no-key compare start: (SCOTT.EMP==SCOTT.EMP) VERI[INFO]: (SCOTT.EMP==SCOTT.EMP) compare over, out_sync: 0, in_sync: 14, used time : 212.152(ms) VERI[INFO]: no-key compare start: (SCOTT.TEST==SCOTT.TEST) VERI[INFO]: (SCOTT.TEST==SCOTT.TEST) compare over, out_sync: 1, in_sync: 2, used time : 00:00:01.174 VERI[INFO]: Detail report : SCOTT.TEST=SCOTT.TEST (Total print: 1) VERI[INFO]: Report job thread exit. VERI[INFO]: Report folder path : /dm/dmhs_veri/bin/report/job_20230621_001 VERI[INFO]: Summary report file path : /dm/dmhs_veri/bin/report/job_20230621_001/veri_report_job.txt VERI[INFO]: Detail report folder path : /dm/dmhs_veri/bin/report/job_20230621_001/detail_job VERI[INFO]: Exit the Verify tool [oracle@node32 bin]$ cat /dm/dmhs_veri/bin/report/job_20230621_001/veri_report_job.txt ****************************************************** DM Verify Data Tool version : V1.3.08-Build(2023.03.23-126685trunc)_64_2303_sp5 start : 2023-06-21 23:56:28 end : 2023-06-21 23:56:43 ****************************************************** source tables or views more than dest as follow: dest tables or views more than source as follow: ****************************************************** No rowid file table pair as follow: ****************************************************** Job Name : job execute mode : NORMAL source agent ip : 192.168.1.32:6347 source agent database type : ORACLE11g destination agent ip : 192.168.1.105:5350 destination agent database type : DM8 ****************************************************** Notice:When nonkey compare, update show as insert and delete, so the sum of same and diff may be over total Total compared 2 tables, list as follow: [OK] SCOTT.EMP == SCOTT.EMP in sync : 14 out sync : 0 [NO] SCOTT.TEST == SCOTT.TEST in sync : 2 out sync : 1 --有一条记录不一致 detail file : /dm/dmhs_veri/bin/report/job_20230621_001/detail_job/SCOTT.TEST=SCOTT.TEST.txt ****************************************************** [oracle@node32 bin]$ cat /dm/dmhs_veri/bin/report/job_20230621_001/detail_job/SCOTT.TEST=SCOTT.TEST.txt Configuration veri agent information(ORACLE11g 192.168.1.32:6347== DM8 192.168.1.105:5350) Total information(SCOTT.TEST==SCOTT.TEST): KEY_MODE:ROWID AGENT FROM SELECT SQL: SELECT rowid ,"ID","NAME" FROM "SCOTT"."TEST" AGENT TO SELECT SQL: SELECT rowid ,"ID","NAME" FROM "SCOTT"."TEST" there are 2 in sync, 1 out sync ****************************************************** INSERT(exist in source database but not in dest: ORACLE11g) : 下面记录在源端oracle库中有,但是在目的端达梦库中没有 ROWID(20):'AAAVaJAAEAAAACrAAB',RAWDATA:'3','test03', |
达梦在线服务平台:https://eco.dameng.com