DMHS 通过解析源数据库的数据库日志来获取数据库数据的增量变化。通常数据库日志中不会记录对象的定义,而是使用一个标识(对象 ID)来代表操作对象。CPT 模块在分析数据库日志的过程中,需要通过对象 ID 来获取对象定义。如果通过连接数据库执行SQL语句来获取对象定义,则可能会存在以下问题。
(1)无法获取当前时刻该对象的定义。当 DMHS同步重启时,源端CPT模块在日志文件中捕获到的有数据修改的表,可能与此刻数据库系统字典表中记录的该修改表对象定义有差异,此时使用数据库系统字典,无法正确获取当前时刻对象的定义。
(2)实时查询源数据库,对数据库性能有影响。
(3)存在源数据库异常问题,导致无法正常获取SQL语句执行结果。
为解决以上问题,DMHS引入了数据字典。
1.功能简介
数据字典的主要功能是为 CPT 模块提供准确的表定义信息。数据字典默认存放在DMHS安装目录DICT中,可修改配置文件指定数据字典的存放路径。
数据字典文件是以表为单位进行保存的,文件名为cptvid_表id.dct。数据字典文件中包含表名、表的所有列信息及表的版本信息等。
2.实现原理
(1)数据字典的生成。
数据字典文件有以下两种生成途径。
一是通过装载命令COPY生成。在装载表时,如果添加掩码DICT,则所有装载的表都会在源端生成数据字典文件,此时数据字典文件表信息版本号为装载表时数据库的当前LSN。
二是在同步过程中生成。在同步过程中,如果源数据库存在创建表的操作,同时该表为需要同步的表,则 CPT 模块会将该表的信息生成数据字典,数据字典的版本号为创建表操作的数据库LSN。
(2)数据字典信息的修改及删除。
交易日志中每个记录表的 DDL 操作,都会引起数据字典信息的修改。当解析到一个表 DDL 操作时,CPT 模块会对该表生成一个新版本的字典,新的表字典版本信息为DDL 操作的数据库 LSN,同时 CPT 模块也会将内存中该表的字典信息修改为新的字典信息。新的表字典信息会追加到该表数据字典的末尾,新的表字典信息长度为 512 的整数倍。
在源数据库中对表进行删除时,CPT 模块将字典文件标记为表已删除,同时将表字典的 LSN 设置为当前 LSN。当源端日志清理线程清理归档文件时,会根据获取的最小LSN判断表字典是否可以删除。表字典LSN小于最小LSN的表字典,都将被删除。
(3)数据字典的使用。
CPT 模块在分析表操作时,必须使用正确的表字典信息,表字典过新或过旧,都可能引起分析错误。
CPT模块在启动时,会读取所有字典文件,然后根据最小LSN,加载正确版本的表字典。当源数据库创建表时,CPT模块会将新表的表信息存放到数据字典中,表信息为当前DDL操作时数据库的LSN。
数据字典装载操作需在dmhs_console工具中输入运行,可使用以下命令。
COPY:字典/数据装载命令。
VID:捕获模块的虚拟编号,该编号从0开始,与DMHS配置文件中日志捕获相同。
过滤条件:装载表对象的过滤条件。其中,SCH.NAME 对应源数据库的模式别名;TAB.NAME 对应源数据库的表别名,必须像写查询语句 WHERE 条件那样拼写要装载表对象的过滤表达式。
DICT:数据字典装载使用 DICT 掩码,该掩码可与其他数据装载掩码同时使用,在这种情况下,DMHS 会首先进行字典装载,然后进行数据装载。进行字典装载时,表字典的LSN为获取表信息时数据库的LSN。
当其他数据装载选项中包含INSERT时,所有装载的表字典都会被保存。
数据字典装载除装载过滤条件中的表字典外,还会装载 DMHS 使用到的数据库系统表字典。所有数据库系统表字典LSN均为0,并且每个只有一个版本信息。