达梦数据库DCP笔记
DM 数据守护
数据守护概念
DM 数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,是数据库异地容灾的首选方案。
DM 数据守护(DM Data Watch)实现原理:将主库(生产库)产生的 Redo 日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。DM 数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。
数据守护
守护进程(dmwatcher) 是管理数据守护系统的核心部件,监视器(dmmonitor)负责发起命令,守护进程(dmwatcher) 负责解析、处理、转发命令。守护进程提供了数据库监控、故障检测、故障处理、故障恢复等各种功能。
数据守护的功能
监控数据库实例:守护进程(dmwatcher)负责监控数据库运行状态,必要时重启数据库服务。守护进程和实例链路建立成功后,数据库实例定时发送信息到守护进程。 当检测到实例进程ID 已经不存在或者超过一段时间没有收到实例消息(INST_ERROR_TIME),则会认定实例故障。如果配置了自动重启,则会将实例重新拉起。
发送状态信息: 守护进程将监控的数据库实例信息和守护进程自身的信息(包括守护类型、守护模式、 守护状态、守护日志、监视器执行序列号、执行返回码等)捆绑在一起,定时发送给其他守护进程和所有监视器。
监控其他守护进程: 接收并解析其他守护进程发送的消息,如果超过一段时间(DW_ERROR_TIME)没有收到远程守护进程消息,会将远程守护进程状态认定为ERROR 状态。
主备库启动运行
数据守护系统刚启动时,所有实例处于 Mount 状态,守护进程处于 Startup 状态,启动时需要将实例转换到 Open 状态,守护进程也切换到 Open 状态,对外提供服务。
主备故障处理
守护进程支持两种故障切换模式: 故障自动切换(有且仅有一个确认监视器) 和故障手动切换。
监视器
监视器(dmmonitor)监控数据守护系统的运行情况,获取主备库状态、守护进程状态以及主备库数据同步情况等信息。同时,提供了一系列命令来管理数据守护系统。监视器分两种类型: 普通监视器和确认监视器。由配置文件(dmmonitor.ini)MON_DW_CONFIRM 参数指定,默认值为 0,表示普通监视器;1 表示确认监视器。
一个数据守护系统,最多允许同时启动 10 个普通监视器。多个普通监视器相互独立,互不干扰。所有普通监视器都可以接收守护进程消息,获取守护系统状态,也可以执行各种监控命令(比如 Switchover)。
确认监视器和普通监视器的区别在于,除了具备普通监视器所有功能之外,确认监视器还具有状态确认和自动接管两个功能。在数据守护系统的故障自动切换模式下,必须部署一个确认监视器,否则在出现数据库故障时,会导致数据库服务中断。
数据守护的体系结构
DM 数据守护系统结构图参考如下。主要由主库、备库、 Redo 日志、 Redo 日志传输、Redo 日志重演、守护进程(dmwatcher)、监视器(dmmonitor)组成。
手动方式关/启数据守护系统
启库流程
Bash
启主库服务
再启备库服务
主库dmwatcher
备库dmwatcher
启用监视器
停库流程
Bash
关闭监视器(防止自动接管):systemctl stop DmMonitorServiceconfirm
关闭备库守护进程(防止重启实例):systemctl stop DmWatcherServicedmrw
关闭主库守护进程(防止重启实例):systemctl stop DmWatcherServicedmrw
关闭主库实例:systemctl stop DmServicedmrw
关闭备库实例:systemctl stop DmServicedmrw
SQL> SHUTDOWN IMMEDIATE;
方法一:
在监视器上通过 Detach database 命令将所有备库分离
通过 Stop database 命令退出主库
方法二:严格按照以下顺序执行:
通过 Stop dmwatcher 命令关闭所有守护进程监控
手动正常退出主库
通过 Detach database 命令将备库分离出数据守护系统
正常退出备库(手动退出或者通过 Stop database命令退出)
数据守护搭建
配置
点击图片可查看完整电子表格
创建实例
Bash
/dm8/bin/dminit PATH=/data/ PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=256 CASE_SENSITIVE=N CHARSET=1 PORT_NUM=5236 BLANK_PAD_MODE=1 DB_NAME=DMDB INSTANCE_NAME=DM01_1
/dm8/bin/dminit PATH=/data/ PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=256 CASE_SENSITIVE=N CHARSET=1 PORT_NUM=5236 BLANK_PAD_MODE=1 DB_NAME=DMDB INSTANCE_NAME=DM01_2
dm.ini 配置,需要开启归档和MAL(主备都修改)
Bash
vi dm.ini
INSTANCE_NAME = DM01_1
PORT_NUM = 5236 # 数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 # 接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 # 不允许备库 OFFLINE 表空间
MAL_INI = 1 # 打开 MAL 系统
ARCH_INI = 1 # 打开归档配置
RLOG_SEND_APPLY_MON = 64 # 统计最近 64 次的日志发送信息
dmmal.ini 配置(主备配置相同)
Bash
vi dmmal.ini
MAL_CHECK_INTERVAL = 5 # MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 # 判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DM01_1 # 实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 192.168.88.2 # MAL系统监听TCP连接的IP地址
MAL_PORT = 15236 # MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.88.2 # 实例的对外服务IP地址
MAL_INST_PORT = 5236 # 实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 15238 # 实例本地的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 5238 # 实例监听守护进程TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = DM01_2
MAL_HOST = 192.168.88.3
MAL_PORT = 15236
MAL_INST_HOST = 192.168.88.3
MAL_INST_PORT = 5236
MAL_DW_PORT = 15238
MAL_INST_DW_PORT = 5238
dmarch.ini 配置,主备的归档配置不同
Bash
vi dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME # 实时归档类型
ARCH_DEST = DM01_2 # 实时归档目标实例名(主机和备份配置不同,配置向备机同步)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL # 本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch # 本地归档文件存放路径
ARCH_FILE_SIZE = 128 # 单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 # 单位Mb,0表示无限制,范围1024~4294967294M
dmwatcher.ini 配置(主备配置相同)
Bash
vi dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 88888 #守护系统唯一OGUID值(这里要和数据库的OGUID一致,OGUID是写入控制文件的)
INST_INI = /dm8/data/DAMENG/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
操作步骤
1、主机环境准备好,配置好dm.ini、dmmal.ini、dmarch.ini、dmwatcher.ini。
Bash
scp dmmal.ini dmdba@192.168.88.3:/dm8/data/DAMENG/
scp dmarch.ini dmdba@192.168.88.3:/dm8/data/DAMENG/
scp dmwatcher.ini dmdba@192.168.88.3:/dm8/data/DAMENG/
2、备份数据库,在计划作为备库的机器上还原;还原数据库记得更新数据库魔数。
还原成功后配置 dm.ini,并将主机的 dmmal.ini、dmarch.ini、dmwatcher.ini 拷贝的备机(dmarch.ini 归档 dest_name 需修改)。
Bash
[dmdba@KylinDCA01 bin]$ cd /dm8/bin; ./dmserver /dm8/data/DAMENG/dm.ini
[dmdba@dm131 ~]$ disql sysdba/SYSDBA:5236
Server[LOCALHOST:5236]:mode is normal, state is open
login used time : 10.568(ms)
disql V8
SQL> checkpoint(100);
SQL> backup database full to ONLINEBAK_01 backupset '/dm8/backup/fullbak';
SQL> exit
[dmdba@KylinDCA01 bin]$ cd /dm8/bin; ./dmrman
dmrman V8
RMAN> backup database '/dm8/data/DMDB/dm.ini' to OFFLINEFULLBAK backupset '/dm8/backup/full/OFFLINEFULLBAK';
scp -r /dm8/backup/fullbak dmdba@192.168.88.3:/dm8/backup
[dmdba@KylinDCA02 bin]$ cd /dm8/bin; ./dmrman
dmrman V8
RMAN> restore database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/backup/fullbak';
RMAN> recover database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/backup/fullbak';
RMAN> recover database '/dm8/data/DAMENG/dm.ini' update db_magic;
RMAN> exit
3、启动主机到 mount 状态
修改主机的 OGUID 为 88888,并修改主机为 Primary 模式。
Bash
[root@KylinDCA01 root]# /dm8/script/root/dm_service_installer.sh -t dmserver -p DM01_1 -dm_ini /dm8/data/DAMENG/dm.ini
[dmdba@KylinDCA01 bin]$ vi /dm8/bin/DmServiceDM01_1
START_MODE=mount
[dmdba@KylinDCA01 bin]$ cd /dm8/bin; ./DmServiceDM01_1 start
[dmdba@Kylin10DCA01 DAMENG]$ dmserver /dm8/data/DAMENG/dm.ini mount
[dmdba@Kylin10DCA01 bin]$ ps -ef |grep dmserver
dmdba 27750 1 0 16:29 pts/1 00:00:00 /dm8/bin/dmserver path=/data/DMDB/dm.ini -noconsole mount
disql sysdba/SYSDBA:5236
Server[LOCALHOST:5236]:mode is normal, state is mount
login used time : 20.759(ms)
disql V8
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',1);
SQL> SELECT SF_GET_PARA_VALUE (2,'ALTER_MODE_STATUS');
行号 SF_GET_PARA_VALUE (2,'ALTER_MODE_STATUS')
1 1
SQL> sp_set_oguid(88888);
SQL> alter database primary;
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',0);
SQL> exit
4、启动备机到 mount 状态
修改主机的 OGUID 为 8888,并修改主机为 standy 模式。
Bash
[root@KylinDCA02 root]# /dm8/script/root/dm_service_installer.sh -t dmserver -p DM01_2 -dm_ini /dm8/data/DAMENG/dm.ini
[dmdba@KylinDCA02 bin]$ vi /dm8/bin/DmServiceDM01_2
START_MODE=mount
[dmdba@KylinDCA02 bin]$ cd /dm8/bin; ./DmServiceDM01_2 start
[dmdba@Kylin10DCA02 DAMENG]$ dmserver /dm8/data/DAMENG/dm.ini mount
disql sysdba/SYSDBA
Server[LOCALHOST:5236]:mode is normal, state is mount
login used time : 20.759(ms)
disql V8
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',1);
SQL> SELECT SF_GET_PARA_VALUE (2,'ALTER_MODE_STATUS');
行号 SF_GET_PARA_VALUE (2,'ALTER_MODE_STATUS')
1 1
SQL> sp_set_oguid(88888);
SQL> alter database standby;
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',0);
SQL> exit
5、启动主/备机守护进程
Bash
[root@KylinDCA01 root]# /dm8/script/root/dm_service_installer.sh -t dmwatcher -p DM01_1 -watcher_ini /dm8/data/DAMENG/dmwatcher.ini
[root@KylinDCA02 root]# /dm8/script/root/dm_service_installer.sh -t dmwatcher -p DM01_2 -watcher_ini /dm8/data/DAMENG/dmwatcher.ini
[dmdba@KylinDCA01 bin]$ ./DmWatcherServiceDM01_1 start
dmwatcher /dm8/data/DAMENG/dmwatcher.ini
[dmdba@KylinDCA02 bin]$ ./DmWatcherServiceDM01_2 start
dmwatcher /dm8/data/DAMENG/dmwatcher.ini
6、守护进程启动成功后,集群环境正常的话,主备机会自动打开。
Bash
cat /dm8/log/dm_dmwatcher_DM01_1_202409.log
systemctl stop firewalld.service
systemctl disable firewalld.service
disql sysdba/SYSDBA:5236
服务器[LOCALHOST:5236]:处于主库打开状态
登录使用时间 : 27.861(ms)
disql V8
SQL>
7、状态检查
在主机上创建表,并插入数据提交,在备机上查询数据是否可以正常查询,如果正常说明主备同步正常。 查看主机的归档状态,VALID 也说明主备同步正常。如果在主库上查询 v$arch_status,归档无效,则主备同步异常,需排查异常原因。
Bash
SQL> select * from v$arch_status;
行号 ARCH_TYPE ARCH_DEST ARCH_STATUS ARCH_SRC
1 REALTIME DM01_1 VALID DM01_2
2 LOCAL /dm8/data/DAMENG/arch VALID DM01_2
8、配置监视器 dmmonitor.ini
监视器中的 OGUID 要与数据库设置的一致。 配置数据守护 dmwatcher 的 IP 和端口。
Bash
vi dmmonitor.ini
MON_DW_CONFIRM = 1 # 确认监视器模式
MON_LOG_PATH = /dm8/log # 监视器日志文件存放目录
MON_LOG_INTERVAL = 60 # 每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 # 每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 # 不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 88888 # 组GRP1的唯一OGUID值
MON_DW_IP = 192.168.88.2:15238 # 同 MAL_DW_PORT
MON_DW_IP = 192.168.88.3:15238
注意:
[GRP1] 此名字不要写错,要和主库和备库中的 dmwatcher.ini 中的组名一样,否则会提示:
dmmonitor(mid:1590932471) create link to dmwatcher(192.168.6.113:5238) error, code=-6010, oguid or group_name mismatch, please check config!!!
9、启动监视器
Bash
[root@Kylin root]# /dm8/script/root/dm_service_installer.sh -t dmmonitor -p dmmonitor -monitor_ini /dm8/data/dmmonitor.ini
[dmdba@localhost bin]$ ./DmMonitorServicedmmonitor start
[dmdba@localhost ~]$ cd /dm8/bin; ./dmmonitor /dm8/data/dmmonitor.ini
show version # 显示监视器自身版本信息
show global info # 命令查看集群状态
login # 登录
choose switchover # 查看选择可切换为 PRIMARY 库的备库列表
switchover # 切换主库
tip # 查看系统当前运行状态
stop group GRP1 # 关闭指定组中的所有库
stop dmwatcher GRP1 # 关闭指定组的守护进程监控功能
startup dmwatcher GRP1 # 启动指定组的守护进程监控功能
文章
阅读量
获赞