实时主备集群规划

dmdbpri 11.50.3.201 ---主机
dmdbstd 11.51.3.201 ---备机
dmdbmon 11.52.3.250 ---监视器(自动模式建议,手动模式可选)

数据库名实例名PORT_NUMMAL_INST_DW_PORTMAL_HOSTMAL_PORTMAL_DW_PORT
DMDBDMDBPRI152364510111.50.3.2015510165101
DMDBDMDBSTD152364512111.51.3.2015512165121

实时主备集群要求实例名不同,数据库名不做要求,为便于管理,我们数据库名保持一致。

主库操作

安装主库

如果没有数据库模版,则参考规范全新安装一台主库。
如果要为正在运行的主库配置数据守护,则执行如下操作:

重新注册服务(MOUNT):

# /dmdb/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceDM
# /dmdb/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /dmdb/dmdata/DMDB/dm.ini -p DM  -m mount

也可以不用重新注册,直接修改 /dmdb/dmdbms/bin/DmServiceDM 文件中的 START_MODE=open 为 START_MODE=mount。
建议注册成 mount,虽然注册成 open 其实也行,因为 primary 或者 standby 会自动启动到 mount 状态。但不排除故障时被直接 open 起来的可能。

关闭主库

$ DmServiceDM stop            <---- 如果是现存运行中的数据库,则关闭        

备份主库

$ dmrman CTLSTMT="BACKUP DATABASE '/dmdb/dmdata/DMDB/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/orabak/BACKUP_FILE_01'" 

编辑数据库配置文件 dm.ini

$ vim /dmdb/dmdata/DMDB/dm.ini
INSTANCE_NAME = DMDBPRI            # 不用改,初始化时自动生成。
PORT_NUM = 15236                # 不用改,初始化时自动生成。
DW_INACTIVE_INTERVAL = 60         # 不用改,默认值。接收守护进程消息超时时间。
ALTER_MODE_STATUS = 0             # 需要修改,默认值为1。不允许手工方式修改实例模式/状态/OGUID。
ENABLE_OFFLINE_TS = 2             # 需要修改,默认值为1。是否允许 OFFLINE 表空间。0:不允许;1:允许;2:备库不允许。注:数据守护环境下建议配置为 2。
MAL_INI = 1                        # 需要修改,默认值为0。打开 MAL 系统。
ARCH_INI = 1                    # 需要修改,默认值为0。打开归档配置。
RLOG_SEND_APPLY_MON = 64        # 不用改,默认值。统计最近 64 次的日志发送信息。

新建 MAL 配置文件

邮件系统(MAL 系统)是一个内部高速通信系统,基于 TCP/IP 协议实现。节点间通信的机制。

$ vim /dmdb/dmdata/DMDB/dmmal.ini

MAL_CHECK_INTERVAL = 5                # 不用改,MAL 链路检测时间间隔,默认30S
MAL_CONN_FAIL_INTERVAL = 5            # 不用改,判定 MAL 链路断开的时间,默认 10S

[MAL_INST1] 
MAL_INST_NAME = DMDBPRI                # 不用改,和 dm.ini 中的 INSTANCE_NAME 一致 
MAL_HOST = 11.50.3.201                # 需要修改,MAL 系统的监听地址,如果规划了内部网络,就用内部网络地址
MAL_PORT = 55101                    # 不用改,MAL 系统的监听端口
MAL_INST_HOST = 11.50.3.201            # 需要修改,实例的对外服务 IP 地址,即连接数据库服务器使用的 IP 地址
MAL_INST_PORT = 15236                # 不用改,实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 65101                    # 不用改,守护进程监听端口,其他守护进程或监视器使用 MAL_HOST + MAL_DW_PORT 创建 TCP 连接
MAL_INST_DW_PORT = 45101            # 不用改,实例对守护进程的监听端口,守护进程使用 MAL_HOST + MAL_INST_DW_PORT 创建到实例的 TCP 连接

[MAL_INST2] 
MAL_INST_NAME = DMDBSTD                # 不用改
MAL_HOST = 11.51.3.201                # 需要修改
MAL_PORT = 55121                    # 不用改
MAL_INST_HOST = 11.51.3.201            # 需要修改
MAL_INST_PORT = 15236                # 不用改
MAL_DW_PORT = 65121                    # 不用改
MAL_INST_DW_PORT = 45121            # 不用改

