暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DMHS ORACLE RAC同步达梦数据库实践

原创 谈笑人生 2022-07-12
2448

DMHS主要有3个模块

CPT,日志分析,捕获并装载源端数据库的redo日志,会连接源端数据库。

NET,消息发送,将CPT捕获的内容发往EXEC。

EXEC,数据入库,将收到的内容进行执行,会连接目的端数据库。

另有一个模块用于管理上方这3个模块——MGR,它可以启动并加载这3个模块,类似个中控台。

达梦数据库端

开启归档和逻辑日志

编辑服务器配置文件dm.ini,修改如下:

ARCH_INI = 1

RLOG_APPEND_LOGIC = 1

#新建dmarch.ini配置文件

vim dmarch.ini

[ARCHIVE_LOCAL1]

ARCH_TYPE = LOCAL

ARCH_DEST = /dmarch #归档目录,输入自己的归档目录

ARCH_FILE_SIZE = 128 #归档文件大小,单位 MB

ARCH_SPACE_LIMIT = 0 #空间大小限制,0 表示不限制

重启数据库服务

检查归档配置是否正确

disql执行命令:

SELECT ARCH_DEST, ARCH_FILE_SIZE FROM SYS.V$DM_ARCH_INI WHERE ARCH_TYPE='LOCAL' AND ARCH_IS_VALID='Y';

检查逻辑日志配置是否正确

SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_LOGIC';

检查在线日志

SELECT PATH FROM SYS.V$RLOGFILE;

检查FAST_COMMIT参数是否为0

select para_value from v$dm_ini where para_name = 'FAST_COMMIT';

oracle端

二、开启归档

当同步源数据库是 Oracle 时,必须开启 Oracle 的归档日志,请按照以下顺序进行操作,相关操作命令如下所示。

1.查看当前归档模式,确认是否开启归档日志

SQL> ARCHIVE LOG LIST;

2. 如果未开启归档日志,应首先关闭 Oracle 服务,准备开启归档日志。

SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP MOUNT;

SQL> ALTER DATABASE ARCHIVELOG;

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST='/arch';

SQL> ALTER DATABASE OPEN;

三、开启最小附加日志

当同步源数据库是 Oracle 时,还必须开启最小附加日志;并且当同步表不包含主键,还需要开启数据库级补充日志。相关操作命令如下所示。

1.开启最小附加日志。

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

2.查看最小附加日志是否开启。

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

检查回收站需要关闭

SQL> show parameter recycle;

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

buffer_pool_recycle string

db_recycle_cache_size big integer 0

recyclebin string OF

关闭回收站语句

alter system set recyclebin=off deferred;

检查odbc配置

lrwxrwxrwx 1 oracle oinstall 57 Aug 16 08:30 libclntsh.so -> /u01/app/oracle/product/11.2.0/db_1/lib/libclntsh.so.11.1

lrwxrwxrwx 1 oracle oinstall 52 Aug 16 08:28 libclntsh.so.10.1 -> /u01/app/oracle/product/11.2.0/db_1/lib/libclntsh.so

当同步源数据库是 Oracle 时,DMHS 使用具有以下限制:

1.启动 DMHS 的用户必须具有DBA权限,并和 Oracle 的安装用户位于同一用户组中。如果没有DBA权限,那么需要赋予如下权限(例如用户为“dmhs”):

grant select any table to dmhs;

grant select any dictionary to dmhs;

grant create session to dmhs;

grant lock any table to dmhs;

grant execute on dbms_flashback to dmhs;

四、RAC的支持

当同步源数据库是 Oracle 时,DMHS支持 ASM 类型和裸设备的 RAC,并且需要注意以下事项。

1. DMHS必须安装Oracle RAC环境中的任意一个节点上,以便DMHS可以访问到共享磁盘上的日志文件。

2. 必须要检查RAC集群中所有节点的时钟同步情况。RAC集群中所有的节点的时钟必须同步,缺省容忍节点间有3秒的误差,如果允许容忍时间超过3秒,请修改对应的epoch参数。

3. 为了确保DMHS可以连接到ASM实例,需要在“tnsnames.ora”文件中进行配置ASM实例。配置方法示例如下:

4. DMHS开启Oracle RAC同步时,配置文件中必须开启RAC选项,配置RAC实例连接的用户名和密码。当需要动态增加或减少RAC集群连接节点时,需要修改配置文件中的节点数,并重启DMHS方能生效。

5. 对于裸设备的RAC,归档文件是在本地文件系统,需要对节点上的归档目录进行nfs配置,实现共享。

五、用户

1创建\删除用户

登录到system以创建其他用户

SQL> connect / as sysdba

SQL> create user dmhs identified by "dba.com";

SQL> grant connect, resource to dmhs;

授权用户

GRANT SELECT ON SYS.V_$DATABASE TO DMHS;

