为推进某项目国产数据库适配工作,需完成源端DM8DSC至目的端DM8单机的业务数据同步。该场景属于电网级数据同步需求,对数据可追溯性、操作审计能力有强制要求,需实现过程数据的全链路记录。
选用达梦DRS作为数据同步工具,通过CVT自定义脚本实现DML操作重写,核心依赖DM8的归档日志与逻辑日志捕获能力,将所有DELETE/UPDATE操作转换为INSERT操作,通过自定义标识字段实现过程数据的可追溯性。
数据同步场景(本项目采用)
数据分发场景(扩展架构)
在本项目的同步场景中,需在目标DMDRS中通过CVT完成数据转换(DML操作重写)后,再同步到目标数据库;若为数据分发场景,则需在源DMDRS中完成数据转换后,再分发给多个目标DMDRS并同步至对应数据库。
| 配置项 | 源端(2节点DSC集群) | 目的端(单机环境) |
|---|---|---|
| 数据库版本 | 1-2-94-21.11.11-150650-10038-ENT | 1-2-94-21.11.11-150650-10038-ENT |
| 数据库架构 | DSC环境 | 单机环境 |
| 数据库端口 | 5236 | 5236 |
| DRS版本 | dmdrs_rev168340_x86_rh6_64_20240823 | dmdrs_rev168340_x86_rh6_64_20240823 |
| 操作系统 | CentOS 7.9 | CentOS 7.9 |
create table TEST.T1 (id INTEGER,name VARCHAR2(200));
在目的端所有需同步的表中新增3个过程数据字段,SQL示例如下:
-- 新增操作标识列:I-新增,D-删除
ALTER TABLE TEST.T1 ADD COLUMN BIAOSHI VARCHAR(1) default ('I') ;
-- 新增操作时间列:默认取数据插入时间
ALTER TABLE TEST.T1 ADD COLUMN OP_TIME TIMESTAMP(6) DEFAULT SYSDATE ;
-- 新增自增序列列:记录数据入库顺序
ALTER TABLE TEST.T1 ADD COLUMN ZIZENG BIGINT AUTO_INCREMENT UNIQUE;
源端与目的端均需安装DRS,安装步骤如下:
# 切换至dmdba用户
su - dmdba
# 执行DRS安装包
.dmdrs_rev*.bin -i
Please select the installer's language (E/e:English C/c:Chinese)[E/e]:c
-----------欢迎使用达梦数据复制软件安装工具-----------
输入[exit]可退出安装。
-----------安装目录-----------
指定安装目录[/home/dmdba/dmdrs5]:
-----------安装组件-----------
请选择需要安装的组件
1.安装达梦数据融合管理平台
2.安装代理
请选择安装组件数字序号(使用空格间隔):
未选择组件
"确认?[Y/y(确认选择) or N/n(重新选择)]:y
-----------许可证文件-----------
1.免费试用达梦数据复制软件(必须在试用期范围内使用,反复安装无效,使用时间为3个月)
2.使用许可证文件
指定许可证文件(1,2)[1]:
免费试用许可证文件限制信息如下:
有效日期:2024-08-28
授权顾客名称:DEVELOP USER
项目名称:
许可证编号:dm66n367
版本类型:试用版
授权数据库类型:DM6,DM7,DM8,Oracle,SQL Server,MySQL,DB2,PostgreSQL,Kafka
当前默认许可证文件支持数据库类型为[DM6,DM7,DM8,Oracle,SQL Server,MySQL,DB2,PostgreSQL,Kafka],是否继续安装?[Y/y or N/n]:y
-----------配置-----------
依赖环境配置 -数据库动态库路径[/home/dmdba/dmdbms/bin]:
-----------安装小结-----------
安装目录:[/home/dmdba/dmdrs5]
依赖环境配置-NEED_LIB_PATH:[/home/dmdba/dmdbms/bin]
所需磁盘空间/可用磁盘空间:[1,371 MB/27,992 MB]
确认安装?[Y/y or N/n]:y
-----------安装中-----------
server start ... server finished.
default start ... default finished.
doc start ... doc finished.
安装成功
-----------安装总结-----------
达梦数据复制软件V5安装完成
更多安装信息,请查看安装日志文件:/home/dmdba/dmdrs5/log/install.log
为了保证源DMDRS服务运行中数据的一致性,源DMDRS服务需要读源数据库的归档和逻辑日志,因此源数据库需要开启归档和逻辑日志功能。
设置DM8数据库配置文件“dm.ini”中ARCH_INI参数为1,RLOG_APPEND_LOGIC的参数为1。
-- 开启逻辑日志
CALL SP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',1);
-- 验证参数配置
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN ('RLOG_APPEND_LOGIC');
辅助表方式(推荐)
在源数据库执行“ddl_sql_dm8.sql”脚本创建辅助表,脚本默认位置在DMDRS执行程序目录下的scripts子目录中(/home/dmdba/dmdrs5/bin/scripts/)
cd /home/dmdba/dmdrs5/bin/scripts/
disql SYSDBA/SYSDBA@127.0.0.1:5236
在disql中执行:
SQL> set define off;
SQL> start ddl_sql_dm8.sql
检查是否有效:
select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DRS_$%' and status = 'Y';
select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DRS_$%' and status = 'VALID';
源端与目的端均需创建同步用户并赋予权限:
CREATE USER "DMDRS" IDENTIFIED BY "Dmdrs@123";
GRANT "DBA","RESOURCE","PUBLIC","VTI","SOI","SVI" TO "DMDRS";
DMDRS服务运行过程中,需要使用数据库的驱动文件进行数据库访问。
在终端的配置文件中添加设置环境变量命令。
vi ~/.bash_profile
添加以下内容:
export LD_LIBRARY_PATH=/home/dmdba/dmdbms/drivers/dpi:$LD_LIBRARY_PATH
执行source ~/.bash_profile使环境变量生效,通过echo $LD_LIBRARY_PATH验证配置结果。
源端drs.xml配置文件路径为/home/dmdba/dmdrs5/bin/drs.xml,完整配置如下:
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5345</mgr_port>
<siteid>142</siteid>
<lang>ch-utf8</lang>
<mem_size>4</mem_size>
</base>
<cpt>
<name>CPT</name>
<login>
<dbtype>DM8</dbtype>
<server>DM8DSC</server>
<user>SYSDBA</user>
<pwd>SYSDBA</pwd>
<port>5236</port>
</login>
<ddl_mask>TABLE:ALTER</ddl_mask>
<char_code>GB18030</char_code>
<log_buf_size>512</log_buf_size>
<rac>
<nodes>2</nodes>
<rac_type>ASM</rac_type>
<login>
<server>127.0.0.1</server>
<user>default</user>
<pwd>default</pwd>
<port>9351</port>
</login>
<dir_replace>
<item>0#+DMARCH/ARCH0</item>
<item>1#+DMARCH/ARCH1</item>
</dir_replace>
</rac>
<send>
<ip>192.168.49.131</ip>
<port>5345</port>
<target_name>EXEC</target_name>
<map>
<item>*.*==*.*</item>
</map>
</send>
<load>
<enable>1</enable>
<threads>64</threads>
</load>
</cpt>
</drs>
目的端drs.xml配置文件路径为/home/dmdba/dmdrs5/bin/drs.xml,完整配置如下:
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5345</mgr_port>
<siteid>141</siteid>
<lang>ch-utf8</lang>
</base>
<exec>
<name>EXEC</name>
<login>
<dbtype>DM8</dbtype>
<server>192.168.49.131</server>
<user>SYSDBA</user>
<pwd>SYSDBA</pwd>
<port>5236</port>
</login>
<char_code>GB18030</char_code>
<threads>60</threads>
<load_threads>60</load_threads>
<seq_sync_mode>1</seq_sync_mode>
<cvt_dir>/home/dmdba/dm/dmdrs5/bin/cvt_1</cvt_dir>
<group>
<item>
<id>0</id>
<merge_policy>0</merge_policy>
<error_policy>1</error_policy>
<desc>
<table>*.*</table>
</desc>
<max_thrs>64</max_thrs>
</item>
</group>
</exec>
</drs>
在源DMDRS配置文件的cpt标签或目标DMDRS配置文件的exec标签下增加cvt_dir参数,用来指定CVT脚本所在的目录,DMDRS会解析该目录下所有名称合法的文件。
同步源端过程数据基本配置如下:
TABLE "TEST"."*"
DECLARE
old_cols DRS.DML_COL_ARR;
new_cols DRS.DML_COL_ARR;
i INT;
BEGIN
IF op.#OP = 'UPDATE' THEN
old_cols := op.GET_OLDCOLS();
new_cols := op.GET_NEWCOLS();
op.#op := 'INSERT';
op.set_cols(old_cols);
op.ADD_COL('BIAOSHI', 'D');
DRS_SYS.PUT_LINE('NEW SQL is : '|| op.#SQL);
op.exec();
op.#op :='INSERT';
op.SET_COLS(new_cols);
FOR i IN 1..old_cols.SIZE LOOP
if op.HAS_NEWCOL(old_cols[i].NAME) = 0 then
op.ADD_COL(old_cols[i].NAME, old_cols[i].VALUE);
end if;
end loop;
op.ADD_COL('BIAOSHI', 'I');
DRS_SYS.PUT_LINE('NEW SQL is : '|| op.#SQL);
op.exec();
return;
ELSIF op.#OP ='INSERT' THEN
op.ADD_COL('BIAOSHI', 'I');
DRS_SYS.PUT_LINE('NEW SQL is : '|| op.#SQL);
op.exec();
return;
ELSIF op.#OP ='DELETE' THEN
old_cols := op.GET_OLDCOLS();
op.#OP := 'INSERT';
op.SET_COLS(old_cols);
op.ADD_COL('BIAOSHI', 'D');
DRS_SYS.PUT_LINE('NEW SQL is : '|| op.#SQL);
op.exec();
return;
ELSE
RETURN;
END IF;
END;
脚本逻辑说明:
1.启动源端drs服务
cd /home/dmdba/dmdrs5/bin
./DrsService start
2.启动目标端drs服务
cd /home/dmdba/dmdrs5/bin
./DrsService start
目标DMDRS服务中的EXEC模块默认是自动启动,如需关闭EXEC模块,可输入stop命令。
3.启动源端控制台
./drcsl cpt.xml
4.连接源DMDRS服务
CSL> connect
5.设置lsn
CSL> alter cpt set lsn
6.装载TEST模式字典
CSL>alter cpt add dict "sch.name='TEST'"
7.启动cpt
CSL> start
在源端执行INSERT操作:
INSERT INTO TEST.T1 VALUES (1,'zhangsan');
在目的端执行查询:
SELECT ID, NAME, BIAOSHI, OP_TIME, ZIZENG FROM TEST.T1;
在源端执行UPDATE操作:
UPDATE TEST.T1 SET NAME = 'lisi' WHERE ID = 1;
在目的端执行查询:
SELECT ID, NAME, BIAOSHI, OP_TIME, ZIZENG FROM TEST.T1 WHERE ID = 1 ORDER BY ZIZENG;
预期结果:查询到2条数据,旧数据BIAOSHI为'D',新数据BIAOSHI为'I',ZIZENG按入库顺序递增。
在源端执行DELETE操作:
DELETE FROM TEST.T1 WHERE ID = 1;
在目的端执行查询:
SELECT ID, NAME, BIAOSHI, OP_TIME, ZIZENG FROM TEST.T1 WHERE ID = 1 ORDER BY ZIZENG;
预期结果:新增1条数据,BIAOSHI为'D',保留删除前的完整数据。
使用DMDRS进行DM到DM装载数据时,目的端报错:字符串截断。
源端与目的端表字段长度不匹配,或字符编码差异导致数据长度超出目的端字段限制。
在目的端配置文件drs.xml的exec节点下添加以下参数:
<char_length_expand>4</char_length_expand>
参数说明:同步表列精度需要扩大的倍数,取值范围为0~10,默认值为0。配置后DRS会自动扩大目的端字段长度,避免字符串截断。
配置Oracle到DM(或DM到DM)的DRS数据装载时,报错:执行端内存不足。
DRS服务程序运行时申请的内存超过配置的最大内存上限,导致内存不足。
在目的端drs.xml的base节点下调整mem_size参数:
<mem_size>8</mem_size>
参数说明:服务程序运行时可以申请的最大内存,取值范围0~255(单位:GB),默认值为16。需根据服务器实际内存配置,避免参数值超过物理内存导致系统OOM。
配置DM到DM的DRS数据同步,源端启动DRS服务时报错:DRS-3009 动态库文件加载失败 library_path: libz.so。
DRS启动时无法找到依赖的libz.so动态库,不同DM版本的libz.so依赖库路径存在差异。
[root@db1 ~]# find / -name libz.so
/home/dmdba/dmdbms/bin/dependencies/libz.so
vi ~/.bash_profile
# 添加以下内容
export LD_LIBRARY_PATH=/home/dmdba/dmdbms/bin/dependencies:$LD_LIBRARY_PATH
# 使环境变量生效
source ~/.bash_profile
执行./DrsService start后服务无法启动,日志提示“无法加载数据库驱动”。
LD_LIBRARY_PATH环境变量未正确配置,DRS无法找到DM8驱动文件。
source ~/.bash_profile使环境变量生效;DRS日志提示“列BIAOSHI不存在”。
目的端表未提前创建BIAOSHI列,或脚本中列名书写错误。
ADD_COL的列名与表结构是否一致,注意大小写敏感。文章
阅读量
获赞