新建归档配置文件 dmarch.ini

按照我们的标准,直接复制如下内容即可。

$ vim /dmdb/dmdata/DMDB/dmarch.ini


        ARCH_WAIT_APPLY      = 0        

[ARCHIVE_LOCAL1]
        ARCH_TYPE            = LOCAL                     # 归档类型为本地归档   
        ARCH_DEST            = /dmdb/dmarch/DMDB         # 本地归档文件存放路径       
        ARCH_FILE_SIZE       = 1024                      # 单位 Mb,本地单个归档文件最大值      
        ARCH_SPACE_LIMIT     = 10240                    # 单位 Mb,0 表示无限制,范围 1024~2147483647M        
        ARCH_FLUSH_BUF_SIZE  = 2        
        ARCH_HANG_FLAG       = 1        

[ARCHIVE_REALTIME]
        ARCH_TYPE = REALTIME    # 归档类型为实时归档
        ARCH_DEST = DMDBSTD        # 写对端的实例名

新建守护进程配置文件 dmwatcher.ini

对于我们的环境,只需要修改组名和 OGUID 即可。

$ vim /dmdb/dmdata/DMDB/dmwatcher.ini

[DMDB03]                                                #需要修改,我们规划与数据库编号保持一致 
DW_TYPE = GLOBAL                                        #实时主备和读写分离集群需要将守护进程配置为全局守护
DW_MODE = MANUAL                                        #金融场景建议为 MANUAL 手动切换模式,避免误判而发生抖动或脑裂
DW_ERROR_TIME = 10                                        #远程守护进程故障认定时间
INST_RECOVER_TIME = 60                                    #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10                                    #本地实例故障认定时间
INST_OGUID = 453003                                        #需要修改,守护系统唯一 OGUID 值,每套数据守护集群唯一,我们规划003与数据库编号保持一致
INST_INI = /dmdb/dmdata/DMDB/dm.ini                        #dm.ini 配置文件路径
INST_AUTO_RESTART = 1                                    #打开实例的自动启动功能
##INST_STARTUP_CMD = /dmdb/dmdbms/bin/dmserver            #打开实例使用的命令
INST_STARTUP_CMD = /dmdb/dmdbms/bin/DmServiceDM start    #DM工程师推荐使用这种
RLOG_SEND_THRESHOLD = 0                                    #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0                                #指定备库重演日志的时间阈值,默认关闭

启动主库到 mount 状态

$ dmserver /dmdb/dmdata/DMDB/dm.ini mount 或者
$ DmServiceDM start mount

注意:
一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成 Redo 日志。
并且,启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。
数据守护配置结束后,守护进程会自动 Open 数据库。

修改主库的模式和设置oguid。

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); 
SQL>sp_set_oguid(453003);     # 需要修改
SQL>alter database primary;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

系统通过 OGUID 值确定一个守护进程组,由用户保证 OGUID 值的唯一性,并确保数据守护系统中,数据库、守护进程和监视器配置相同的 OGUID 值。

备库操作

安装备库

如果没有数据库模版,则参考规范全新安装一台备库。
如果是从模版生成的数据库备机,则执行如下操作:

关闭 dmdba 的备份 Crond:

$ crontab -e

删除服务和实例:

# systemctl stop DmServiceDM
# /dmdb/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceDM
# rm -fr /dmdb/dmdata/DMDB/

初始化备库实例:

$ dminit PATH=/dmdb/dmdata PAGE_SIZE=32 EXTENT_SIZE=16 CASE_SENSITIVE=1 CHARSET=1 PAGE_CHECK=0 LOG_SIZE=2048 DB_NAME=DMDB  INSTANCE_NAME=DMDBSTD PORT_NUM=15236 SYSDBA_PWD=xxx SYSAUDITOR_PWD=xxx
$ dmserver /dmdb/dmdata/DMDB/dm.ini        # 出现 "SYSTEM IS READY." 后,执行 exit 退出,数据库自动关闭

注册服务:

# /dmdb/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /dmdb/dmdata/DMDB/dm.ini -p DM  -m mount
Created symlink /etc/systemd/system/multi-user.target.wants/DmServiceDM.service → /usr/lib/systemd/system/DmServiceDM.service.