GRANT SELECT ON SYS.V_$SESSION TO DMHS;

GRANT SELECT ON SYS.GV_$PARAMETER TO DMHS;

GRANT SELECT ON SYS.GV_$INSTANCE TO DMHS;

GRANT SELECT ON SYS.GV_$ARCHIVE_DEST TO DMHS;

GRANT SELECT ON SYS.GV_$ARCHIVE TO DMHS;

GRANT SELECT ON SYS.GV_$LOG TO DMHS;

GRANT SELECT ON SYS.GV_$LOGFILE TO DMHS;

GRANT SELECT ON SYS.DBA_TABLES TO DMHS;

GRANT SELECT ON SYS.V_$INSTANCE TO DMHS;

GRANT SELECT ON SYS.OBJ$ TO DMHS;

GRANT SELECT ON SYS.USER$ TO DMHS;

GRANT SELECT ON SYS.COL$ TO DMHS;

GRANT SELECT ON SYS.DBA_CONS_COLUMNS TO DMHS;

GRANT SELECT ON SYS.DBA_CONSTRAINTS TO DMHS;

GRANT SELECT ON SYS.LOB$ TO DMHS;

GRANT SELECT ON SYS.TABPART$ TO DMHS;

GRANT SELECT ON SYS.TAB$ TO DMHS;

GRANT SELECT ON SYS.TABSUBPART$ TO DMHS;

GRANT SELECT ON SYS.TABCOMPART$ TO DMHS;

GRANT EXECUTE ON DBMS_FLASHBACK TO DMHS;

GRANT CREATE ANY TABLE TO DMHS;

GRANT LOCK ANY TABLE TO DMHS;

GRANT SELECT ANY TABLE TO DMHS;

GRANT CREATE ANY VIEW TO DMHS;

GRANT SELECT ANY DICTIONARY TO DMHS;

GRANT FLASHBACK ANY TABLE TO DMHS;

执行DDL同步脚本

SQL> start 目录/ddl_sql_ora.sql

配置dmhs.hs文件【目的端】

进dmhs的bin目录,创建配置文件dmhs.hs

<?xml version="1.0" encoding="GB2312"?>

<dmhs>

<base> <!-- 管理模块的基本配置 -->

<lang>en</lang> <!-- 语言选项,ch 为中文,en 为英文 -->

<mgr_port>5345</mgr_port> <!-- 管理端口号,默认为5345-->

<ckpt_interval>60</ckpt_interval> <!-- 检查点间隔,默认60 -->

<siteid>2</siteid> <!-- 站点ID,这个ID配置时要注意,全局唯一,最小值0,最大值65535 -->

<version>2.0</version>

</base>

<exec> <!-- 执行模块的基本配置 -->

<recv>

<data_port>5346</data_port> <!-- 当数据传递采用网络直连时,需要配置该参数,表明同步数据从该端口号获取。 -->

</recv>

<db_type>dm8</db_type> <!-- 目标端数据库类型 -->

<db_server>192.168.1.135</db_server> <!-- 目标端数据库服务名或IP -->

<db_user>TEST</db_user> <!-- 目标端数据库用户 -->

<db_pwd>test12345678</db_pwd> <!-- 用户的密码 -->

<db_port>5237</db_port> <!-- 目标端数据库端口 -->

<db_name></db_name> <!-- 默认数据库名,默认为空串(只针对dm6有用)-->

<exec_thr>4</exec_thr> <!-- 执行线程个数,只有当 exec_mode 为 1 时才会生效!默认为1 -->

<exec_sql>1024</exec_sql> <!-- SQL 缓存大小,默认为 512M -->

<exec_trx> 5000 </exec_trx> <!-- 事务缓存个数,默认为 5000 -->

<exec_rows>1000</exec_rows> <!-- 批量绑定行数,默认为 250 -->

</exec>

</dmhs>

【源端】

进dmhs的bin目录,创建配置文件dmhs.hs

vim dmhs.hs

<?xml version="1.0" encoding="GB2312"?>

<dmhs>

<base> <!-- 管理模块的基本配置 -->

<lang>en</lang>

<mgr_port>5345</mgr_port>

<ckpt_interval>45</ckpt_interval>

<siteid>1</siteid> <!-- 站点ID,这个ID配置时要注意,全局唯一,最小值0,最大值65535 -->

<version>2.0</version>

</base>

<cpt> <!-- 捕获器模块,这项配置可以配置多个 -->

<db_type>ORACLE11g</db_type> <!-- 源端数据库类型 -->

<db_server>orcl</db_server> <!-- 源端数据库服务名,DM8和ORACLE为OCI连接的服务名,DM6为连接的服务器IP -->

<db_user>dmhs</db_user> <!-- 源端数据库用户名 -->

