pg到达梦数据库dmhs实时同步搭建
迁移环境如下,对应版本dmhs软件需要向商务申请
源端操作系统
|
kylin v10
|
|
源端库及模式
|
目的端对应用户
|
目的端操作系统
|
kylin v10
|
|
ZHBG.public
|
ZHBG
|
源端cpu构架
|
arm |
|
basedb.public
|
LEAPV6
|
目的端菜谱构架
|
arm |
|
|
|
源端数据库
|
pg11
|
|
|
|
目的端数据库
|
dm8
|
|
|
|
配置odbc(相关安装配置见上篇文档)
添加以下内容:注意驱动名必须是[PostgreSQL ANSI(x64)]//不是这个名字的驱动名,需要在dmhs.hs中指定driver参数明确驱动名
cat /etc/odbcinst.ini
[ PostgreSQL ANSI(x64) ]
Description = ODBC for PostgreSQL
Driver = /usr/lib/psqlodbcw.so
Setup = /usr/lib/libodbcpsqlS.so
Driver64 = /usr/lib64/psqlodbcw.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage = 1
查看pg是否开启归档,如没开启归档需要用户自己开启
源端和目的端安装dmhs软件(源端安装忽略,和目的端安装一样)
[root@0015 ~]# ./dmhs_V4.1.48_pack4_dm8_rev104804_FTarm_kylin4_64_veri_20211228.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.免费试用达梦数据实时同步]:2
Key文件路径:/root/dmhs.key
Key文件限制信息如下:
有效日期:2022-09-25
用户名称:达梦公司产品试用
服务器颁布类型:试用版
发布类型:企业版
Key类型:企业版
授权用户数:无限制
并发连接数:无限制
1.精简版
2.完整版(web客户端)
3.自定义
安装类型[1.精简版]:2
1.实时同步软件服务器
2.远程部署工具
3.实时同步软件客户端
4.内置数据库
5.实时同步软件配置助手
6.手册
所需磁盘空间:691 MB
安装目录: [/opt/dmhs]
该路径不为空,是否继续安装?[Y or N]y
安装路径可能存在覆盖安装
1.统一部署
2.现在初始化
是否初始化达梦数据实时同步系统[1.统一部署]: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.
正在创建快捷方式
安装成功
远程部署工具配置
远程部署工具名称[HsAgent]:
主机Ip(外网)[]():
远程部署工具管理端口[5456](1000-65535):
内置数据库轮询间隔[3](1-60):
内置数据库IP[]:
内置数据库端口[15236]:
内置数据库用户名[SYSDBA]:
内置数据库密码[SYSDBA]:
服务脚本环境变量设置
依赖库路径
提示:此配置项供用户配置源或目的数据库依赖库路径和odbc依赖库路径, 多个路径以":"隔开(例:/opt/dmdbms/bin:/usr/local/lib),此配置项会添加到服务脚本的NEED_LIB_PATH的变量值中。
请配置依赖库路径:/home/dmdba/dmdbms/bin
内置数据库服务
1.自动
2.手动
启动方式:[2.手动]
正在创建内置数据库服务
初始化内置数据库
远程控制服务
1.自动
2.手动
启动方式:[2.手动]
正在创建远程控制服务
web服务
1.自动
2.手动
启动方式:[2.手动]
正在创建web服务
达梦数据实时同步V4.0安装完成
更多安装信息,请查看安装日志文件:
/opt/dmhs/log/install.log
源端和目的端都切换到软件安装/opt/dmhs/bin目录,修改服务名
cp TemplateDmhsService DmhsService
编辑服务名(红色地方路径根据实时情况填写)
vi DmhsService
DMHS_HOME=/dmhs
PROG_DIR=/dmhs/bin
CONF_PATH=/dmhs/bin/dmhs.hs
#REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
NEED_LIB_PATH=
HS_NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
目的达梦端创建迁移用户及需要迁移的 ZHBG和LEAPV6
create tablespace "postgres" datafile '/dbdata/dmdb/postgres.dbf' size 128 autoextend on maxsize 33554431 CACHE = NORMAL;
create user "postgres" identified by "dameng123" default tablespace "postgres" default index tablespace "postgres";
grant "DBA","PUBLIC","VTI","SOI" to postgres;
目的端dmhs.hs配置文件 cat /opt/dmhs/bin/dmhs.hs
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>2</siteid>
<version>2.0</version>
</base>
<exec>
<recv>
<data_port>5346</data_port>
</recv>
<db_type>DM8</db_type>
<db_server>达梦端ip</db_server>
<db_user>postgres</db_user>
<db_pwd>dameng123</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>
<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.hs配置文件 cat /opt/dmhs/bin/dmhs.hs
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<siteid>1</siteid>
<mgr_port>5345</mgr_port>
<chk_interval>3</chk_interval>
<ckpt_interval>60</ckpt_interval>
<lang>en</lang>
<version>2.0</version>
</base>
<cpt>
<db_type>postgres</db_type>
<db_server>pg端ip</db_server>
<db_user>postgres</db_user>
<db_pwd>longrise@123456</db_pwd>
<db_name>ZHBG</db_name>
<db_port>54320</db_port>
<idle_time>300</idle_time>
<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>达梦端ip</ip>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<net_pack_size>256</net_pack_size>
<net_turns>0</net_turns>
<crc_check>0</crc_check>
<trigger>0</trigger>
<constraint>0</constraint>
<identity>0</identity>
<filter>
<enable>
<item>public.*</item>
</enable>
<disable>
</disable>
</filter>
<map>
<item>public.*==ZHBG.*</item>
</map>
</send>
</cpt>
<cpt>
<db_type>postgres</db_type>
<db_server>pg端ip</db_server>
<db_user>postgres</db_user>
<db_pwd>longrise@123456</db_pwd>
<db_name>LEAPV6</db_name>
<db_port>54320</db_port>
<idle_time>300</idle_time>
<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>达梦端ip</ip>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<net_pack_size>256</net_pack_size>
<net_turns>0</net_turns>
<crc_check>0</crc_check>
<trigger>0</trigger>
<constraint>0</constraint>
<identity>0</identity>
<filter>
<enable>
<item>public.*</item>
</enable>
<disable>
</disable>
</filter>
<map>
<item>public.*==LEAPV6.*</item>
</map>
</send>
</cpt>
</dmhs>
目端和目的端分别启动dmhs服务
./DmhsService start
目的端运行 DMHS 软件工具 dmhs_console,连接执行端 DMHS 服务,启动日志执行模块,控制台管理工具中执行如下 DMHS 命令
[
源端执行端运行 DMHS 软件工具dmhs_console,连接源端 DMHS 服务,设置日志捕获模块起始 LSN,装载源端字典信息及历史数据
这里加载模式为public
COPY 0 "SCH.NAME ='public'" DICT|CREATE|COMMENT|INSERT|INDEX|THREAD|8|DROP
加载完之后, 执行 start cpt
数据迁移完之后,在达梦数据库收集一下统计信息
select 'DBMS_STATS.GATHER_SCHEMA_STATS('''||username||''',100,TRUE,''FOR ALL COLUMNS SIZE AUTO'');' from all_users;
源端加载碰到问题如下
/opt/dmhs/bin/log 日志如下报错,缺少libodbc.so.1包
找到libodbc.so包,创建软链接
ln -s /usr/lib64/libodbc.so /lib64/libodbc.so.1
在/opt/dmhs/bin目录下面ldd libcpt_pg.so看下是否缺少其他的依赖包
之后加载又报如下错误(前面配置odbc配置文件 驱动名不是 [PostgreSQL ANSI(x64)] )
迁移常见问题汇总
1.装odbc驱动问题
源码包有问题的,换rpm包,一般本地yum源的postgresql-odbc即可,或者下载对应os版本的驱动rpm包再安装。
2.启动cpt问题
启动报错找不到libcpt_pg.so
ldd libcpt_pg.so
出现缺少的是libodbc.so.1(odbc驱动)
find / -name libodbc.so 文件
位于/usr/lib64/目录,到该目录创建软连接解决:
ln -s libodbc.so libodbc.so.1
3.初始化数据问题1
copy 0 "sch.name='PUBLIC'" CREATE|INSERT|DICT
源端报错找不到PUBLIC模式的任何表,注意pg数据库默认模式名都是小写,需要换成小写即可。
copy 0 "sch.name='public'" CREATE|INSERT|DICT
此时目的端报错不识别对象,需要修改dmhs.hs参数 。2表示转换成大写。
<toggle_case>2</toggle_case>
4.初始化数据库问题2
源端pg库表有默认值引用序列,dm端建表失败,报错无效的默认值表达式。
可以在目的端dmhs.hs中添加ignore_default参数:1为忽略字段默认值。
<ignore_default>1</ignore_default>
需要初始化完成后手工修改表加上默认值。(这个工作量有点大,提需求了,让hs具体schema的识别序列)(最新版hs可以支持默认值引用对应schema的序列)
5.同步数据中文乱码问题
为源端pg库dmhs.hs文件添加参数(pg库字符集是utf8):该参数不设置时,默认值是gb18030
<char_code>PG_UTF8</char_code>
6.目的端同步失败会退出dmhs问题
修改目的端修改dmhs.hs参数,该参数默认为1表示出错中断同步,2表示出错继续同步不保证事务完整性,0表示继续同步但保持事务完整。
<exec_policy>2</exec_policy>
7.无主键同步失败问题
同步表无主键时,dmhs默认以所有字段为联合主键。
pg端表中timestamp小数秒只有3位,达梦是6位小数秒,会自动补齐3位,
update操作时,表无主键,以全部列为主键,小数秒不一致,所以找不到要update的数据,报错。
添加主键后update同步成功。(原则上dmhs只配置有主键的表同步。)
8.字段类型精度不兼容问题
pg库字段类型varchar(10240)精度在dm不兼容的
需要修改类型为text。