恢复备库

将备份从主库传输到备库后,进行恢复:

$ dmrman CTLSTMT="RESTORE DATABASE '/dmdb/dmdata/DMDB/dm.ini'  FROM BACKUPSET '/orabak/BACKUP_FILE_01'" 
$ dmrman CTLSTMT="RECOVER DATABASE '/dmdb/dmdata/DMDB/dm.ini'  FROM BACKUPSET '/orabak/BACKUP_FILE_01'" 
$ dmrman CTLSTMT="RECOVER DATABASE '/dmdb/dmdata/DMDB/dm.ini'  UPDATE DB_MAGIC"

编辑数据库配置文件

$ vim /dmdb/dmdata/DMDB/dm.ini

INSTANCE_NAME = DMDBSTD            # 不用改,初始化时自动生成。
PORT_NUM = 15236                # 不用改,初始化时自动生成。
DW_INACTIVE_INTERVAL = 60         # 不用改,默认值。接收守护进程消息超时时间。
ALTER_MODE_STATUS = 0             # 需要修改,默认值为1。不允许手工方式修改实例模式/状态/OGUID。
ENABLE_OFFLINE_TS = 2             # 需要修改,默认值为1。是否允许 OFFLINE 表空间。0:不允许;1:允许;2:备库不允许。注:数据守护环境下建议配置为 2。
MAL_INI = 1                        # 需要修改,默认值为0。打开 MAL 系统。
ARCH_INI = 1                    # 需要修改,默认值为0。打开归档配置。
RLOG_SEND_APPLY_MON = 64        # 不用改,默认值。统计最近 64 次的日志发送信息。

新建 MAL 配置文件

MAL 配置文件主备库一致,只需要将主库 dmmal.ini 拷备过来就行。

新建归档配置文件 dmarch.ini

只需要将主库 dmarch.ini 拷备过来,修改 ARCH_DEST 为 DMDBPRI 就行。

新建守护进程配置文件 dmwatcher.ini

按照我们的标准,只需要将主库 dmwatcher.ini 拷备过来就行。
如果不是按照我们的标准来安装,则根据实际情况修改含有路径信息的条目。

启动备库到 mount 状态

$ dmserver /dmdb/dmdata/DMDB/dm.ini mount 或者
$ DmServiceDM start mount

设置备库模式和oguid值

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); 
SQL>sp_set_oguid(453003);     # 需要修改
SQL>alter database standby; 
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

注册守护进程服务

主备库上均执行如下操作:

# /dmdb/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p DM -watcher_ini /dmdb/dmdata/DMDB/dmwatcher.ini
$ DmWatcherServiceDM start

启动后,数据库就可以正常使用了,但是不能切换

守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例 Open,并切换为 Open 状态。

配置监视器

监视器所在主机只需要安装 DM8 软件即可,不需要初始化实例。
我们统一在主备机上都部署普通监视器。

编辑配置文件:

$ vim /dmdb/dmmonitor.ini

MON_DW_CONFIRM = 0                             #确认监视器模式
MON_LOG_PATH = /dmdb/dmdbms/log/monitor        #监视器日志文件存放目录 
MON_LOG_INTERVAL = 60                         #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32                         #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 1024                     #0 表示不限定日志文件总占用空间

[DMDB03] 
MON_INST_OGUID = 453003  
MON_DW_IP = 11.50.3.201:65101     # IP 和 PORT 对应 dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT
MON_DW_IP = 11.51.3.201:65121

注册监视器服务:

为了保证确认监视器一直处于工作状态,需要注册 dmmonitor 服务,开机启动。
查看信息和操作时,使用普通监视器,普通监视器使用时启动即可,不用注册服务。

# /dmdb/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p DM -monitor_ini /dmdb/dmmonitor.ini
# systemctl enable DmMonitorServiceDM.service
# systemctl start DmMonitorServiceDM.service

启动监视器并检查:

dmmonitor /dmdb/dmmonitor.ini
help
show
exit
-- By 许望(RHCA、OCM、VCP)
最后修改:2025 年 03 月 26 日 02 : 40 PM
如果觉得我的文章对你有用,请随意赞赏