<db_pwd>dba.com</db_pwd> <!-- 用户的密码 -->

<db_port>1521</db_port> <!-- 源端数据库端口 -->

<ddl_mask>TABLE:VIEW:INDEX:OP</ddl_mask> <!--DDL配置项,写的是掩码,需同步DDL时使用,详见末尾-->

<arch> <!--归档信息配置,该标签是一个功能标签,需要配置它的子项-->

<clear_interval>600</clear_interval> <!--归档日志清理间隔,取值范围在60-65535,单位秒 -->

<clear_flag>0</clear_flag> <!--归档日志清理选项,选配0(不操作),默认为0 -->

</arch>

<send> <!-- 此处仅以发送到网络为例,其他配置详见本手册 4.2NET 发送子模块 -->

<ip>192.168.3.79</ip> <!-- 目标端dmhs的服务器ip -->

<mgr_port>5345</mgr_port> <!-- 目标端dmhs的管理端口号 -->

<data_port>5346</data_port> <!-- 目标端dmhs的data_port -->

<filter> <!-- 过滤配置项,必须指定 -->

<enable> <!-- 白名单,允许同步所有的表 -->

<item>TEST.*</item> <!-- 要同步的模式名.表名,*代表所有 -->

</enable>

</filter>

<map> <!--映射配置项-->

<item>TEST.*==TEST.*</item> <!-- 要同步的模式名,左边是源端,右边是目标端 -->

</map>

</send>

</cpt>

</dmhs>

目的端开启、验证dmhs

【开启dmhs】

  1. 先前台启动,方便查阅。进dmhs的bin目录

./dmhs_server

(2)若报错找不到.so,可以ldd查看下libcpt_ora.so

ldd libcpt_ora.so

(3)可以看到需要的.so文件。缺少的.so文件,去stat目录查找,找到后复制到bin目录下。或切换root用户全盘找

(4)再次启动,没看到MGR[ERROR]的报错就可以了。

【验证dmhs】

新开一个会话窗口,上面server的会话窗口不要最小化,放到方便查看的地方。

(1)新会话窗口进入bin目录,执行:

./dmhs_console

(2)连接目的端dmhs

DMHS> connect 127.0.0.1:5345

execute success

(3)启动exec

DMHS> start exec

execute succes

(4)此时查看server的窗口,没有报错就ok

源端开启、验证dmhs

【开启dmhs】

也是前台启动,方式、报错处理等都跟“6、目的端开启、验证dmhs”的【开启dmhs】相同。

【验证dmhs】

新开一个会话窗口,上面server的会话窗口不要最小化,放到方便查看的地方。

因为源端这边要验证dmhs的cpt,需要目的端配合,所以要开启目的端并start exec

先开启目的端exec,再开启源端cpt,否则报错连不上目的端。

  1. 新会话窗口进入bin目录,执行:

./dmhs_console

  1. 连接源端dmhs

DMHS> connect 127.0.0.1:5345

execute success

(3)初始化日志起始位置;装载数据,配置同步掩码

DMHS> clear exec lsn

execute success

DMHS> LOAD 0 "SCH.NAME='TEST' AND TAB.NAME='T1'" DICT|CREATE|INSERT

装载数据字典时要clear exec lsn,为了初始化日志的起始位置。

【可选项】还可以新指定日志分析的起始位置: SET EXEC LSN 0

(4)此时源端会将模式TEST下的表T1进行装载。(T1表在“1、环境准备”处就要求建了,若没建的可返回去创建或把TAB.NAME改成别的表,SCH.NAME=是表所在模式,也改下使其对应)

因为dmhs是装载的redo日志,所以如果T1的redo日志没了会装不上(虽然配了归档但谁知道会不会有人动),因此可以再建一张表并插入一点数据使其生成redo日志,同时别忘了修改TAB.NAME='新表名',和SCH.NAME='新表所在模式'

(5)查看源端server会话窗口,有没有报错,没有报错表示正常。

若报错no listener,就是没启动oracle监听,若报错无效的服务名,就是 “4.6 配置listener” 没写好,若报错连不上目的端,就是目的端防火墙没关闭。诸如此类的还有目的端没start exec等。报错.so文件没找到请看 “6、目的端开启、验证dmhs” 。

(6)查看目的端server是否报错,没有报错表示正常。

打开disql或者manager连接达梦数据库dm8,查看刚才那张表T1是否有同步过来。

(7)启动cpt,开启实时同步

DMHS> start cpt

execute success

此时可连接源端oracle数据库再新建一两张表并插入一些数据,看看目的端是否都同步完成。

执行start cpt后,若没有需要同步的redo日志就会报错,属正常现象。

必须先装载日志,即执行COPY或LOAD语句,才能执行start cpt,否则报错

社区地址:https://eco.dameng.com

最后修改时间:2022-07-13 09:49:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论