DM7数据守护搭建过程中及错误处理
dm数据守护原理
DM 数据守护(Data Watch)的实现原理非常简单:将主库(生产库)产生的 Redo 日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。DM 数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与 重演过程中出现的各种异常情况提供一系列的解决方案。
1、安装前准备
经过对dm7数据库的阶段性学习,本次准备对dm7数据守护集群进行搭建,搭建实时主备环境。
通过虚拟机vm15搭建,本文以演示环境如下
操作系统 Cpu 数据库 Redhat6.4 企业版 x86_64 DM-V7.6.1.112
Ip规划因为是虚拟机环境 内外部ip相同,监视器搭建在备机上
主机(实例名DW01) 备机(实例名DW02) 确认监视器 内部ip 192.168.80.11 外部ip 192.168.80.11 内部ip 192.168.80.12 外部ip 192.168.80.12 192.168.80.12
端口规划
实例名 PORT_NUM DW_PORT MAL_HOST MAL_PORT MAL_DW_PORT DW01 32141 33141 192.168.80.11 61141 52141 DW02 32142 33142 192.168.80.12 61142 52142
2、部署过程步骤
2.1数据准备
2.1.1数据文件拷贝
如果搭建数据守护之前,数据库系统已经上线运行了,那么我们可以通过拷贝数据文件的方式实现主库和备库的数据同步。具体步骤包括:
1. 正常关闭数据库
2. 严格按照数据文件在主库上的分布,拷贝数据文件到备库的对应目录
3. 如果数据文件统一存放在一个目录下,则直接拷贝整个目录即可
例:拷贝实例到备库机器
scp -r /dm7/data/DAMENG dmdba@192.168.1.2:/dm7/data/
2.1.2备份还原方式
用户也可以通过脱机备份、脱机还原的方式同步主库和备库数据,更详细的说明可以参考备份恢复相关文档。具体步骤包括:
1. 正常关闭数据库
2. 进行脱机备份
./dmrman CTLSTMT="BACKUP DATABASE '/dm7/data/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm7/data/BACKUP_FILE_01'"
3. 拷贝备份文件到备库所在机器
4. 执行脱机数据库还原与恢复
./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'"
注意:
如果执行备份时,待备份的库是 Normal 模式,并且不能确定这个库一定作为主库使用,则对 Normal 模式的库必须使用脱机备份,不能使用联机备份方式,避免备份完成后,Normal 模式的库 LSN 有增长,又将其修改为Standby 模式,而使用备份集还原后的库修改为 Primary 模式,备库数据比主库数据多,导致主备数据不一致的情况出现。本人在搭建过程中就出现主备lsn不一致情况,所以在大多数情况下还是建议进行脱机备份
2.1.3检查数据一致性
依次到每个实例上,切换到执行码目录/dm7/bin,以 mount 方式启动数据库。
/dmserver /dm7/data/DAMENG/dm.ini mount
启动命令行工具 DIsql,分别登录各个实例查询 LSN 值,如果主库和备库的 FILE_LSN 和 CUR_LSN 值相同,可以确保数据完全一致。
2.2配置主库DW01
2.2.1配置dm.ini
在主机上配置主库的实例名为 DW01,dm.ini 参数修改如下
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = DW01
PORT_NUM = 32141 #数据库实例监听端口
DW_PORT = 33141 #守护环境下,监听守护进程连接端口
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 次的日志发送信息
2.2.2配置dmmal.ini
注:
如果是初次配置,建议将配置文件放在data目录下的实例目录下例:/dm7/data/DAMENG,可直接通过vi新建配置文件。
配置 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 = DW01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.80.11 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.80.11 #实例的对外服务 IP 地址
MAL_INST_PORT = 32141 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DW02
MAL_HOST = 192.168.80.12
MAL_PORT = 61142
MAL_INST_HOST = 192.168.80.12
MAL_INST_PORT = 32142
MAL_DW_PORT = 52142
2.2.3配置dmarch.ini
修改 dmarch.ini,配置本地归档和实时归档。
除了本地归档外,其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时,需 要同步归档数据的目标实例名。 当前实例 DW01 是主库,需要向 DW02(实时备库)同步数据,因此实时归档的 ARCH_DEST 配置为 DW02。
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DW02 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm7/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
2.2.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 = /dm7/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm7/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
2.2.5配置dmwatcher.ctl
同一个守护进程组,必须使用同一份 dmwatcher.ctl。因此,只需要使用 dmctlcvt 工具生成一份 dmwatcher.ctl 文件,然后分别拷贝到各个数据库目录下即可。 在配置完成 dmwatcher.ini 后,使用 dmctlcvt 工具生成 dmwatcher.ctl:
./dmctlcvt TYPE=3 SRC=/dm7/data/DAMENG/dmwatcher.ini DEST=/dm7/data
拷贝生成的 dmwatcher.ctl 文件到数据文件目录/dm7/data/DAMENG。
2.2.6启动主库
以 mount 方式启动主库
./dmserver /dm7/data/DAMENG/dm.ini mount
主库启动时报错:
DM Listener 's unable to listen on socket :98
根据上述报错 个人认为应该还是配置端有问题,由于之前的配置文件并没有按照上述步骤进行配置,而是自行分配端口配置,所以现在检查配置文件。
1.检查dm.ini 端口配置
PORT_NUM = 5236
DW_PORT = 5336
2.检查dmmal.ini 配置 发现 mal_port端口与dm.ini中的 DW_PORT端口冲突,分析原因为端口冲突导致无法启动
将dmmal.ini中的mal_port 端口改为61141 并按照上述步骤对端口全面更新
再次尝试启动主库,启动成功!
2.2.7设置OGUID
启动命令行工具 DIsql,登录主库设置 OGUID 值,OGUID是数据守护唯一标识编码同一守护进程组中,所有数据库、守护进程和监视器,都必须配置相同的 OGUID 值, 取值范围为 0~2147483647。
SQL>sp_set_oguid(453331);
2.2.8 修改数据库模式
启动命令行工具 DIsql,登录主库修改数据库为 primary 模式
SQL>alter database primary;
2.3配置备库DW02
2.3.1配置dm.ini
在备份机器上配置备库的实例名为 DW02,dm.ini 参数修改如下:
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = DW02
PORT_NUM = 32142 #数据库实例监听端口
DW_PORT = 33142 #守护环境下,监听守护进程连接端口
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 次的日志重演信息
2.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 = DW01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.0.141 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.1.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 32141 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DW02
MAL_HOST = 192.168.0.142
MAL_PORT = 61142
MAL_INST_HOST = 192.168.1.132
MAL_INST_PORT = 32142
MAL_DW_PORT = 52142
2.3.3配置dmarch.ini
注意:修改 dmarch.ini,配置本地归档和实时归档。 除了本地归档外,其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时,需 要同步归档数据的目标实例名。 当前实例 DW02 是备库,守护系统配置完成后,可能在各种故障处理中, DW02 切换为新的主库,正常情况下,DW01 会切换为新的备库,需要向 DW01 同步数据,因此实时归档的 ARCH_DEST 配置为 DW01。
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DW01 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm7/data/DAMENG/arch #本地归档文件路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
2.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 = /dm7/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm7/bin/dmserver #命令行方式启动
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
2.3.5配置dmwatcher.ctl
同一个守护进程组,必须使用同一份 dmwatcher.ctl 文件,这里直接拷贝配置主库 时已经生成的 dmwatcher.ctl 到本地数据文件目录/dm7/data/DAMENG。
2.3.6启动备库
以 mount 方式启动备库
./dmserver /dm7/data/DAMENG/dm.ini mount
注意:
一定要以 mount 方式启动数据库实例,否则系统启动时会重构回滚表空间, 生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主 备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。
2.3.7设置 OGUID
启动命令行工具 DIsql,登录备库设置 OGUID 值为 453331
SQL>sp_set_oguid(453331);
2.3.8修改数据库模式
启动命令行工具 DIsql,登录备库修改数据库为 Standby 模式。
如果当前数据库不是 normal 模式,需要先修改 dm.ini 中 ALTER_MODE_STATUS 值为 1,允许修改数据库模式,修改 Standby 模式成功后再改回为 0。如果是 normal 模式,
请忽略下面的第 1 步和第 3 步。
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); ----第 1 步
SQL>alter database standby; ----第 2 步
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); ----第 3 步
2.4配置监视器
继续修改监视器配置文件 在备机上配置监视器
注意:故障自动切换模式下,必须配置确认监视器,且确认监视器最多只能配置一个。
在备机修改 dmmonitor.ini 配置确认监视器,其中 MON_DW_IP 中的 IP 和 PORT 和 dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致。若第一次配置直接vi 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]
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.80.11:52141
MON_DW_IP = 192.168.80.12:52142
2.5启动守护进程
启动守护进程主备都启动
./dmwatcher /dm7/data/DAMENG/dmwatcher.ini
守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始 广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将 本地实例 Open,并切换为 Open 状态。
2.6启动监视器
在备库启动监视器
./dmmonitor /dm7/data/dmmonitor.ini
启动后报错 oguid or group_name mismatch, please check config!
分析原因:
没有按照上述步骤修改好组名称
检查 dmmonitor.ini文件配置的组名要与dmwatcher.ini 的配置组名一致,本次故障就是因为两个组名不一致造成。
检查到dmwatcher.ini组名为DW01而 dmmonitor.ini的组名为GRP1
解决方法:统一修改组名为GRP1
再次启动监视器 此时发现备机并非出于open状态,决定尝试再次更新备份,主库进行联机备份 拷贝备份文件至备库进行脱机还原
BACKUP DATABASE FULL BACKUPSET '/dm7/data/BACKUP_FILE_01';
还原后确认lsn号是否一致
再次启动依然发现备机无法open 发现原因 备机没有切换备机模式
备机执行alter database standby;
关闭主备机器防火墙
监视器查看均为open状态 完成配置 备机无法监控到主机有可能是防火墙问题
在主机创建表 测试主备运行情况
备机模式下完成实时同步 数据守护搭建完成
至此dm7数据守护实时主备部署完成
3.报错处理汇总
1.在配置过程中,主库无法启动报错DM Listener 's unable to listen on socket :98
出现此报错通常为配置文件端口配置错误导致,仔细检查端口号是否配错或重复。
2.启动监视器报错oguid or group_name mismatch, please check config!
监视器一直刷error code 6010,。出现此异常情况检查监视器配置文件dmmonitor.ini和数据守护配置文件dmwatcher.ini是否正确,我这里是因为组名不同导致的监视器无法启动
3.启动监视器后发现主备库lsn号不同,仔细观察发现主库lsn号发生变化,备库lsn号未发生改变。
分析原因:在进过反复验证后发现,导致这个问题的原因是,在部署过程中,首先开启了主库的数据库服务,并且是正常norma模式下启动,并没有在mount下启动,导致系统启动时重构回滚表空间, 生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主 备库的数据一致性。
这属于在部署过程中的操作失误。解决方法是对主库进行冷备,重新拷贝备份文件到备库并进行恢复还原。
4.启动监视器后,备库一直处于mount状态,只有主库在open状态
解决思路:尝试重启服务器,重启服务器后依然发现备库处于mount状态,且无法获取主库信息。
经过反复验证测试,发现备库处于mount状态的原因是在部署过程中没有切换数据库模式为standby,在重启服务器后无法获取主机状态的原因是因为没有开启数据守护进程和没有关闭主机防火墙导致。通过将备机模式切换为standby以及关闭虚拟机防火墙后,监视器显示正常,且主备均为open状态
4.dm7和dm8搭建数据守护区别
1.配置文件区别
Dm7配置 dm.ini如下:
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_RT_01
PORT_NUM = 32141 #数据库实例监听端口
DW_PORT = 33141 #守护环境下,监听守护进程连接端口
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 次的日志发送信息
Dm8配置dm.ini如下:
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_RT_01
PORT_NUM = 32141 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统ARCH_INI = 1 #打开归档配置
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
可以看到dm7相比于dm8多了DW_PORT参数和HA_INST_CHECK_FLAG参数,配置过程中切忌不要搞混。
2.dmmal.ini文件区别:
dm8 dmmal.ini相比dm7多了MAL_INST_DW_PORT = 33141(#实例监听守护进程 TCP 连接的端口)参数
3. dmwathcer.ctl文件区别
dm8无需dmwathcer.ctl控制文件步骤配置在配置参数时要注意dm7与dm8的区别
5.安装总结
在学习数据守护过程中,对相关概念一开始并不是很清晰,但在不断的实践和摸索过程中逐渐熟悉其原理和各个功能,对相关概念也开始清晰起来。
数据库版本的不同也会在部署中体现出差异,dm7和dm8的数据守护在配置方面略有差异,切忌不能按照dm8的部署方式去部署dm7的数据守护。本人一开始就是按照dm8的配置方式部署dm7数据守护,导致异常状况无法正常启动服务。
部署过程中一定要提前规划好相关资源、ip端口及安装目录等,部署过程中一定要仔细核对配置文件信息,在本人部署过程中由于没有仔细检查相关配置信息。也导致后续部署过程中出现报错等异常情况。多熟悉,多操作,仔细认真,是成功的关键。
更多内容请访问https://eco.dameng.com/
推荐文章
发表评论