1 组成部分
由主库,实时备库,守护进程和监视器组成。
也就是在整个配置DG的过程中其实是在配置这几个组成部分。
2 原理
2.1 日志应用原理
采用实时归档来作为主备数据同步的基础。
如下实时归档日志应用流程:

主库生成联机Redo 日志,当触发日志写文件操作后,日志线程先将 RLOG_BUF 发送到备库,备库接收后进行合法性校验(包括日志是否连续、备库状态是否 Open 等),不合法则返回错误信息,合法则作为 KEEP_BUF 保留在内存中,原有 KEEP_BUF 的 Redo 日志加入Apply 任务队列进行Redo 日志重演,并响应主库日志接收成功。如果备库接收日志失败,主库会尝试将状态置为SUSPEND状态,只允许读不允许写,如果SUSPEND状态失败,那么主库会挂起。
2.2 DG结构总图

以上主库,备库,监视器之间通过dmwatcher来互相通信,是数据库实例与监视器之间的信息流转桥梁。也就是监视器通过dmwatcher对数据库实例进行一系列的维护操作,如:Switchover/Takeover/Open force等维护。
以上归档流程反映的是此图中标红部分主备库的日志发送及应用流程。
3 构造达梦DG实时主备系统
3.1 环境说明
操作系统信息:
中标麒麟6.0 内核:2.6.32-220.el6.x86_64
三台机器:
主库:192.168.6.201 主机名:primary-dg
备库:192.168.6.202 主机名:standby-dg
监视:192.168.6.203 主机名:dmmonitor
软件准备:
三台机器分别安装达梦软件,其中主库,创建DM1实例,数据库名DAMENG,DM_HOME=/dm7
规划备库实例为DM2且无需提前创建库,只需要有软件即可。监视机器只需要有软件及可。
3.2 部署步骤
3.2.1 主库
以下涉及到的配置文件所在目录:$DM_HOME/data/DAMENG
- 第一步: 配置dm.ini:
开归档
启mal
改dw端口
具体配置内容:
MAL_INI=1
ARCH_INI=1
DW_PORT=5239
- 第二步:配置mal:
可以利用提供的模板配置,如下拷贝模板文件,再进行修改:
cp /dm7/samples/ini_script/dmmal_example.ini /dm7/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 5 检测的时间间隔
MAL_CONN_FAIL_INTERVAL = 5 连接失败的时间间隔
以上这两项可以不写,取默认值
[MAL_INST1]
MAL_INST_NAME = DM1 (主库实例名)
MAL_HOST = 192.168.6.201 (内网通信ip)
MAL_PORT = 5237 (内网通信端口)
MAL_INST_HOST = 192.168.6.201(外网通信ip)
MAL_INST_PORT = 5236 (外网通信端口与数据库端口一致)
MAL_DW_PORT = 5238 (监听端口,要与监视器通信)
[MAL_INST2]
MAL_INST_NAME = DM2
MAL_HOST = 192.168.6.202
MAL_PORT = 5237
MAL_INST_HOST = 192.168.6.202
MAL_INST_PORT = 5236
MAL_DW_PORT = 5238
- 第三步:配置归档
配置dmarch.ini
[ARCHIVE_REALTIME]---实时归档
ARCH_TYPE = REALTIME (归档类型:实时归档)
ARCH_DEST = DM2 (归档的目的实例)
[ARCHIVE_LOCAL1]---本地归档
ARCH_TYPE = LOCAL
ARCH_DEST = /dm7/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
- 第四步:配置watcher dmwatcher.ini
[GRP1]–>组名,同一个守护组里面的成员组名必须一样
DW_TYPE = GLOBAL 守护类型
DW_MODE = AUTO 是否自动切换,生产中设成manual
DW_ERROR_TIME = 10 远程守护进程故障认定时间
INST_ERROR_TIME = 10 本地实例故障认定时间
INST_OGUID = 453331 守护系统唯一OGUID值,所有的实例要一样
INST_INI = /dm7/data/DAMENG/dm.ini
INST_AUTO_RESTART = 1 打开实例的自动启动功能,是否开机时自动打开,设置为0
INST_RECOVER_TIME = 60 主库守护进程启动恢复的间隔时间
INS_STARTUP_CMD=/dm7/bin/dmserver 命令行方式启动
RLOG_SEND_THRESHOLD=0 指定主库发送日志到备库的时间阀值,默认为关闭
RLOG_APPLY_THRESHOLD=0 指定备库重演日志的时间阀值,默认为关闭
[dmdba@primary-dg DAMENG]$ cat dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_ERROR_TIME = 10
INST_OGUID = 453331
INST_INI = /dm7/data/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD=/dm7/bin/dmserver
INST_RECOVER_TIME = 60
RLOG_SEND_THRESHOLD=0
RLOG_APPLY_THRESHOLD=0
- 第五步:生成dmwatcher控制文件
dmctlcvt TYPE=3 SRC=/dm7/data/DAMENG/dmwatcher.ini DEST=/dm7/data/DAMENG
注意:关键字为大写
- 第六步,将主库的服务关闭,然后将主库数据库文件拷贝到备库
[dmdba@primary-dg dm7]$ scp -r /dm7/data/ 192.168.6.202:/dm7/
3.2.2 配置备库
- 第一步,修改dm.ini
INSTANCE_NAME = DM2 (备库的实例名)
dmmal.ini -->和主库一致,不用修改 - 第二步,修改dmarch.ini
[archive_realtime]
ARCH_DEST = DM1 (指定对端主库)
3.2.3 设置主备库的OGUID
设置主备库oguid
- 第一步:主库启动到mount,将oguid设置为和watcher一样
[dmdba@primary-dg dm7]$ /etc/init.d/DmServiceDM1 start mount
disql sysdba/SYSDBA
SQL> sp_set_oguid(453331); - 第二步:备库启动到mount,将oguid设置为和watcher一样
首先设置.bash_profile环境变量,添加PATH
然后执行如下命令:
[dmdba@standby-dg ~]$ dmserver /dm7/data/DAMENG/dm.ini mount
[dmdba@standby-dg ~]$ disql sysdba/SYSDBA
SQL> sp_set_oguid(453331); - 第三步,判断主备库是否一致
主备库分别执行如下语句,判断是否一致:
主库:
SQL> select file_lsn,cur_lsn from v$rlog;
行号 FILE_LSN CUR_LSN
1 40150 40150
备库:
SQL> select file_lsn,cur_lsn from v$rlog;
行号 FILE_LSN CUR_LSN
1 40150 40150 - 第四步:打开主库和备库
主库以主库方式打开:
SQL> alter database primary;
备库以备库方式打开:
SQL> alter database standby;
3.2.4 主备库分别启动watcher
主库:
拷贝控制文件到相应目录:
cp /dm7/data/DAMENG/GRP1/dmwatcher.ctl /dm7/data/DAMENG
启动watcher:
[dmdba@primary-dg GRP1]$ dmwatcher /dm7/data/DAMENG/dmwatcher.ini
【问题解决】
[dmdba@primary-dg GRP1]$ dmwatcher /dm7/data/DAMENG/dmwatcher.ini
DMWATCHER[2.1] V7.6.0.197-Build(2019.09.12-112648)ENT
dmwatcher.ctl not exist in path: /dm7/data/DAMENG
fail to read ini file
解决方法:将/dm7/data/DAMENG/GRP1/dmwatcher.ctl 拷贝到/dm7/data/DAMENG/】
备库:
拷贝控制文件到相应目录:
[dmdba@standby-dg GRP1]$ cp /dm7/data/DAMENG/GRP1/dmwatcher.ctl /dm7/data/DAMENG
[dmdba@standby-dg GRP1]$ pwd
/dm7/data/DAMENG/GRP1
启动watcher:
[dmdba@standby-dg GRP1]$ dmwatcher /dm7/data/DAMENG/dmwatcher.ini
DMWATCHER[2.1] V7.6.0.197-Build(2019.09.12-112648)ENT
DMWATCHER[2.1] IS READY
3.2.5 监视器配置
在dmmonitor机器中配置/dm7/dmmonitor.ini
说明:
MON_DW_CONFIRM = 1 确认监视器模式
MON_LOG_PATH = /dm7/data/log 监视器日志文件存放目录
MON_LOG_INTERVAL =60 每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE =32 每个日志文件最大32M
MON_LOG_SPACE_LIMIT =0 不限定日志文件总占用空间
[GRP1] ----->和主备库中的watcher里面的组名一样
MON_INST_OGUID =453331 组GRP1的唯一OGUID值
MON_DW_IP= 192.168.6.202:5238 同 MAL_DW_PORT
MON_DW_IP= 192.168.6.203:5238
[root@dmmonitor dm7]# cat /dm7/dmmonitor.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = /dm7/data/log
MON_LOG_INTERVAL =60
MON_LOG_FILE_SIZE =32
MON_LOG_SPACE_LIMIT =0
MON_INST_OGUID =453331
MON_DW_IP= 192.168.6.202:5238
MON_DW_IP= 192.168.6.201:5238
注:
[GRP1] 组名不要写错,要和主库和备库中的 dmwatcher.ini 中的组名一样,否则会提示:dmmonitor(mid:1590932471) create link to dmwatcher(192.168.6.201:5238) error, code=-6010, oguid or group_name mismatch, please check config!!!
启动监视器:
[dmdba@dmmonitor ~]$ dmmonitor /dm7/dmmonitor.ini

输入show命令,查看状态。





