在之前的博客我们了解了数据守护的理论知识,本篇学习下DW的搭建:
DM7 达梦 数据库 数据守护(Data Watch) (1) — 基本概念
https://www.cndba.cn/dave/article/3665
DM7 达梦 数据库 数据守护(Data Watch) (2) — 主备类型
https://www.cndba.cn/dave/article/3666
DM7 达梦 数据库 数据守护(Data Watch) (3) — 守护进程
https://www.cndba.cn/dave/article/3667
DM7 达梦 数据库 数据守护(Data Watch) (4) — 监视器
https://www.cndba.cn/dave/article/3669
DM7 达梦 数据库 数据守护(Data Watch) (5) — 配置文件
https://www.cndba.cn/dave/article/3670
1 环境说明
本示例中组名为“GRP1”,配置为实时主备,主库命名为“GRP1_DAVE_01”,备库命名为“GRP1_DAVE_02”。
配置环境说明:
主机类型 | IP地址 | 实例名 | 操作系统 |
---|---|---|---|
主库 | 192.168.20.191(外部服务) 192.168.56.191(内部通信) |
GRP1_DAVE_01 | NeoKylin Linux General Server release 6.0 (Dhaulagiri) |
备库 | 192.168.20.192(外部服务) 192.168.56.192(内部通信) |
GRP1_DAVE_02 | NeoKylin Linux General Server release 6.0 (Dhaulagiri) |
监控 | 192.168.56.190 | NeoKylin Linux General Server release 6.0 (Dhaulagiri) |
端口规划:
实例名 | PORT_NUM | DW_PORT | MAL_HOST | MAL_PORT | MAL_DW_PORT |
---|---|---|---|---|---|
GRP1_DAVE_01 | 5236 | 5336 | 192.168.56.191 | 5436 | 5536 |
GRP1_DAVE_02 | 5237 | 5337 | 192.168.56.192 | 5437 | 5537 |
2 数据准备
2.1 数据同步说明
配置数据守护之前,必须先同步实例数据,确保两者保持完全一致;主库可以是新初始化的数据,也可以是正在生产、使用中的数据。DM 提供了两种方式初始化同步实例数据,数据文件拷贝以及备份还原方式。
不能使用分别初始化库的方法,原因如下:
1. 每个库都有一个永久魔数(permenant_magic),主库传送日志时会判断这个值是否一样,确保来自同一个库,不同的库传送不了日志。
2. 由于 dminit 初始化数据库时,会生成随机密钥用于加密,每次生成的密钥都不相同,备库无法解析采用主库密钥加密的数据。
2.1.1 数据文件拷贝
如果搭建数据守护之前,数据库系统已经上线运行了,那么我们可以通过拷贝数据文件的方式实现主库和备库的数据同步。具体步骤包括:
- 正常关闭数据库
- 严格按照数据文件在主库上的分布,拷贝数据文件到备库的对应目录
- 如果数据文件统一存放在一个目录下,则直接拷贝整个目录即可
2.1.2 备份还原方式
用户也可以通过脱机备份、脱机还原的方式同步主库和备库数据,更详细的说明可以参考备份恢复相关文档。具体步骤包括:
- 正常关闭数据库
- 进行脱机备份
./dmrman CTLSTMT=”BACKUP DATABASE ‘/dm7/data/DAMENG/dm.ini’ FULL TO BACKUP_FILE1 BACKUPSET ‘/dm7/data/BACKUP_FILE_01’”- 拷贝备份文件到备库所在机器
- 执行脱机数据库还原与恢复
./dmrman CTLSTMT=”RESTORE DATABASE ‘/dm7/data/DAMENG/dm.ini’ FROM BACKUPSET ‘/dm7/data/BACKUP_FILE_01’”
./dmrman CTLSTMT=”RECOVER DATABASE ‘/dm7/data/DAMENG/dm.ini’ FROM BACKUPSET ‘/dm7/data/BACKUP_FILE_01’”
备份文件中会记录原备份库的模式和 OGUID 信息,使用备份文件还原成功后,需要再根据实际配置情况修改数据库的模式和 OGUID 值。
上面的过程使用的是脱机备份,主库是需要关闭的,如果是生产环境,那么我们也可以采用联机备份:
SQL> BACKUP DATABASE FULL BACKUPSET ‘/dm7/data/BACKUP_FILE_01’;
然后将备份文件复制到从库进行恢复。 待环境搭建完成,启动守护进程之后,数据守护系统会将备库重加入数据守护系统,主库的守护进程会自动通知同步数据到备库,最终恢复主备库数据到一致状态。
如果主库的事物量较大,在联机备份之后,又产生了较多的归档,可以对归档文件进行备份,然后通过追加归档的方式同步部分数据,减少通过数据守护系统同步历史数据的时间。
2.1.3 检查数据一致性
依次到每个实例上,切换到执行码目录/dm7/bin,以 mount 方式启动数据库。
./dmserver /dm7/data/DAMENG/dm.ini mount
启动命令行工具 DIsql,分别登录各个实例查询 LSN 值,如果主库和备库的 FILE_LSN和 CUR_LSN 值相同,可以确保数据完全一致。
SQL>select file_LSN, cur_LSN from v$rlog;
--结果如下;
行号 FILE_LSN CUR_LSN
-------- ------------------ --------------------
1 10250 10250
检查实例的永久魔数是否一致:
SQL>select permanent_magic;
--结果如下;
行号 PERMANENT_MAGIC
---------- ---------------
1385101984
确保 LSN 和永久魔数都一致的情况下,正常关闭各个实例,继续配置数据守护。
2.1.4 守护进程控制文件
对于故障场景中,某个全局守护类型的实例所在机器故障,数据无法继续使用的情况下,从当前的有效主库直接拷贝数据文件或者备份还原方式重新准备数据后,需要同时拷贝主库的守护进程控制文件 dmwatcher.ctl 到实例的数据文件目录下。
2.2 同步初始化数据
我们这里使用DMRMAN 备份进行数据同步。
2.2.1创建主库实例
DM7 达梦数据库 通过dminit 创建 并 注册 数据库实例
https://www.cndba.cn/dave/article/3580
在主库使用dminit 创建GRP1_DAVE_01实例:
[dave@www.cndba.cn1 ~]$ dminit PATH=/dm/dmdbms/data DB_NAME=GRP1_DAVE_01 INSTANCE_NAME=GRP1_DAVE_01
initdb V7.6.0.95-Build(2018.09.13-97108)ENT
db version: 0x7000a
file dm.key not found, use default license!
License will expire in 14 day(s) on 2019-09-26
log file path: /dm/dmdbms/data/GRP1_DAVE_01/GRP1_DAVE_0101.log
log file path: /dm/dmdbms/data/GRP1_DAVE_01/GRP1_DAVE_0102.log
write to dir [/dm/dmdbms/data/GRP1_DAVE_01].
create dm database success. 2019-09-12 10:01:18
[dave@www.cndba.cn1 ~]$
[root@dm1 ~]# /dm/dmdbms/script/root/dm_service_installer.sh -t dmserver -i /dm/dmdbms/data/GRP1_DAVE_01/dm.ini -p GRP1_DAVE_01
移动服务脚本文件(/dm/dmdbms/bin/DmServiceGRP1_DAVE_01 到 /etc/rc.d/init.d/DmServiceGRP1_DAVE_01)
创建服务(DmServiceGRP1_DAVE_01)完成
[root@dm1 ~]#
[dave@www.cndba.cn1 ~]$ service DmServiceGRP1_DAVE_01 start
Starting DmServiceGRP1_DAVE_01: [ OK ]
[dave@www.cndba.cn1 ~]$
2.2.2 使用DMRMAN备份主库
我们这里采用联机热备方式进行,避免主库停机:
SQL> backup database full backupset '/dm/dwbak/dave_full_01';
executed successfully
used time: 00:00:01.268. Execute id is 836.
SQL>
[dave@www.cndba.cn1 dwbak]$ scp -r dave_full_01 192.168.20.192:`pwd`
dmdba@192.168.20.192's password:
dave_full_01.bak 100% 40MB 39.5MB/s 00:01
dave_full_01_1.bak 100% 241KB 241.0KB/s 00:00
dave_full_01.meta 100% 73KB 72.5KB/s 00:00
[dave@www.cndba.cn1 dwbak]$ s
2.2.3 初始化备份并恢复数据
[dave@www.cndba.cn2 bin]$ dminit PATH=/dm/dmdbms/data DB_NAME=GRP1_DAVE_02 INSTANCE_NAME=GRP1_DAVE_02
initdb V7.6.0.95-Build(2018.09.13-97108)ENT
db version: 0x7000a
file dm.key not found, use default license!
License will expire in 14 day(s) on 2019-09-26
log file path: /dm/dmdbms/data/GRP1_DAVE_02/GRP1_DAVE_0201.log
log file path: /dm/dmdbms/data/GRP1_DAVE_02/GRP1_DAVE_0202.log
write to dir [/dm/dmdbms/data/GRP1_DAVE_02].
create dm database success. 2019-09-12 10:48:23
[dave@www.cndba.cn2 bin]$
[root@dm2 ~]# /dm/dmdbms/script/root/dm_service_installer.sh -t dmserver -i /dm/dmdbms/data/GRP1_DAVE_02/dm.ini -p GRP1_DAVE_02
Move the service script file(/dm/dmdbms/bin/DmServiceGRP1_DAVE_02 to /etc/rc.d/init.d/DmServiceGRP1_DAVE_02)
Finished to create the service (DmServiceGRP1_DAVE_02)
[root@dm2 ~]#
[dave@www.cndba.cn2 bin]$ pwd
/dm/dmdbms/bin
[dave@www.cndba.cn2 bin]$ ./dmrman CTLSTMT="RESTORE DATABASE '/dm/dmdbms/data/GRP1_DAVE_02/dm.ini' FROM BACKUPSET '/dm/dwbak/dave_full_01'"
dmrman V7.6.0.95-Build(2018.09.13-97108)ENT
RESTORE DATABASE '/dm/dmdbms/data/GRP1_DAVE_02/dm.ini' FROM BACKUPSET '/dm/dwbak/dave_full_01'
file dm.key not found, use default license!
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running, write dmrman info.
[-7105]:Pipe connect timeout
[dave@www.cndba.cn2 bin]$ ./dmrman CTLSTMT="RESTORE DATABASE '/dm/dmdbms/data/GRP1_DAVE_02/dm.ini' FROM BACKUPSET '/dm/dwbak/dave_full_01'"
dmrman V7.6.0.95-Build(2018.09.13-97108)ENT
RESTORE DATABASE '/dm/dmdbms/data/GRP1_DAVE_02/dm.ini' FROM BACKUPSET '/dm/dwbak/dave_full_01'
file dm.key not found, use default license!
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[4].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[3].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[2].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[1].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[0].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running, write dmrman info.
RESTORE DATABASE CHECK......
RESTORE DATABASE , dbf collect......
RESTORE DATABASE , dbf refresh ......
RESTORE BACKUPSET [/dm/dwbak/dave_full_01] START......
total 4 packages processed...
RESTORE DATABASE , UPDATE ctl file......
RESTORE DATABASE , REBUILD key file......
RESTORE DATABASE , CHECK db info......
RESTORE DATABASE , UPDATE db info......
total 5 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 8142.647(ms)
[dave@www.cndba.cn2 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/dm/dmdbms/data/GRP1_DAVE_02/dm.ini' FROM BACKUPSET '/dm/dwbak/dave_full_01'"
dmrman V7.6.0.95-Build(2018.09.13-97108)ENT
RECOVER DATABASE '/dm/dmdbms/data/GRP1_DAVE_02/dm.ini' FROM BACKUPSET '/dm/dwbak/dave_full_01'
file dm.key not found, use default license!
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[4].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[3].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[2].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[1].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running...[0].
checking if the database under system path [/dm/dmdbms/data/GRP1_DAVE_02] is running, write dmrman info.
EP[0] max_lsn: 39219
RESTORE RLOG CHECK......
RESTORE RLOG ,gen tmp file......
RESTORE RLOG FROM BACKUPSET [/dm/dwbak/dave_full_01] START......
total 0 packages processed...
total 2 packages processed!
CMD END.CODE:[0]
EP[0] Recover LSN from 39220 to 40403.
Recover from archive log finished, time used:0.059s.
recover successfully!
time used: 7028.506(ms)
[dave@www.cndba.cn2 bin]$
3 配置主库 GRP1_DAVE_01
3.1 配置 dm.ini
配置主库的实例名为 GRP1_DAVE_01,dm.ini 参数修改如下:
#实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_DAVE_01
PORT_NUM = 5236 #数据库实例监听端口
DW_PORT = 5336 #守护环境下,监听守护进程连接端口
DW_ERROR_TIME = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
HA_INST_CHECK_FLAG = 1 #检测是否多个实例进程同时启动
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
3.2 配置 dmmal.ini
配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致,MAL_HOST 使用内部网络 IP,MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值,MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_DAVE_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.56.191 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5436 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.20.191 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 5536 #实例对应的守护进程监听 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_DAVE_02
MAL_HOST = 192.168.56.192
MAL_PORT = 5437
MAL_INST_HOST = 192.168.20.192
MAL_INST_PORT = 5237
MAL_DW_PORT = 5537
3.3 配置 dmarch.ini
修改 dmarch.ini,配置本地归档和实时归档。除了本地归档外,其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时,需要同步归档数据的目标实例名。
当前实例 GRP1_DAVE_01 是主库,需要向 GRP1_DAVE_02(实时备库)同步数据,因此实时归档的 ARCH_DEST 配置为 GRP1_DAVE_02。
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_DAVE_02 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/dmarch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
3.4 配置 dmwatcher.ini
修改 dmwatcher.ini 配置守护进程,配置为全局守护类型,使用自动切换模式。
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dm/dmdbms/data/GRP1_DAVE_01/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
3.5 配置 dmwatcher.ctl
同一个守护进程组,必须使用同一份 dmwatcher.ctl。因此,只需要使用 dmctlcvt 工具生成一份 dmwatcher.ctl 文件,然后分别拷贝到各个数据库目录下即可。
在配置完成 dmwatcher.ini 后,使用 dmctlcvt 工具生成 dmwatcher.ctl:
[dave@www.cndba.cn1 GRP1_DAVE_01]$ dmctlcvt TYPE=3 SRC=/dm/dmdbms/data/GRP1_DAVE_01/dmwatcher.ini DEST=/dm/dmdbms/data/GRP1_DAVE_01
DMCTLCVT V7.6.0.95-Build(2018.09.13-97108)ENT
Can not open ini file !
convert txt to ctl success!
[dave@www.cndba.cn1 GRP1_DAVE_01]$
[dave@www.cndba.cn1 GRP1]$ pwd
/dm/dmdbms/data/GRP1_DAVE_01/GRP1
[dave@www.cndba.cn1 GRP1]$ ll
总用量 4
-rw-r--r-- 1 dmdba dinstall 512 9月 12 11:31 dmwatcher.ctl
[dave@www.cndba.cn1 GRP1]$
#默认生成控制文件有个子目录,需要移动到父目录中:
#拷贝生成的 dmwatcher.ctl 文件到数据文件目录/dm/dmdbms/data/GRP1_DAVE_01。
[dave@www.cndba.cn1 GRP1_DAVE_01]$ cd GRP1
[dave@www.cndba.cn1 GRP1]$ ls
dmwatcher.ctl
[dave@www.cndba.cn1 GRP1]$ mv dmwatcher.ctl ../
3.6 启动主库
以 mount 方式启动主库
[dave@www.cndba.cn1 bin]$ dmserver /dm/dmdbms/data/GRP1_DAVE_01/dm.ini mount
一定要以 mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。
3.7 设置 OGUID
启动命令行工具 DIsql,登录主库设置 OGUID 值。
SQL>sp_set_oguid(453331);
系统通过 OGUID 值确定一个守护进程组,由用户保证 OGUID 值的唯一性,并确保数据守护系统中,数据库、守护进程和监视器配置相同的 OGUID 值。
3.8 修改数据库模式
启动命令行工具 DIsql,登录主库修改数据库为 primary 模式
SQL>alter database primary;
4 配置备库 GRP1_DAVE_02
4.1 配置 dm.ini
在备库机器上配置备库的实例名为 GRP1_DAVE_02,dm.ini 参数修改如下:
#实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_DAVE_02
PORT_NUM = 5237 #数据库实例监听端口
DW_PORT = 5337 #守护环境下,监听守护进程连接端口
DW_ERROR_TIME = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
HA_INST_CHECK_FLAG = 1 #检测是否多个实例进程同时启动
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志重演信息
4.2 配置 dmmal.ini
配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致,MAL_HOST 使用内部网络 IP,MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值,MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_DAVE_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.56.191 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5436 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.20.191 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 5536 #实例对应的守护进程监听 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_DAVE_02
MAL_HOST = 192.168.56.192
MAL_PORT = 5437
MAL_INST_HOST = 192.168.20.192
MAL_INST_PORT = 5237
MAL_DW_PORT = 5537
4.3 配置 dmarch.ini
修改 dmarch.ini,配置本地归档和实时归档。除了本地归档外,其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时,需要同步归档数据的目标实例名。
当前实例 GRP1_DAVE_02 是备库,守护系统配置完成后,可能在各种故障处理中,GRP1_DAVE_02 切换为新的主库,正常情况下,GRP1_DAVE_01 会切换为新的备库,需要向GRP1_DAVE_01 同步数据,因此实时归档的 ARCH_DEST 配置为 GRP1_DAVE_01。
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_DAVE_01 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/dmarch #本地归档文件路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
4.4 配置 dmwatcher.ini
修改 dmwatcher.ini 配置守护进程,配置为全局守护类型,使用自动切换模式。
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dm/dmdbms/data/GRP1_DAVE_02/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/dmserver #命令行方式启动
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
4.5 配置 dmwatcher.ctl
同一个守护进程组,必须使用同一份 dmwatcher.ctl 文件,这里直接拷贝配置主库时已经生成的 dmwatcher.ctl 到本地数据文件目录/dm7/data/GRP1_DAVE_02。
[dave@www.cndba.cn1 GRP1]$ scp dmwatcher.ctl 192.168.20.192:/dm/dmdbms/data/GRP1_DAVE_02/dmwatcher.ctl
dmdba@192.168.20.192's password:
dmwatcher.ctl 100% 512 0.5KB/s 00:00
[dave@www.cndba.cn1 GRP1]$
4.6 启动备库
以 mount 方式启动备库
[dave@www.cndba.cn2 bin]$ dmserver /dm/dmdbms/data/GRP1_DAVE_02/dm.ini mount
一定要以 mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。
4.7 设置 OGUID
启动命令行工具 DIsql,登录备库设置 OGUID 值为 453331
[dave@www.cndba.cn2 GRP1_DAVE_02]$ disql SYSDBA/SYSDBA@LOCALHOST:5237
Server[LOCALHOST:5237]:mode is normal, state is mount
login used time: 9.605(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT
Connected to: DM 7.1.6.95
SQL> sp_set_oguid(453331);
DMSQL executed successfully
系统通过 OGUID 值确定一个守护进程组,由用户保证 OGUID 值的唯一性,并确保数据守护系统中,数据库、守护进程和监视器配置相同的 OGUID 值。
4.8 修改数据库模式
启动命令行工具 DIsql,登录备库修改数据库为 Standby 模式。
如果当前数据库不是 normal 模式,需要先修改 dm.ini 中 ALTER_MODE_STATUS 值 为 1,允许修改数据库模式,修改 Standby 模式成功后再改回为 0。
如果是 normal 模式,请忽略下面的第 1 步和第 3 步。
#STEP 1:
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
DMSQL executed successfully
used time: 9.822(ms). Execute id is 2.
#STEP 2:
SQL> alter database standby;
executed successfully
used time: 7.475(ms). Execute id is 0.
#STEP 3:
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
DMSQL executed successfully
used time: 9.070(ms). Execute id is 3.
SQL>
5 配置监视器
由于主库和实时备库的守护进程配置为自动切换模式,因此这里选择配置确认监视器。
和普通监视器相比,确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知实时备库接管为新的主库,具有自动故障处理的功能。
故障自动切换模式下,必须配置确认监视器,且确认监视器最多只能配置一个。
在监控节点的/dm/dmdbms/data目录下创建并修改 dmmonitor.ini 配置确认监视器,其中 MON_DW_IP 中的 IP 和 PORT 和dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致。
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /dm/dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.56.191:5536
MON_DW_IP = 192.168.56.192:5537
6 启动守护进程
启动各个主备库上的守护进程:
[dave@www.cndba.cn1 GRP1_DAVE_01]$ dmwatcher /dm/dmdbms/data/GRP1_DAVE_01/dmwatcher.ini
DMWATCHER[2.1] V7.6.0.95-Build(2018.09.13-97108)ENT
DMWATCHER[2.1] IS READY
[dave@www.cndba.cn2 GRP1_DAVE_02]$ dmwatcher /dm/dmdbms/data/GRP1_DAVE_02/dmwatcher.ini
DMWATCHER[2.1] V7.6.0.95-Build(2018.09.13-97108)ENT
DMWATCHER[2.1] IS READY
守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例 Open,并切换为 Open 状态。
7 启动监视器
启动监视器:
[dmdba@monitor dmdbms]$ dmmonitor /dm/dmdbms/data/dmmonitor.ini
[monitor] 2029-03-12 06:13:37: DMMONITOR[2.1] V7.6.0.95-Build(2018.09.13-97108)ENT
[monitor] 2029-03-12 06:13:37: get local ip address failed
[monitor] 2029-03-12 06:13:37: DMMONITOR[2.1] IS READY.
[monitor] 2029-03-12 06:13:37: Received message from(GRP1_DAVE_01)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN SSLSN SLSN
2019-09-12 12:10:02 OPEN OK GRP1_DAVE_01 OPEN PRIMARY VALID 4 58840 58840 58840 58840
[monitor] 2029-03-12 06:13:37: Received message from(GRP1_DAVE_02)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN SSLSN SLSN
2019-09-12 12:09:44 OPEN OK GRP1_DAVE_02 OPEN STANDBY VALID 4 58840 58840 58840 58840
监视器提供一系列命令,支持当前守护系统状态查看以及故障处理,可输入 help 命令,查看各种命令说明使用,结合实际情况选择使用。
至此一主一备的实时数据守护系统搭建完毕,在搭建步骤和各项配置都正确的情况下,在监视器上执行 show 命令,可以监控到所有实例都处于 Open 状态,所有守护进程也都处于 Open 状态,即为正常运行状态。
8 验证
8.1 主库创建测试表
[dave@www.cndba.cn1 ~]$ disql SYSDBA/SYSDBA
Server[LOCALHOST:5236]:mode is primary, state is open
login used time: 9.780(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT
Connected to: DM 7.1.6.95
SQL> create table cndba as select * from sysobjects;
executed successfully
used time: 42.341(ms). Execute id is 4.
SQL> select count(1) from cndba;
LINEID COUNT(1)
---------- --------------------
1 1274
used time: 1.756(ms). Execute id is 5.
SQL>
8.2 备库查询
[dave@www.cndba.cn2 ~]$ disql SYSDBA/SYSDBA@LOCALHOST:5237
Server[LOCALHOST:5237]:mode is standby, state is open
login used time: 20.949(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT
Connected to: DM 7.1.6.95
SQL> select count(1) from cndba;
LINEID COUNT(1)
---------- --------------------
1 1274
used time: 5.907(ms). Execute id is 4.
SQL>
同步正常。
9 注册服务
在上面的测试过程,守护金进程和监视器都是我们直接启动的,如果命令中断,就无法运行。 因此需要将这些注册到服务里,方便管理。 注册过程
[root@dm2 ~]# cd /dm/dmdbms/script/root
[root@dm2 root]# ./dm_service_installer.sh -help
Usage: dm_service_installer.sh -t service_type [-p service_name_postfix] [-i ini_file] [-d dcr_ini_file] [-m open|mount]
or dm_service_installer.sh [ -s service_file_path ]
or dm_service_installer.sh -h
-t Service Type, include: dmimon,dmap,dmserver,dmwatch,dmrww,dmwmon,dmwatcher,dmmonitor,dmcss,dmcssm,dmasmsvr.
-p Service Name Postfix, is invalid for dmimon,dmap.
-i The path of the ini file, is invalid for dmimon,dmap.
-d The path of dmdcr.ini, is valid for dmserver only, select.
-m Set the start modeof the server, include:open or mount, is valid for dmserver only, select.
-s The path of the service script file, if set this parameter, and ignore other parameter.
-h Help
[root@dm2 root]#
DM实例注册参考如下博客,这里不再描述:
DM7 达梦数据库 通过dminit 创建 并 注册 数据库实例
https://www.cndba.cn/dave/article/3580
9.1 注册守护进程
分别在所有节点用root用户执行:
#备库:
#-p 指定的是服务名的后缀:
[root@dm2 root]# ./dm_service_installer.sh -t dmwatcher -i /dm/dmdbms/data/GRP1_DAVE_02/dmwatcher.ini -p dm2
Move the service script file(/dm/dmdbms/bin/DmWatcherServicedm2 to /etc/rc.d/init.d/DmWatcherServicedm2)
Finished to create the service (DmWatcherServicedm2)
[root@dm2 root]#
#主库:
[root@dm1 ~]# /dm/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -i /dm/dmdbms/data/GRP1_DAVE_01/dmwatcher.ini -p dm1
移动服务脚本文件(/dm/dmdbms/bin/DmWatcherServicedm1 到 /etc/rc.d/init.d/DmWatcherServicedm1)
创建服务(DmWatcherServicedm1)完成
[root@dm1 ~]#
#启动服务:
[dave@www.cndba.cn1 GRP1_DAVE_01]$ service DmWatcherServicedm1 start
Starting DmWatcherServicedm1: [ OK ]
[dave@www.cndba.cn1 GRP1_DAVE_01]$
[dave@www.cndba.cn1 GRP1_DAVE_01]$ ps -ef|grep watcher
dmdba 27120 1 0 13:08 pts/3 00:00:00 /dm/dmdbms/bin/svc_ctl_linux dmwatcher /dm/dmdbms/data/GRP1_DAVE_01/dmwatcher.ini
dmdba 27179 25475 0 13:08 pts/3 00:00:00 grep watcher
[dave@www.cndba.cn1 GRP1_DAVE_01]$
[dave@www.cndba.cn2 GRP1_DAVE_02]$ service DmWatcherServicedm2 start
Starting DmWatcherServicedm2: [ OK ]
[dave@www.cndba.cn2 GRP1_DAVE_02]$ ps -ef|grep watcher
dmdba 10889 1 0 13:08 pts/1 00:00:00 /dm/dmdbms/bin/svc_ctl_linux dmwatcher /dm/dmdbms/data/GRP1_DAVE_02/dmwatcher.ini
dmdba 10949 10340 0 13:09 pts/1 00:00:00 grep watcher
[dave@www.cndba.cn2 GRP1_DAVE_02]$
9.2 注册监视器
在监视节点用root用户执行:
[root@monitor ~]# /dm/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -i /dm/dmdbms/data/dmmonitor.ini -p dave
Move the service script file(/dm/dmdbms/bin/DmMonitorServicedave to /etc/rc.d/init.d/DmMonitorServicedave)
Finished to create the service (DmMonitorServicedave)
[root@monitor ~]#
启动service:
[root@monitor ~]# service DmMonitorServicedave start
Starting DmMonitorServicedave: [ OK ]
[root@monitor ~]# ps -ef|grep monitor
avahi 1274 1 0 03:54 ? 00:00:00 avahi-daemon: running [monitor-2.local]
dmdba 22847 1 0 07:10 pts/1 00:00:00 /dm/dmdbms/bin/svc_ctl_linux dmmonitor /dm/dmdbms/data/dmmonitor.ini
root 22865 22525 0 07:11 pts/1 00:00:00 grep monitor
[root@monitor ~]#
至此2节点的数据守护搭建完成。
版权声明:本文为博主原创文章,未经博主允许不得转载。