同步环境
Dm到Oracle单向同步
版本信息
DM(1-2-84-21.10.21-149328-10032-ENT)端hs版本信息:
DMHS> version
V4.2.60-Build(2022.02.24-106302trunc)_D64
execute success
DMHS>
oracle(19.3.0.0.0)端hs版本信息:
DMHS> version
V4.2.60-Build(2022.02.24-106302trunc)_D64
execute success
DMHS>
1. libclntsh.so.12.1
目的端为oracle,start exec的时候报错:
MGR[ERROR]: lib libdmhs_exec.so can not found,error code 0, libclntsh.so.12.1: cannot open shared object file: No such file or directory
MGR[ERROR]: log exec start fail
locate libclntsh.so.12.1 发现该文件在oracle的lib下,于是考虑把oracle的lib添加到环境变量里,
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/oracle/dmhs/bin:/usr/local/lib:/oracle/app/product/db_1/lib
改完后可以启动exec模块.
2. constraint and trigger
源端copy 字典的时候目的端hs报错:
EXE[INFO]: Are waiting for the site: 1 on asynchronous message delivery...
EXE[ERROR]: modify execute name to replicat, if you want use constraint and trigger , constraint or trigger is seted to 1 on cpt module
PUB[ERROR]: configure failed
浮点数例外(吐核)
百度翻译:
EXE[ERROR]:将execute name修改为replicat,如果要使用constraint和trigger,则在cpt模块上将constraint或trigger设置为1
发布[错误]:配置失败
3. insufficient privileges
装载数据的时候 COPY 0 "SCH.NAME='PAY'" CREATE|CHECK|INSERT|REG|THREAD|8|count
报错权限不足:
EXE[ERROR]: SITEID:1 SEQID:0 TRXID:0 LAST ROWID:NULL SQL_ERROR = SQL:SELECT C.COL# FROM SYS.COL$ C, (SELECT OBJ# FROM SYS.OBJ$ T, SYS.USER$ U WHERE T.OWNER#=U.USER# AND U.NAME='C##PAY' AND T.NAME='student2') TAB WHERE C.OBJ#=TAB.OBJ# AND BITAND(C.PROPERTY, 65536) = 65536
EXE[ERROR]: SITEID:1 SEQID:0 TRXID:0 LAST ROWID:NULL SQL_ERROR = SQL:SELECT C.COL# FROM SYS.COL$ C, (SELECT OBJ# FROM SYS.OBJ$ T, SYS.USER$ U WHERE T.OWNER#=U.USER# AND U.NAME='C##PAY' AND T.NAME='grade') TAB WHERE C.OBJ#=TAB.OBJ# AND BITAND(C.PROPERTY, 65536) = 65536
EXE[ERROR]: SITEID:1 SEQID:0 TRXID:0 STATE:HY000 CODE: 1031 ROWID:NULL ERR:[Oracle][ODBC][Ora]ORA-01031: insufficient privileges
PUB[ERROR]: insufficient privileges or no privileges
EXE[ERROR]: SITEID:1 SEQID:0 TRXID:0 STATE:HY000 CODE: 1031 ROWID:NULL ERR:[Oracle][ODBC][Ora]ORA-01031: insufficient privileges
PUB[ERROR]: insufficient privileges or no privileges
EXE[INFO]: waiting for SITEID:1 transaction complete percent: 15%
浮点数例外(吐核)
[oracle@xxg120 bin]$
将这两个sql拿到oracle端直接执行也是报错权限不足,但是用于连接oracle的用户给了dba权限:
下图可以看到,student2和grade两个表都已经创建成功了
上面的select语句涉及以下三张表,oracle端直接查询以下三张表:
select * from SYS.COL$;
select * from SYS.OBJ$;
select * from SYS.USER$;
查询第三张表的时候报错权限不足:
sqlplus / as SYSDBA
grant select on SYS.USER$ to C##PAY;
4. invalid identifier
装载数据的时候 COPY 0 "SCH.NAME='PAY'" CREATE|CHECK|INSERT|REG|THREAD|8|count
报错标识符无效:
EXE[ERROR]: SITEID:1 SEQID:0 TRXID:0 LAST ROWID:NULL SQL_ERROR = SQL:--dmhs ddl, siteid:1, level:2, mask:1
ALTER TABLE "C##PAY"."T_check" ADD CONSTRAINT "HS1059_CONS134218780" CHECK( c1 > 10 )
EXE[WARN]: SITEID:1 SEQID:0 TRXID:0 STATE:42S22 CODE: 904 ROWID:NULL ERR:[Oracle][ODBC][Ora]ORA-00904: "C1": invalid identifier
SQL:--dmhs ddl, siteid:1, level:2, mask:1
ALTER TABLE "C##PAY"."T_check" ADD CONSTRAINT "HS1059_CONS134218780" CHECK( c1 > 10 )
将这条alter语句复制到oracle里,执行后发现 check(c1>10)被默认转换成了大写,而DM源端(大小写不敏感)里这一列是小写的,带上双引号后,oracle端能执行成功。
目的端(oracle)hs前台日志里发现T_check的建表语句如下:
CREATE TABLE "C##PAY"."T_check"("c1" INT NOT NULL,"c2" CHAR(1) NULL, CONSTRAINT "HS1059_CONS134218781" PRIMARY KEY("c1"))
说明创建表的时候c1列都会带上双引号,但是添加索引的时候却不带上双引号。
注意:基准数据的同步不要使用copy,建议使用DTS完成,这样不容易出错。
5. Driver's SQLAllocHandle on SQL_HANDLE_HENV failed
开机自启的时候:oracle端hs报错:
2022-04-29 11:57:48 EXE[ERROR]: SITEID:0 SEQID:0 TRXID:0 STATE:IM004 CODE: 0 ERR:[unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed
2022-04-29 11:57:48 EXE[ERROR]: unable to connect database!
2022-04-29 11:57:58 MGR[ERROR]: connection from 192.168.1.101 require LSN,but cannot get because it is not initial
2022-04-29 11:57:58 MGR[INFO]: connection from 192.168.1.101(dmhs_server) has broken!
并且./DmhsServiceHS restart后就不会报这个错了。
这是因为开机的时候dmhs在oracle前启动了,导致连不上数据库。
解决:
在开机自启文件/etc/rc.local里加上重启hs的命令,注意写在oracle数据库启动命令的后面。
su - oracle -c "/oracle/app/product/db_1/bin/lsnrctl start"
su - oracle -c "/oracle/app/product/db_1/bin/dbstart"
su - oracle -c "/home/oracle/dmhs/bin/DmhsServiceHS stop"
su - oracle -c "/home/oracle/dmhs/bin/DmhsServiceHS start"
更多相关资料请参考达梦云适配中心: