1、概述
DM 数据守护(DM Data Watch)的实现原理非常简单:将主库(生产库)产生的 Redo 日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。DM 数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。
主库
Primary 模式,提供完整数据库服务的实例,一般来说主库是用来直接支撑应用系统的生产库。
备库
Standby 模式,提供只读数据库服务的实例。备库除了用于容灾,还可以提供备份、查询等只读功能,并且备库还支持临时表的 Insert/Delete/Update 操作。
备库支持临时表修改主要基于两个因素:1.临时表数据的修改不会产生 Redo 日志,主库对临时表的修改无法同步到备库;2.可以提供更大灵活性,适应更多应用场景。
根据数据同步情况,备库又可以分为可切换备库和不可切换备库。可切换备库是指,主备库之间数据完全同步,主库发生故障、备库切换为主库后,不会造成任何数据丢失的备库。
Redo 日志
Redo 日志记录物理数据页内容变动情况,是数据库十分重要的一个功能,在数据库系统故障(比如服务器掉电)重启时,利用 Redo 日志可以把数据恢复到故障前的状态。
Redo 日志也是数据守护的实现基础,数据库中 Insert、Delete、Update 等 DML 操作以及 Create TABLE 等 DDL 操作最终都会体现为对某一个或者多个物理数据页的修改,因此备库通过重做 Redo 日志可以与主库数据保持一致。
Redo 日志传输
主备库之间的 Redo 日志传输,以日志包 RLOG_PKG 为单位,主库通过 MAL 系统发送 Redo 日志到备库。各种不同数据守护类型的区别,就在于主库日志包 RLOG_PKG 的发送时机,以及备库收到 Redo 日志后的处理策略。
Redo 日志重演
Redo 日志重演的过程,就是备库收到主库发送的 Redo 日志后,在物理数据页上,重新修改数据的过程。Redo 日志重演由专门的 Redo 日志重演服务完成,重演服务严格按照 Redo 日志产生的先后顺序,解析 Redo 日志、修改相应的物理数据页,并且重演过程中备库会生成自身的 Redo 日志写入联机日志文件。
守护进程
守护进程(dmwatcher)是数据守护系统的核心工具,监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案。守护进程是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;同时,守护进程也会将收到的数据库实例消息转发给其他守护进程和监视器。守护进程必须和被守护的数据库实例部署在同一台机器上。
监视器
监视器(dmmonitor)用来监控守护系统内守护进程、数据库实例信息,执行用户输入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的机器上。
2、数据守护集群安装部署
2.1、环境准备
2.1.1 集群节点规划
主库(DMDW01) | 备库(DMDW02) | |
内网IP(心跳) | 10.16.196.21 | 10.16.196.22 |
外网IP(业务) | 192.168.7.110 | 192.168.7.111 |
数据库名 | GRP1_RT_01 | GRP1_RT_02 |
实例名 | GRP1_RT_01 | GRP1_RT_02 |
PORT_NUM | 5236 | 5236 |
MAL_INST_DW_PORT | 45101 | 45121 |
MAL_HOST(内网IP) | 10.16.196.21 | 10.16.196.22 |
MAL_INST_HOST(外网IP) | 192.168.7.110 | 192.168.7.111 |
MAL_PORT | 55101 | 55121 |
MAL_DW_PORT | 65101 | 65121 |
OGUID | 45331 | 45331 |
安装目录 | /dm8 | /dm8 |
备份目录 | /dm8/backup | /dm8/backup |
归档目录 | /dm8/arch | /dm8/arch |
操作系统版本 | 银河麒麟Linux kylin10 4.19.90-24.4.v2101.ky10.x86_64 |
数据库版本 | DM Database Server 64 V8 |
共搭建三台数据库,一台主库,一台备库,一台监视器 ,主备库按照上述规划进行安装,监视器主机有达梦数据库即可,监视器IP:10.16.196.23。
2.1.2 数据库安装
2.1.2.1 检查系统环境
--查看CPU的信息
[root@DMDW01 ~]# lscpu
--查看内存
[root@DMDW01 ~]# free -h
--查看磁盘细信息
[root@DMDW01 ~]# fdisk -l
[root@DMDW01 ~]# df -Th
2.1.2.2 关闭防火墙
[root@DMDW01 ~]# systemctl status firewalld
[root@DMDW01 ~]# systemctl stop firewalld
[root@DMDW01 ~]# systemctl disable firewalld
主备库同样操作。
2.1.2.3 创建用户和组
[root@DMDW01 ~]# groupadd dinstall
[root@DMDW01 ~]# useradd -g dinstall dmdba
[root@DMDW01 ~]# passwd dmdba
2.1.2.4 创建安装目录
[root@DMDW01 ~]# mkdir -p /dm8
[root@DMDW01 ~]# chown dmdba.dinstall -R /dm8
[root@DMDW01 ~]# ls -ld /dm8/
drwxr-xr-x 2 dmdba dinstall 6 9月 4 14:43 /dm8/
[root@DMDW01 ~]#
2.1.2.5 安装数据库
[root@DMDW01 ~]# cd /opt
[root@DMDW01 opt]# unzip dm8_20240712_x86_rh7_64.zip
[root@DMDW01 opt]# mount -o loop dm8_20240712_x86_rh7_64.iso /mnt
[root@DMDW01 opt]# su - dmdba
[dmdba@DMDW01 ~]$ cd /mnt
[dmdba@DMDW01 mnt]$ ./DMInstall.bin -i
过程略,注意将软件安装到/dm8目录,主库和备库的安装步骤相同。
2.1.2.6 初始化数据库
主库:
[dmdba@DMDW01 bin]$ ./dminit PATH=/dm8/data DB_NAME=GRP1_RT_01 INSTANCE_NAME=GRP1_RT_01 EXTENT_SIZE=16 PAGE_SIZE=8 CASE_SENSITIVE=Y SYSDBA_PWD=Dameng123
备库:
[dmdba@DMDW02 bin]$ ./dminit PATH=/dm8/data DB_NAME=GRP1_RT_02 INSTANCE_NAME=GRP1_RT_02 EXTENT_SIZE=16 PAGE_SIZE=8 CASE_SENSITIVE=Y SYSDBA_PWD=Dameng123
2.1.2.7 注册数据库服务
主库:
[dmdba@DMDW01 bin]$ cd /dm8/script/root
[dmdba@DMDW01 root]$ ./dm_service_installer.sh -t dmserver -p GRP1_RT_01 -dm_ini /dm8/data/GRP1_RT_01/dm.ini
备库:
[dmdba@DMDW02 bin]$ cd /dm8/script/root
[dmdba@DMDW02 root]$ ./dm_service_installer.sh -t dmserver -p GRP1_RT_02 -dm_ini /dm8/data/GRP1_RT_02/dm.ini
2.2、数据准备
2.2.1 关闭主备机上数据库实例
主库:
[dmdba@DMDW01 root]$ cd /dm8/bin
[dmdba@DMDW01 bin]$ ./DmServiceGRP1_RT_01 stop
备库:
[dmdba@DMDW02 root]$ cd /dm8/bin
[dmdba@DMDW02 bin]$ ./DmServiceGRP1_RT_02 stop
2.2.2 主库备份数据
[dmdba@DMDW01 bin]$ ./dmrman
dmrman V8
RMAN> BACKUP DATABASE '/dm8/data/GRP1_RT_01/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/backup/BACKUP_FILE_01'
2.2.3 传输备份到备库
检查备库是否有/dm8/backup目录,没有先创建此目录。
主库:
[dmdba@DMDW01 backup]$ scp -r BACKUP_FILE_01/ dmdba@192.168.7.111:/dm8/backup
输入dmdba的用户密码
2.2.4 备库恢复数据
使用主库传输的备份,在备库上恢复数据。
备库:
[dmdba@DMDW02 BACKUP_FILE_01]$ cd /dm8/bin
[dmdba@DMDW02 bin]$ ./dmrman
dmrman V8
--还原
RMAN> restore database '/dm8/data/GRP1_RT_02/dm.ini' from backupset '/dm8/backup/BACKUP_FILE_01';
restore database '/dm8/data/GRP1_RT_02/dm.ini' from backupset '/dm8/backup/BACKUP_FILE_01';
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
restore successfully.
time used: 00:00:02.429
--恢复
RMAN> recover database '/dm8/data/GRP1_RT_02/dm.ini' from backupset '/dm8/backup/BACKUP_FILE_01';
recover database '/dm8/data/GRP1_RT_02/dm.ini' from backupset '/dm8/backup/BACKUP_FILE_01';
recover successfully!
time used: 419.184(ms)
--更新db_magic
RMAN> recover database '/dm8/data/GRP1_RT_02/dm.ini' update db_magic;
recover database '/dm8/data/GRP1_RT_02/dm.ini' update db_magic;
recover successfully!
time used: 00:00:01.067
RMAN>
2.3、主、备库配置
2.3.1 主库配置
2.3.1.1 dm.ini配置
INSTANCE_NAME = GRP1_RT_01 #实例名
PORT_NUM = 5236 #端口号
DW_INACTIVE_INTERVAL = 60 #服务器认定守护进程未启动的时间
ALTER_MODE_STATUS = 0 #是否允许手工修改服务器的模式、状态和OGUID,2表示允许,1表示在本地守护进程故障时允许,0表示不允许。
ENABLE_OFFLINE_TS = 2 #是否允许OFFLINE表空间,0:不允许;1:允许;2:备库不允许。
MAL_INI = 1 #是否启用MAL系统,0:不启用;1:启用
ARCH_INI = 1 #是否启用归档,0:不启用;1:启用
RLOG_SEND_APPLY_MON = 64 #数据守护中,对于主库,用于指定统计最近N次主库到每个备库的归档发送时间;对于备库,用于指定统计最近N次备库重演日志的时间
2.3.1.2 dmmal.ini配置
[dmdba@DMDW01 GRP1_RT_01]$ vi dmmal.ini
MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST = 10.16.196.21 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 55101 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.7.110 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
MAL_DW_PORT = 65101 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 45101 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 10.16.196.22
MAL_PORT = 55121
MAL_INST_HOST = 192.168.7.111
MAL_INST_PORT = 5236
MAL_DW_PORT = 65121
MAL_INST_DW_PORT = 45121
2.3.1.3 dmarch.ini配置
[dmdba@DMDW01 GRP1_RT_01]$ vi dmarch.ini
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/arch/ #本地归档存放路径
ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_02 #实时归档目标实例名
2.3.1.4 dmwatcher.ini配置
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切
DW_ERROR_TIME = 20 #远程守护进程故障认定时间
INST_ERROR_TIME = 20 #本地实例故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_OGUID = 45331 #守护系统唯一 OGUID 值
INST_INI = /dm8/data/GRP1_RT_01/dm.ini #dm.ini 文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
2.3.1.5 修改主库模式
启动数据库到mount状态,修改主库的模式和OGUID。
[dmdba@DMDW01 bin]$ ./dmserver /dm8/data/GRP1_RT_01/dm.ini mount
[dmdba@DMDW01 ~]$ /dm8/bin/disql sysdba/Dameng123
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',1);
SQL> sp_set_oguid(45331);
SQL> alter database primary;
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',0);
2.3.2 备库配置
2.3.2.1 dm.ini配置
[dmdba@DMDW02 GRP1_RT_02]$ vi dm.ini
INSTANCE_NAME = GRP1_RT_01
PORT_NUM = 5236
DW_INACTIVE_INTERVAL = 60
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
RLOG_SEND_APPLY_MON = 64
2.3.2.2 dmmal.ini配置
[dmdba@DMDW02 GRP1_RT_02]$ vi dmmal.ini
MAL_CHECK_INTERVAL = 10
MAL_CONN_FAIL_INTERVAL = 10
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 10.16.196.21
MAL_PORT = 55101
MAL_INST_HOST = 192.168.7.110
MAL_INST_PORT = 5236
MAL_DW_PORT = 65101
MAL_INST_DW_PORT = 45101
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 10.16.196.22
MAL_PORT = 55121
MAL_INST_HOST = 192.168.7.111
MAL_INST_PORT = 5236
MAL_DW_PORT = 65121
MAL_INST_DW_PORT = 45121
2.3.2.3 dmarch.ini配置
[dmdba@DMDW02 GRP1_RT_02]$ vi dmarch.ini
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/arch/
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_01 #主库实例名
2.3.2.4 dmwatcher.ini配置
[dmdba@DMDW02 GRP1_RT_02]$ vi dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 20
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 45331
INST_INI = /dm8/data/GRP1_RT_02/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
2.3.2.5 修改备库模式
[dmdba@DMDW02 GRP1_RT_02]$ cd /dm8/bin
[dmdba@DMDW02 bin]$
[dmdba@DMDW02 bin]$
[dmdba@DMDW02 bin]$ ./dmserver /dm8/data/GRP1_RT_02/dm.ini mount
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',1);
SQL> sp_set_oguid(45331);
SQL> alter database standby;
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',0);
2.4、启动守护进程
2.4.1 守护进程注册服务
主库:
[root@DMDW01 ~]# /dm8/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dm8/data/GRP1_RT_01/dmwatcher.ini
备库:
[root@DMDW02 ~]# /dm8/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dm8/data/GRP1_RT_02/dmwatcher.ini
2.4.2 启动守护进程
主库:
[dmdba@DMDW01 bin]$ ./DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher: [ OK ]
如果此时备库没有启动,主库处于配置状态,STATUS$的状态时mount。
备库:
[dmdba@DMDW02 bin]$ ./DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher:
2.5、监视器配置
2.5.1 配置确认监视器
[dmdba@DMMONITOR dm8]$ vi dmmonitor.ini
MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = /dm8/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 128 #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB
[GRP1]
MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值
MON_DW_IP = 10.16.196.21:65101 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
MON_DW_IP = 10.16.196.22:65121
2.5.2 配置非确认监视器
[root@DMMONITOR dm8]# vi dmmonitor_manual.ini
MON_DW_CONFIRM = 0
MON_LOG_PATH = /dm8/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 128
MON_LOG_SPACE_LIMIT = 2048
[GRP1]
MON_INST_OGUID = 45331
MON_DW_IP = 10.16.196.21:65101
MON_DW_IP = 10.16.196.22:65121
2.5.3 注册监视器服务
--可以不注册
[root@DMMONITOR dm8]# /dm8/script/root/dm_service_installer.sh -t dmmonitor -p Monitor_DB -monitor_ini /dm8/dmmonitor.ini
2.5.4 通过前台方式启动确认监视器
[dmdba@DMMONITOR bin]$ /dm8/bin/dmmonitor /dm8/dmmonitor.ini
可通过监视器命令"tip"或"show"来检查集群状态是否正常。
[dmdba@DMMONITOR bin]$ /dm8/bin/dmmonitor /dm8/dmmonitor.ini
[monitor] 2024-09-04 17:20:33: DMMONITOR[4.0] V8
[monitor] 2024-09-04 17:20:33: DMMONITOR[4.0] IS READY.
[monitor] 2024-09-04 17:20:33:
#-----------------------------------------------------------------------------------------------#
GET MONITOR CONNECT INFO FROM DMWATCHER(GRP1_RT_02), THE FIRST LINE IS SELF INFO.
DW_CONN_TIME MON_CONFIRM MID MON_IP MON_VERSION
2024-09-04 17:20:34 TRUE 308757742 ::ffff:10.16.196.23 DMMONITOR[4.0] V8
#-----------------------------------------------------------------------------------------------#
[monitor] 2024-09-04 17:20:33: 收到守护进程(GRP1_RT_02)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-09-04 17:20:34 OPEN OK GRP1_RT_02 OPEN STANDBY NULL 2 45329 45329
[monitor] 2024-09-04 17:20:33: 收到守护进程(GRP1_RT_01)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-09-04 17:20:33 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 2 45329 45329
show
2024-09-04 17:20:36
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 45331 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.21 65101 2024-09-04 17:20:35 GLOBAL VALID OPEN GRP1_RT_01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.7.110 5236 OK GRP1_RT_01 OPEN PRIMARY 0 0 REALTIME VALID 3169 45329 3169 45329 NONE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.22 65121 2024-09-04 17:20:36 GLOBAL VALID OPEN GRP1_RT_02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.7.111 5236 OK GRP1_RT_02 OPEN STANDBY 0 0 REALTIME VALID 3169 45329 3169 45329 NONE
DATABASE(GRP1_RT_02) APPLY INFO FROM (GRP1_RT_01), REDOS_PARALLEL_NUM (1), WAIT_APPLY[FALSE]:
DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[3169, 3169, 3169], (RLSN, SLSN, KLSN)[45329, 45329, 45329], N_TSK[0], TSK_MEM_USE[0]
REDO_LSN_ARR: (45329)
#================================================================================#
tip
[monitor] 2024-09-04 17:22:01: 实例GRP1_RT_01[PRIMARY, OPEN, ISTAT_SAME:TRUE]不可加入其他实例,守护进程状态:OPEN,Open记录状态:VALID
[monitor] 2024-09-04 17:22:01: 实例GRP1_RT_01[PRIMARY, OPEN, ISTAT_SAME:TRUE]当前没有命令正在执行
[monitor] 2024-09-04 17:22:01: 实例GRP1_RT_01[PRIMARY, OPEN, ISTAT_SAME:TRUE]运行正常, 守护进程是OPEN状态,守护类型是GLOBAL
[monitor] 2024-09-04 17:22:01: 实例GRP1_RT_02[STANDBY, OPEN, ISTAT_SAME:TRUE]可加入实例GRP1_RT_01[PRIMARY, OPEN, ISTAT_SAME:TRUE]
[monitor] 2024-09-04 17:22:01: 实例GRP1_RT_02[STANDBY, OPEN, ISTAT_SAME:TRUE]当前没有命令正在执行
[monitor] 2024-09-04 17:22:01: 实例GRP1_RT_02[STANDBY, OPEN, ISTAT_SAME:TRUE]运行正常, 守护进程是OPEN状态,守护类型是GLOBAL
[monitor] 2024-09-04 17:22:01: 组(GRP1)当前活动实例运行正常
[monitor] 2024-09-04 17:22:01: 所有组中的活动实例运行正常!
2.6、主、备库数据同步测试
(1)主库创建表,插入数据,不提交
(2)备库查询
因为主库插入的数据没有提交,备库只能查询到新创建的表,不能查询到数据。
(3)主库提交,执行commit
(4)备库再次查询
此时数据同步,备库可以查询到主库提交的数据。
3、主、备库故障切换
3.1 手动故障切换
3.1.1 前台启动非确认监视器
[dmdba@DMMONITOR bin]$ ./dmmonitor /dm8/dmmonitor_manual.ini
[monitor] 2024-09-05 23:08:58: DMMONITOR[4.0] V8
[monitor] 2024-09-05 23:08:58: DMMONITOR[4.0] IS READY.
[monitor] 2024-09-05 23:08:58:
#-----------------------------------------------------------------------------------------------#
GET MONITOR CONNECT INFO FROM DMWATCHER(GRP1_RT_02), THE FIRST LINE IS SELF INFO.
DW_CONN_TIME MON_CONFIRM MID MON_IP MON_VERSION
2024-09-05 23:08:59 FALSE 880337680 ::ffff:10.16.196.23 DMMONITOR[4.0] V8
#-----------------------------------------------------------------------------------------------#
[monitor] 2024-09-05 23:08:58: 收到守护进程(GRP1_RT_02)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-09-05 23:08:59 OPEN OK GRP1_RT_02 OPEN STANDBY NULL 3 45494 45494
[monitor] 2024-09-05 23:08:58: 收到守护进程(GRP1_RT_01)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-09-05 23:08:59 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 3 45494 45494
3.1.2 查看主备集群状态
--显示所有组的全局信息
show global info
show global info
2024-09-05 23:10:09
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 45331 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.21 65101 2024-09-05 23:10:09 GLOBAL VALID OPEN GRP1_RT_01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.22 65121 2024-09-05 23:10:09 GLOBAL VALID OPEN GRP1_RT_02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
#================================================================================#
3.1.3 登录监视器
使用login命令,输入主库数据库的用户名和密码
login
用户名:sysdba
密码:
[monitor] 2024-09-05 23:10:45: 登录监视器成功!
3.1.4 手动切换主、备库
当前主库是GRP1_RT_01,备库是GRP1_RT_02,将主库切换到GRP1_RT_02,守护组:GRP1
switchover GRP1.GRP1_RT_02
此操作需谨慎, 将会导致主库发生切换, 是否继续使用GRP1.GRP1_RT_02执行SWITCHOVER操作(YES/NO/Y/N)?
y
[monitor] 2024-09-05 23:13:16: 开始切换实例GRP1_RT_02
[monitor] 2024-09-05 23:13:16: 通知守护进程GRP1_RT_01切换SWITCHOVER状态
[monitor] 2024-09-05 23:13:16: 守护进程(GRP1_RT_01)状态切换 [OPEN-->SWITCHOVER]
[monitor] 2024-09-05 23:13:16: 切换守护进程GRP1_RT_01为SWITCHOVER状态成功
[monitor] 2024-09-05 23:13:16: 通知守护进程GRP1_RT_02切换SWITCHOVER状态
[monitor] 2024-09-05 23:13:16: 守护进程(GRP1_RT_02)状态切换 [OPEN-->SWITCHOVER]
[monitor] 2024-09-05 23:13:16: 切换守护进程GRP1_RT_02为SWITCHOVER状态成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01开始执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02开始执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01开始执行ALTER DATABASE MOUNT语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01执行ALTER DATABASE MOUNT语句成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02开始执行SP_APPLY_KEEP_PKG()语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02执行SP_APPLY_KEEP_PKG()语句成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02开始执行ALTER DATABASE MOUNT语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02执行ALTER DATABASE MOUNT语句成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01开始执行ALTER DATABASE STANDBY语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01执行ALTER DATABASE STANDBY语句成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02开始执行ALTER DATABASE PRIMARY语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02执行ALTER DATABASE PRIMARY语句成功
[monitor] 2024-09-05 23:13:16: 通知实例GRP1_RT_02修改所有归档状态无效
[monitor] 2024-09-05 23:13:16: 修改所有实例归档为无效状态成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01开始执行ALTER DATABASE OPEN FORCE语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01执行ALTER DATABASE OPEN FORCE语句成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02开始执行ALTER DATABASE OPEN FORCE语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02执行ALTER DATABASE OPEN FORCE语句成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01开始执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_01执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句成功
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02开始执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句
[monitor] 2024-09-05 23:13:16: 实例GRP1_RT_02执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句成功
[monitor] 2024-09-05 23:13:16: 通知守护进程GRP1_RT_01切换OPEN状态
[monitor] 2024-09-05 23:13:16: 守护进程(GRP1_RT_01)状态切换 [SWITCHOVER-->OPEN]
[monitor] 2024-09-05 23:13:16: 切换守护进程GRP1_RT_01为OPEN状态成功
[monitor] 2024-09-05 23:13:16: 通知守护进程GRP1_RT_02切换OPEN状态
[monitor] 2024-09-05 23:13:16: 守护进程(GRP1_RT_02)状态切换 [SWITCHOVER-->OPEN]
[monitor] 2024-09-05 23:13:17: 切换守护进程GRP1_RT_02为OPEN状态成功
[monitor] 2024-09-05 23:13:17: 通知组(GRP1)的守护进程执行清理操作
[monitor] 2024-09-05 23:13:18: 清理守护进程(GRP1_RT_01)请求成功
[monitor] 2024-09-05 23:13:18: 清理守护进程(GRP1_RT_02)请求成功
[monitor] 2024-09-05 23:13:18: 实例GRP1_RT_02切换成功
2024-09-05 23:13:18
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 45331 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.22 65121 2024-09-05 23:13:18 GLOBAL VALID OPEN GRP1_RT_02 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.7.111 5236 OK GRP1_RT_02 OPEN PRIMARY 0 0 REALTIME VALID 3245 45550 3245 45550 NONE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.21 65101 2024-09-05 23:13:18 GLOBAL VALID OPEN GRP1_RT_01 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME INVALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.7.110 5236 OK GRP1_RT_01 OPEN STANDBY 0 0 REALTIME INVALID 3243 45494 3243 45494 NONE
DATABASE(GRP1_RT_01) APPLY INFO FROM (GRP1_RT_02), REDOS_PARALLEL_NUM (1), WAIT_APPLY[FALSE]:
DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[3243, 3243, 3243], (RLSN, SLSN, KLSN)[45494, 45494, 45494], N_TSK[0], TSK_MEM_USE[0]
REDO_LSN_ARR: (45494)
#================================================================================#
[monitor] 2024-09-05 23:13:19: 守护进程(GRP1_RT_02)状态切换 [OPEN-->RECOVERY]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-09-05 23:13:20 RECOVERY OK GRP1_RT_02 OPEN PRIMARY VALID 4 45550 45550
[monitor] 2024-09-05 23:13:21: 守护进程(GRP1_RT_02)状态切换 [RECOVERY-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-09-05 23:13:21 OPEN OK GRP1_RT_02 OPEN PRIMARY VALID 4 45550 45550
3.1.5 查看主、备库状态
切换后,查看主备状态,主库已经切换到GRP1_RT_02 。
show global info
2024-09-05 23:15:27
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 45331 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.22 65121 2024-09-05 23:15:27 GLOBAL VALID OPEN GRP1_RT_02 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.21 65101 2024-09-05 23:15:27 GLOBAL VALID OPEN GRP1_RT_01 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
3.1.6 主、备库数据同步测试
新主库插入测试数据
[dmdba@DMDW02 bin]$ disql sysdba/Dameng123
服务器[LOCALHOST:5236]:处于主库打开状态
登录使用时间 : 3.911(ms)
disql V8
SQL> select name,instance_name,status$,mode$ from v$instance;
行号 NAME INSTANCE_NAME STATUS$ MODE$
---------- ---------- ------------- ------- -------
1 GRP1_RT_02 GRP1_RT_02 OPEN PRIMARY
已用时间: 0.254(毫秒). 执行号:1101.
SQL> select * from t1;
行号 ID
---------- -----------
1 1
2 2
SQL> insert into t1 values(3),(5);
影响行数 2
已用时间: 0.762(毫秒). 执行号:1103.
SQL>
SQL>
SQL> commit;
操作已执行
已用时间: 1.950(毫秒). 执行号:1104.
SQL>
查看备库,新添加的数据已经同步。
[dmdba@DMDW01 bin]$ disql sysdba/Dameng123
服务器[LOCALHOST:5236]:处于备库打开状态
登录使用时间 : 2.975(ms)
disql V8
SQL>
SQL>
SQL> select name,instance_name,status$,mode$ from v$instance;
行号 NAME INSTANCE_NAME STATUS$ MODE$
---------- ---------- ------------- ------- -------
1 GRP1_RT_01 GRP1_RT_01 OPEN STANDBY
已用时间: 0.768(毫秒). 执行号:1401.
SQL>
SQL> select * from t1;
行号 ID
---------- -----------
1 1
2 2
3 3
4 5
已用时间: 0.239(毫秒). 执行号:1404.
SQL>
将主库切换回GRP1_RT_01
switchover GRP1.GRP1_RT_01
show global info
2024-09-05 23:33:48
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 45331 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.21 65101 2024-09-05 23:33:48 GLOBAL VALID OPEN GRP1_RT_01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.16.196.22 65121 2024-09-05 23:33:47 GLOBAL VALID OPEN GRP1_RT_02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
#================================================================================#
4、守护集群的开启和关闭
开启顺序:
(1)打开主库
(2)打开备库
(3)打开监视器
关闭顺序:
(1)关闭监视器
(2)关闭备库守护进程
(3)关闭主库守护进程
(4)关闭主库实例
(5)关闭备库实例
5、读写分离集群部署
读写分离集群部署与数据守护集群部署步骤基本一致,不同的地方在归档的配置:ARCH_TYPE = TIMELY 是即时归档类型,而数据守护集群的归档是ARCH_TYPE = REALTIME 是实时归档类型。