DM 数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,是数据库异地容灾的首选方案。通过部署 DM 数据守护,可以在硬件故障(如磁盘损坏)、自然灾害(地震、火灾)等极端情况下,避免数据损坏、丢失,保障数据安全,并且可以快速恢复数据库服务,满足用户不间断提供数据库服务的要求。与常规的数据库备份(Backup)、还原(Restore)技术相比,数据守护可以更快地恢复数据库服务。随着数据规模不断增长,通过还原手段恢复数据,往往需要数个小时、甚至更长时间,而数据守护基本不受数据规模的影响,只需数秒时间就可以将备库切换为主库对外提供数据库服务。
DM 数据守护(DM Data Watch)的实现原理非常简单:将主库(生产库)产生的 Redo 日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。DM数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。
DM 数据守护系统主要由主库、备库、Redo 日志、Redo 日志传输、Redo 日志重演、守护进程(dmwatcher)、监视器(dmmonitor)组成。架构如下:
- 数据库
数据库(Database)是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件),保存在物理磁盘或文件系统中。
- 数据库实例
数据库实例(Instance)就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。通过数据库实例,可以操作数据库,一般情况下,我们访问、修改数据库都是通过数据库实例来完成的。
- 主库
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 日志写入联机日志文件。
- MAL 系统
MAL 系统是基于 TCP 协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。DM 通过 MAL 系统实现 Redo 日志传输,以及其他一些实例间的消息通讯。
- 守护进程
守护进程(dmwatcher)是数据守护系统的核心工具。
- 监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案。
- 守护进程是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;
- 同时,守护进程也会将收到的数据库实例消息转发给其他守护进程和监视器。
- 守护进程必须和被守护的数据库实例部署在同一台机器上。
- 监视器
监视器(dmmonitor)用来监控守护系统内守护进程、数据库实例信息,执行用户输入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的机器上。
- DMDataWatch集群部署
类型 | 主机名 | 业务IP | 数据库名 | 实例名 | 操作系统 |
主库 | dm8dw01 | 84.0.191.5 10.10.10.5 | CUGDB | CUGDB01 | Kylin-Server-V10-SP3 |
备库 | dm8dw02 | 84.0.191.6 10.10.10.6 | CUGDB | CUGDB02 | Kylin-Server-V10-SP3 |
监控 | dm8dw03 | 84.0.191.7 10.10.10.7 | Kylin-Server-V10-SP3 |
组名为GRP1,主库为:CUGDB01,备库为:CUGDB02
实例名 | PORT_NUM | MAL_INST_DW_PORT | MAL_HOST | MAL_PORT | MAL_DW_PORT |
CUGDB01 | 5236 | 5336 | 10.10.10.5 | 5436 | 5536 |
CUGDB02 | 5236 | 5336 | 10.10.10.6 | 5436 | 5536 |
类型 | 实例端口 | 实例 目录 | 归档 目录 | 日志 目录 | 备份 目录 |
主库 | 5236 | /dm8/data/CUGDB | /dm8/data/CUGDB/arch | /dm8/data/CUGDB/log | /dm8/backup |
备库 | 5236 | /dm8/data/CUGDB | /dm8/data/CUGDB/arch | /dm8/data/CUGDB/log | /dm8/backup |
# cat /etc/hosts
84.0.191.5 dm8dw01
10.10.10.5 dm8dw01prv
84.0.191.6 dm8dw02
84.0.191.6 dm8dw02prv
84.0.191.7 dm8monitor
10.10.10.7 dm8monitorprv
systemctl stop firewalld
systemctl disable firewalld
sed -i '/^SELINUX=.*/ s//SELINUX=disabled/' /etc/selinux/config
setenforce 0
-
-
- sysctl.conf参数配置
-
##添加配置:
cat >> /etc/systemd/system.conf << EOF
DefaultLimitNOFILE=65536
DefaultLimitNPROC=10240
EOF
-
-
- limits.conf 参数配置
-
cat >> /etc/security/limits.conf << EOF
dmdba soft nproc 10240
dmdba hard nproc 10240
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba hard stack 32768
dmdba soft stack 16384
dmdba hard data unlimited
dmdba soft data unlimited
dmdba hard fsize unlimited
dmdba soft fsize unlimited
dmdba soft core unlimited
dmdba hard core unlimited
EOF
参数说明:
core - 限制内核文件的大小(KB)
nproc 对每个用户创建的进程数的限制,默认的很小,泄露的时候多
nofile-一个进程能打开的文件数
stack堆大小,堆-存放变量的位置
重启后验证limit参数:
su - dmdba
ulimit -a ## 确认是否生效
-
-
- nproc.conf参数配置
-
其中麒麟 10 中是 nproc.conf;
##添加配置:
cat >> /etc/security/limits.d/nproc.conf << EOF
dmdba soft nproc 65536
dmdba hard nproc 65536
EOF
参数说明:
soft 表示软限制,hard 表示硬限制,nproc 进程数,nofile 文件数
##确定是否生效:
$ ulimit -u
10240
groupadd dinstall
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
passwd dmdba
su – dmdba
vi .bash_profile
export DM_HOME=/dm8/dmdbms
export PATH=$DM_HOME/bin:$PATH:$DM_HOME/tool:$PATH:HOME/bin:/usr/local/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin
. .bash_profile 让其生效
##主备库
mkdir -p /dm8/dmdbms
mkdir -p /dm8/data/arch
mkdir -p /dm8/data/log
mkdir -p /dm8/data/backupon
chown -R dmdba:dinstall /dm8
chmod 755 -R /dm8
##monitor
mkdir -p /dm8/dmdbms
mkdir -p /dm8/data/monitor
mkdir -p /dm8/data/log
chown -R dmdba:dinstall /dm8
chmod 755 -R /dm8
注:安装dm soft并初始化实例
[root@dm8dw01 ~]# mount -o loop /soft/dm8_20231109_x86_kylin10_64.iso /mnt
[dmdba@dm8dw01 mnt]$ ./DMInstall.bin -i
Installer Language:
[1]: 简体中文
[2]: English
Please select the installer's language [2]:1
解压安装程序..........
欢迎使用达梦数据库安装程序
是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:n
是否设置时区? (Y/y:是 N/n:否) [Y/y]:y
设置时区:
[ 1]: (GTM-12:00) 日界线西
[ 2]: (GTM-11:00) 萨摩亚群岛
[ 3]: (GTM-10:00) 夏威夷
[ 4]: (GTM-09:00) 阿拉斯加
[ 5]: (GTM-08:00) 太平洋时间(美国和加拿大)
[ 6]: (GTM-07:00) 亚利桑那
[ 7]: (GTM-06:00) 中部时间(美国和加拿大)
[ 8]: (GTM-05:00) 东部部时间(美国和加拿大)
[ 9]: (GTM-04:00) 大西洋时间(美国和加拿大)
[10]: (GTM-03:00) 巴西利亚
[11]: (GTM-02:00) 中大西洋
[12]: (GTM-01:00) 亚速尔群岛
[13]: (GTM) 格林威治标准时间
[14]: (GTM+01:00) 萨拉热窝
[15]: (GTM+02:00) 开罗
[16]: (GTM+03:00) 莫斯科
[17]: (GTM+04:00) 阿布扎比
[18]: (GTM+05:00) 伊斯兰堡
[19]: (GTM+06:00) 达卡
[20]: (GTM+07:00) 曼谷,河内
[21]: (GTM+08:00) 中国标准时间
[22]: (GTM+09:00) 首尔
[23]: (GTM+10:00) 关岛
[24]: (GTM+11:00) 所罗门群岛
[25]: (GTM+12:00) 斐济
[26]: (GTM+13:00) 努库阿勒法
[27]: (GTM+14:00) 基里巴斯
请选择时区 [21]:21
安装类型:
1 典型安装
2 服务器
3 客户端
4 自定义
请选择安装类型的数字序号 [1 典型安装]:1
所需空间: 2037M
请选择安装目录 [/home/dmdba/dmdbms]:/dm8/dmdbms
可用空间: 46G
是否确认安装路径(/dm8/dmdbms)? (Y/y:是 N/n:否) [Y/y]:y
安装前小结
安装位置: /dm8/dmdbms
所需空间: 2037M
可用空间: 46G
版本信息:
有效日期:
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y
2024-01-10 11:33:03
[INFO] 安装达梦数据库...
2024-01-10 11:33:04
[INFO] 安装 基础 模块...
2024-01-10 11:33:10
[INFO] 安装 服务器 模块...
2024-01-10 11:33:11
[INFO] 安装 客户端 模块...
2024-01-10 11:33:13
[INFO] 安装 驱动 模块...
2024-01-10 11:33:16
[INFO] 安装 手册 模块...
2024-01-10 11:33:16
[INFO] 安装 服务 模块...
2024-01-10 11:33:17
[INFO] 移动日志文件。
2024-01-10 11:33:17
[INFO] 安装达梦数据库完成。
请以root系统用户执行命令:
/dm8/dmdbms/script/root/root_installer.sh
安装结束
[root@dm8dw01 ~]# /dm8/dmdbms/script/root/root_installer.sh
移动 /dm8/dmdbms/bin/dm_svc.conf 到/etc目录
创建DmAPService服务
Created symlink /etc/systemd/system/multi-user.target.wants/DmAPService.service → /usr/lib/systemd/system/DmAPService.service.
创建服务(DmAPService)完成
启动DmAPService服务
##创建实例
[root@dm8dw01 ~]# su - dmdba
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dminit path=/dm8/data EXTENT_SIZE=16 PAGE_SIZE=32 case_sensitive=1 charset=1 log_size=2048 db_name=CUGDB instance_name=CUGDB01 PORT_NUM=5236 LENGTH_IN_CHAR=1 BLANK_PAD_MODE=0 SYSDBA_PWD="SYSDBA2023" SYSAUDITOR_PWD="SYSDBA2023" ELOG_PATH=/dm8/data/log
##初始化
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmserver /dm8/data/CUGDB/dm.ini
file dm.key not found, use default license!
version info: develop
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V8 1-1-72-20.04.03-119959-ENT startup...
....
systables desc init success.
ndct_db_load_info success.
nsvr_process_before_open begin.
nsvr_process_before_open success.
total 0 active crash trx, pseg_crash_trx_rollback begin ...
pseg_crash_trx_rollback end
SYSTEM IS READY. ##表示成功
对于新初始化的库需要先正常启动并正常退出,然后才允许mount方式启动。
使用dminit初始化的实例,需要先前台起一次数据库服务,出现system is ready后输入exit停止数据库。
[root@dm8dw01 ~]# /dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /dm8/data/CUGDB/dm.ini -p CUGDB
[root@dm8dw01 ~]# systemctl start DmServiceCUGDB
[dmdba@dm8dw01 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236
//切换数据库到配置状态
SQL> alter database mount;
//设置本地归档,归档路径,归档尺寸
SQL> alter database add ARCHIVELOG 'type=local,dest=/dm8/data/arch,file_size=1024,space_limit=0';
//开启归档
SQL> alter database ARCHIVELOG;
//打开数据库
SQL> alter database open;
SQL> select arch_mode from v$database;
LINEID ARCH_MODE
---------- ---------
Y
说明:
space_limit参数对应dmarch.ini中ARCH_SPACE_LIMIT参数。
该参数表示归档文件的磁盘空间限制,如果归档文件总大小超过这个值,则在生成新归档文件前会删除最老的一个归档文件。
如果在设置时,该参数设置为0表示不受限制。
安装dm soft并初始化实例
同上
##创建实例
[root@dm8dw02 ~]# su - dmdba
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dminit path=/dm8/data EXTENT_SIZE=16 PAGE_SIZE=32 case_sensitive=1 charset=1 log_size=2048 db_name=CUGDB instance_name=CUGDB02 PORT_NUM=5236 LENGTH_IN_CHAR=1 BLANK_PAD_MODE=0 SYSDBA_PWD="SYSDBA2023" SYSAUDITOR_PWD="SYSDBA2023" ELOG_PATH=/dm8/data/log
##初始化
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmserver /dm8/data/CUGDB/dm.ini
[root@dm8dw02 ~]# /dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /dm8/data/CUGDB/dm.ini -p CUGDB
[root@dm8dw01 ~]# systemctl start DmServiceCUGDB
[dmdba@dm8dw01 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236
//切换数据库到配置状态
SQL> alter database mount;
//设置本地归档,归档路径,归档尺寸
SQL> alter database add ARCHIVELOG 'type=local,dest=/dm8/data/arch,file_size=1024,space_limit=0';
//开启归档
SQL> alter database ARCHIVELOG;
//打开数据库
SQL> alter database open;
SQL> select arch_mode from v$database;
LINEID ARCH_MODE
---------- ---------
Y
只安装dm soft不初始化实例
同上
[dmdba@dm8dw01 ~]$ ps -ef|grep dmap
若未启动,则先启动 DMAP 服务
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmAPService start
Starting DmAPService: [ OK ]
- 正常关闭主机数据库
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop
- 进行脱机备份
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/CUGDB/dm.ini' FULL BACKUPSET '/dm8/data/backup'"
- 拷贝备份文件到备库所在机器
[dmdba@dm8dw01 ~]$ scp -rp /dm8/data/backup/* 84.0.191.6:/dm8/data/backup
- 执行脱机数据库还原与恢复
数据库还原:
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/CUGDB/dm.ini' FROM BACKUPSET '/dm8/data/backup'"
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/CUGDB/dm.ini' UPDATE DB_MAGIC"
- 对主库进行联机备份操作
[dmdba@dm8dw01 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236
SQL> BACKUP DATABASE BACKUPSET '/dm8/back';
- 拷贝备份文件到备库所在机器
[dmdba@dm8dw01 ~]$ scp -rp /dm8/back/* 84.0.191.6:/dm8/back
- 执行脱机数据库还原与恢复
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/CUGDB/dm.ini' FROM BACKUPSET '/dm8/back'"
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/CUGDB/dm.ini' FROM BACKUPSET '/dm8/back'"
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/CUGDB/dm.ini' UPDATE DB_MAGIC"
与 DM 数据守护相关的配置文件包括:
数据库配置文件 dm.ini
数据库控制文件 dm.ctl
MAL 配置文件 dmmal.ini
Redo 日志归档配置文件 dmarch.ini
守护进程配置文件 dmwatcher.ini
监视器配置文件 dmmonitor.ini
定时器配置文件 dmtimer.ini
MPP 控制文件 dmmpp.ctl 等等
在主库机器上配置主库的实例名为 CUGDB01, dm.ini 参数修改如下:
[dmdba@dm8dw01 ~]$ vi /dm8/data/CUGDB/dm.ini
INSTANCE_NAME = CUGDB01 #实例名
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次的日志发送信息
配置 MAL 系统,主库通过 MAL 系统发送 REDO 日志到备库
各主备库的 dmmal.ini 配置必须完全一致, MAL_HOST 使用内部网络 IP,MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值, MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
vi /dm8/data/CUGDB/dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = CUGDB01 #实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 10.10.10.5 #MAL系统监听TCP连接的IP地址,可以使用私网IP
MAL_PORT = 5436 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 84.0.191.5 #实例的对外服务IP地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 5536 #实例对应的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 5336 #实例监听守护进程TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = CUGDB02
MAL_HOST = 10.10.10.6
MAL_PORT = 5436
MAL_INST_HOST = 84.0.191.6
MAL_INST_PORT = 5236
MAL_DW_PORT = 5536
MAL_INST_DW_PORT = 5336
配置本地归档和即时归档。
除了本地归档外,其他归档配置项中的ARCH_DEST表示实例是Primary模式时,需要同步归档数据的目标实例名。
当前实例CUGDB01是主库,需要向即时备库CUGDB02同步数据,因此即时归档的ARCH_DEST配置为CUGDB02。
[dmdba@dm8dw01 ~]$vi /dm8/data/CUGDB/dmarch.ini
[ARCHIVE_TIMELY1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = CUGDB02 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 2048 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~4294967294M
实时读写分离同样也支持事务一致模式和高性能模式,由配置文件 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来确定,1 表示事务一致模式,0 表示高性能模式。实时读写分离下,默认采用高性能模式。
注意
实时读写分离的事务一致模式仅在数据守护配置为自动切换模式下才会生效。对于配置实时归档的DMDSC数据守护集群,不支持事务一致模式,即不支持将ARCH_WAIT_APPLY或WAIT_APPLY配置为1。
配置守护进程,配置为全局守护类型,使用自动切换模式。(主备库配置一致)
[dmdba@dm8dw01 ~]$vi /dm8/data/CUGDB/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453332 #守护系统唯一OGUID值
INST_INI = /dm8/data/CUGDB/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
[dmdba@dm8dw01 ~]$ scp /dm8/data/CUGDB/dmwatcher.ini 84.0.191.6:/dm8/data/CUGDB/
主库(以mount形式启动)
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmserver /dm8/data/CUGDB/dm.ini mount
打开另外一个窗口,以上窗口不要关闭
[dmdba@dm8dw01 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> sp_set_oguid(453332); #与dmwatcher.ini中INST_OGUID相同
SQL> alter database primary;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL> select status$ from v$instance;
LINEID STATUS$
---------- -------
1 MOUNT
[dmdba@dm8dw01 ~]$ vi /dm8/data/CUGDB/dmmonitor.ini
MON_DW_Confirm = 0 #1确认监视器模式,0表示观察监视器
MON_LOG_PATH = /dm8/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453332 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 10.10.10.5:5536 #私网IP
MON_DW_IP = 10.10.10.6:5536 #私网IP
注:
配置确认监视器,其中MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT配置项保持一致。
主库:
[root@dm8dw01 ~]# /dm8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/CUGDB/dmwatcher.ini -p CUGDB01
主备库启动服务:
[root@dm8dw01 ~]# systemctl start DmWatcherServiceCUGDB01
或者
[root@dm8dw01 ~]# su - dmdba
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB01 start
主备进程启动后,进入startup状态,守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例切换为OPEN.
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 OPEN
或者手工确认
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmwatcher /dm8/data/CUGDB/dmwatcher.ini
数据库会自动从 mount转换成open状态。
SQL> select status$ from v$instance;
行号 STATUS$
---------- -------
1 OPEN
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmmonitor /dm8/data/CUGDB/dmmonitor.ini
[dmdba@dm8dw02 ~]$ vi /dm8/data/CUGDB/dm.ini
INSTANCE_NAME = CUGDB02
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次的日志发送信息
配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致, MAL_HOST 使用内部网络 IP, MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值, MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
vi /dm8/data/CUGDB/dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = CUGDB01 #实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 10.10.10.5 #MAL系统监听TCP连接的IP地址,可以使用私同IP
MAL_PORT = 5436 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 84.0.191.5 #实例的对外服务IP地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 5536 #实例对应的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 5336 #实例监听守护进程TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = CUGDB02
MAL_HOST = 10.10.10.6
MAL_PORT = 5436
MAL_INST_HOST = 84.0.191.6
MAL_INST_PORT = 5236
MAL_DW_PORT = 5536
MAL_INST_DW_PORT = 5336
即时归档目标实例为CUGDB01
[dmdba@dm8dw02 ~]$vi /dm8/data/CUGDB/dmarch.ini
[ARCHIVE_TIMELY1]
ARCH_TYPE = REALTIME #即时归档类型
ARCH_DEST = CUGDB01 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 2048 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~4294967294M
dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。(主备库配置一致)。
[dmdba@dm8dw02 ~]$vi /dm8/data/CUGDB/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453332 #守护系统唯一OGUID值
INST_INI = /dm8/data/CUGDB/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
启动到mount状态下操作
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin//dmserver /dm8/data/CUGDB/dm.ini mount
打开另外一个窗口,以上窗口不要关闭
[dmdba@dm8dw02 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> sp_set_oguid(453332); ##设置所有备库的OGUID与主库相同
SQL> alter database standby; ##修改备库模式
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL> select status$ from v$instance;
LINEID STATUS$
---------- -------
1 MOUNT
[dmdba@dm8dw02 ~]$ vi /dm8/data/CUGDB/dmmonitor.ini
MON_DW_Confirm = 0 #1确认监视器模式,0表示观察监视器
MON_LOG_PATH = /dm8/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453332 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 10.10.10.5:5536 #私网IP
MON_DW_IP = 10.10.10.6:5536 #私网IP
注:
配置确认监视器,其中MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT配置项保持一致。
[root@dm8dw02 ~]# /dm8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/CUGDB/dmwatcher.ini -p CUGDB02
备库启动服务:
[root@dm8dw02 ~]# systemctl start DmWatcherServiceCUGDB02
或者
[root@dm8dw02 ~]# su - dmdba
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB02 start
主备进程启动后,进入startup状态,守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例切换为OPEN.
至此主备守护进程集群搭建完毕,在搭建步骤和各项配置都正确的情况下,在监视器上执行show命令,可以监控到所有实例都处于Open状态,所有守护进程也都处于Open状态,即为正常运行状态。
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmmonitor /dm8/data/CUGDB/dmmonitor.ini
在监视器服务器上配置
配置确认监视器,其中MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT配置项保持一致。
[dmdba@dm8monitor ~]$ vi /dm8/data/monitor/dmmonitor.ini
MON_DW_Confirm = 1 #1确认监视器模式,0表示观察监视器
MON_LOG_PATH = /dm8/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453332 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 10.10.10.5:5536 #私网IP
MON_DW_IP = 10.10.10.6:5536 #私网IP
[dmdba@dm8monitor ~]$ /dm8/dmdbms/bin/dmmonitor /dm8/data/monitor/dmmonitor.ini
关闭确认监视器
/dm8/dmdbms/bin/DmWatcherServiceCUGDB01 stop
关闭备库的守护进程,再关闭主库守护进程
/dm8/dmdbms/bin/DmWatcherServiceCUGDB02 stop
/dm8/dmdbms/bin/DmWatcherServiceCUGDB01 stop
再关闭主库实例,最后关闭备库实例:
/dm8/dmdbms/bin/DmServiceCUGDB01 stop
/dm8/dmdbms/bin/DmServiceCUGDB02 stop
先启动主库守护进程,再启动备库守护进程。
因为dmwatcher.ini中配置了INST_AUTO_RESTART = 1 ,守护进程启动后,会自动拉起数据库实例。
dmdba用户:
[root@dm8dw01 ~]# su - dmdba
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB01 start
[root@dm8dw02 ~]# su - dmdba
[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB02 start
启动监视器:/dm8/dmdbms/bin/dmmonitor /dm8/data/CUGDB/dmmonitor.ini
禁用开机自启
systemctl disable DmServiceCUGDB.service
systemctl disable DmWatcherServiceCUGDB01
在监视器上禁用监视器服务
systemctl disable DmMonitorServiceDM.service
sleep 180 表示等待 3min 再启动实例服务和守护进程
数据库主和备服务器上如下:
vi startDatabase.sh
#!/bin/bash
sleep 180
/dm8/dmdbms/bin/DmWatcherServiceCUGDB01 start #如果配置了DmServer自动启动,下面这行不需要
/dm8/dmdbms/bin/DmServiceCUGDB01 start
chmod +x startDatabase.sh
监视器服务等待 5 分钟后启动
#!/bin/bash
sleep 300
/dm8/dmdbms/bin/DmMonitorServiceDM start
dm8dw01>$disql SYSDBA/SYSDBA2023@127.0.0.1:5236
-- 创建表空间
SQL>create tablespace "OMP_TS" datafile '/dm8/data/CUGDB/omp01.dbf' size 1024 autoextend on;
-- 创建用户及授权
CREATE USER omp IDENTIFIED BY "omp123123!" DEFAULT TABLESPACE OMP_TS;
-- 密码时效不做限制
alter user "omp" limit password_lock_time unlimited;
-- 授权
GRANT RESOURCE TO omp;
-- omp用户登录
[dmdba@dm8dw01 ~]$ disql omp/'omp123123!'@127.0.0.1:5236
create table year_2001(
ID number(10) primary key not null,
name varchar2(30),
port VARCHAR(255),
speed VARCHAR(255),
type VARCHAR(255),
create_time date
);
begin
for i in 1..20 loop
insert into year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-20 18:31:34','YYYY-MM-DD HH24:MI:SS'));
end loop;
commit;
end;
/
commit;
SQL> select count(*) from year_2001;
行号 COUNT(*)
---------- --------------------
1 20
[dmdba@dm8dw02 ~]$ disql SYSDBA/SYSDBA@127.0.0.1:5236
SQL> select count(*) from year_2001;
行号 COUNT(*)
---------- --------------------
1 20
结论:dm8dw01和dm8dw02数据完全一致。
[dmdba@dm8dw01 ~]$ ps -ef | grep dm
[dmdba@dm8dw01 ~]$ kill -9 1149
#--------------------------------------------------------------------------------#
[monitor] 2023-12-25 20:48:15: 收到守护进程(CUGDB01)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-12-25 20:48:15 OPEN OK CUGDB01 OPEN PRIMARY VALID 4 42178 42178
[monitor] 2023-12-25 20:48:15: 收到守护进程(CUGDB02)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-12-25 20:48:15 OPEN OK CUGDB02 OPEN STANDBY VALID 4 42178 42178
[monitor] 2024-01-10 14:32:39: 实例CUGDB01[PRIMARY, OPEN, ISTAT_SAME:TRUE]故障
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-12-25 20:58:39 STARTUP ERROR CUGDB01 OPEN PRIMARY VALID 4 42466 42466
[monitor] 2024-01-10 14:32:39: 守护进程(CUGDB01)状态切换 [OPEN-->STARTUP]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-12-25 20:58:39 STARTUP ERROR CUGDB01 OPEN PRIMARY VALID 4 42466 42466
[monitor] 2024-01-10 14:32:39: 检测到PRIMARY实例故障,开始对组(GRP1)执行自动接管
[monitor] 2024-01-10 14:32:39: 通知组(GRP1)当前活动的守护进程设置MID
[monitor] 2024-01-10 14:32:39: 通知组(GRP1)当前活动的守护进程设置MID成功
[monitor] 2024-01-10 14:32:39: 开始使用实例CUGDB02接管
[monitor] 2024-01-10 14:32:39: 通知守护进程CUGDB02切换TAKEOVER状态
[monitor] 2024-01-10 14:32:39: 守护进程(CUGDB02)状态切换 [OPEN-->TAKEOVER]
[monitor] 2024-01-10 14:32:39: 切换守护进程CUGDB02为TAKEOVER状态成功
[monitor] 2024-01-10 14:32:39: 实例CUGDB02开始执行SP_SET_GLOBAL_DW_STATUS(0, 7)语句
[monitor] 2024-01-10 14:32:39: 实例CUGDB02执行SP_SET_GLOBAL_DW_STATUS(0, 7)语句成功
[monitor] 2024-01-10 14:32:39: 实例CUGDB02开始执行ALTER DATABASE MOUNT语句
[monitor] 2024-01-10 14:32:39: 实例CUGDB02执行ALTER DATABASE MOUNT语句成功
[monitor] 2024-01-10 14:32:39: 实例CUGDB02开始执行ALTER DATABASE PRIMARY语句
[monitor] 2024-01-10 14:32:39: 实例CUGDB02执行ALTER DATABASE PRIMARY语句成功
[monitor] 2024-01-10 14:32:39: 通知实例CUGDB02修改所有归档状态无效
[monitor] 2024-01-10 14:32:39: 修改所有实例归档为无效状态成功
[monitor] 2024-01-10 14:32:39: 实例CUGDB02开始执行ALTER DATABASE OPEN FORCE语句
[monitor] 2024-01-10 14:32:39: 实例CUGDB02执行ALTER DATABASE OPEN FORCE语句成功
[monitor] 2024-01-10 14:32:39: 实例CUGDB02开始执行SP_SET_GLOBAL_DW_STATUS(7, 0)语句
[monitor] 2024-01-10 14:32:39: 实例CUGDB02执行SP_SET_GLOBAL_DW_STATUS(7, 0)语句成功
[monitor] 2024-01-10 14:32:39: 通知守护进程CUGDB02切换OPEN状态
[monitor] 2024-01-10 14:33:41: 守护进程(CUGDB02)状态切换 [TAKEOVER-->OPEN]
[monitor] 2024-01-10 14:33:41: 切换守护进程CUGDB02为OPEN状态成功
[monitor] 2024-01-10 14:33:41: 通知组(GRP1)的守护进程执行清理操作
[monitor] 2024-01-10 14:33:41: 清理守护进程(CUGDB01)请求成功
[monitor] 2024-01-10 14:33:42: 清理守护进程(CUGDB02)请求成功
[monitor] 2024-01-10 14:33:42: 使用实例CUGDB02接管成功
[monitor] 2024-01-10 14:33:42: 组(GRP1)使用实例CUGDB02自动接管成功
[monitor] 2024-01-10 14:33:42: 实例CUGDB01[STANDBY, MOUNT, ISTAT_SAME:TRUE]恢复正常
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-01-10 14:33:53: STARTUP OK CUGDB01 MOUNT STANDBY INVALID 4 42466 42466
[monitor] 2024-01-10 14:33:43: 守护进程(CUGDB01)状态切换 [STARTUP-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-12-25 20:58:53 OPEN OK CUGDB01 OPEN STANDBY INVALID 4 42466 42466
[monitor] 2024-01-10 14:33:43: 守护进程(CUGDB02)状态切换 [OPEN-->RECOVERY]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-01-10 14:33:53: RECOVERY OK CUGDB02 OPEN PRIMARY VALID 5 42654 42654
[monitor] 2024-01-10 14:33:53: 守护进程(CUGDB02)状态切换 [RECOVERY-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-01-10 14:33:53: OPEN OK CUGDB02 OPEN PRIMARY VALID 5 42654 42654
结论:dm8dw01出现故障后,dm8dw02自动接管升为PRIMARY主库,dmdb02数据库读写一切正常。
[dmdba@dm8dw02 ~]$ disql omp/'omp123123!'@127.0.0.1:5236
SQL> begin
for i in 21..40 loop
insert into year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-21 23:51:49','YYYY-MM-DD HH24:MI:SS'));
end loop;
commit;
end;
/
SQL> select count(*) from year_2001;
行号 COUNT(*)
---------- --------------------
1 40
结论: dm8dw02自动接管后,由standby库升为PRIMARY 库,dmdb02数据库可读写。
[dmdba@dm8dw01 ~]$ ps -ef | grep dm
root 491 2 0 20:28 ? 00:00:00 [kdmflush]
root 498 2 0 20:28 ? 00:00:00 [kdmflush]
root 516 2 0 20:28 ? 00:00:00 [xfs-buf/dm-0]
root 517 2 0 20:28 ? 00:00:00 [xfs-data/dm-0]
root 518 2 0 20:28 ? 00:00:00 [xfs-conv/dm-0]
root 519 2 0 20:28 ? 00:00:00 [xfs-cil/dm-0]
root 520 2 0 20:28 ? 00:00:00 [xfs-reclaim/dm-]
root 521 2 0 20:28 ? 00:00:00 [xfs-log/dm-0]
root 523 2 0 20:28 ? 00:00:00 [xfsaild/dm-0]
root 925 1 0 20:28 ? 00:00:00 /sbin/mdadm --monitor --scan --syslog -f --pid-file=/run/mdadm/mdadm.pid
dmdba 1151 1 0 20:28 ? 00:00:00 /dm8/dmdbms/bin/dmap
root 1916 1866 0 20:31 pts/0 00:00:00 su - dmdba
dmdba 1921 1916 0 20:31 pts/0 00:00:00 -bash
root 2025 1978 0 20:32 pts/1 00:00:00 su - dmdba
dmdba 2030 2025 0 20:32 pts/1 00:00:00 -bash
dmdba 2317 1 0 20:47 pts/0 00:00:01 /dm8/dmdbms/bin/dmwatcher path=/dm8/data/CUGDB/dmwatcher.ini -noconsole
dmdba 2346 2030 0 20:48 pts/1 00:00:04 /dm8/dmdbms/bin/dmmonitor /dm8/data/CUGDB/dmmonitor.ini
dmdba 2411 1 0 20:58 ? 00:00:02 /dm8/dmdbms/bin/dmserver /dm8/data/CUGDB/dm.ini mount
dmdba 2849 1921 0 21:27 pts/0 00:00:00 ps -ef
dmdba 2850 1921 0 21:27 pts/0 00:00:00 grep dm
[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB01 restart
Stopping DmWatcherServiceCUGDB01: [ OK ]
Starting DmWatcherServiceCUGDB01: [ OK ]
[dmdba@dm8dw01 ~]$ ps -ef | grep dm
root 491 2 0 20:28 ? 00:00:00 [kdmflush]
root 498 2 0 20:28 ? 00:00:00 [kdmflush]
root 516 2 0 20:28 ? 00:00:00 [xfs-buf/dm-0]
root 517 2 0 20:28 ? 00:00:00 [xfs-data/dm-0]
root 518 2 0 20:28 ? 00:00:00 [xfs-conv/dm-0]
root 519 2 0 20:28 ? 00:00:00 [xfs-cil/dm-0]
root 520 2 0 20:28 ? 00:00:00 [xfs-reclaim/dm-]
root 521 2 0 20:28 ? 00:00:00 [xfs-log/dm-0]
root 523 2 0 20:28 ? 00:00:00 [xfsaild/dm-0]
root 925 1 0 20:28 ? 00:00:00 /sbin/mdadm --monitor --scan --syslog -f --pid-file=/run/mdadm/mdadm.pid
dmdba 1151 1 0 20:28 ? 00:00:00 /dm8/dmdbms/bin/dmap
root 1916 1866 0 20:31 pts/0 00:00:00 su - dmdba
dmdba 1921 1916 0 20:31 pts/0 00:00:00 -bash
root 2025 1978 0 20:32 pts/1 00:00:00 su - dmdba
dmdba 2030 2025 0 20:32 pts/1 00:00:00 -bash
dmdba 2346 2030 0 20:48 pts/1 00:00:04 /dm8/dmdbms/bin/dmmonitor /dm8/data/CUGDB/dmmonitor.ini
dmdba 2411 1 0 20:58 ? 00:00:02 /dm8/dmdbms/bin/dmserver /dm8/data/CUGDB/dm.ini mount
dmdba 2907 1 0 21:28 pts/0 00:00:00 /dm8/dmdbms/bin/dmwatcher path=/dm8/data/CUGDB/dmwatcher.ini -noconsole
dmdba 2938 1921 0 21:29 pts/0 00:00:00 ps -ef
dmdba 2939 1921 0 21:29 pts/0 00:00:00 grep dm
-
-
- 查看dm8dw01和dm8dw02状态
-
[monitor] 2023-12-25 21:28:35: 守护进程(CUGDB01)状态切换 [NONE-->STARTUP]
[monitor] 2023-12-25 21:28:36: 守护进程(CUGDB01)状态切换 [STARTUP-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-12-25 21:28:36 OPEN OK CUGDB01 OPEN STANDBY VALID 5 42721
结论:故障恢复后,dmdb01加入了读写分离集群,成为了standby库。
[dmdba@dm8dw01 ~]$ disql omp/'omp123123!'@127.0.0.1:5236
SQL> select count(*) from year_2001;
行号 COUNT(*)
---------- --------------------
1 40
结论:原主库修复后,自动加入集群,数据自动同步过来。
[dmdba@dm8dw02 ~]$ disql omp/'omp123123!'@127.0.0.1:5236
SQL> begin
for i in 41..50 loop
insert into year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-22 08:31:49','YYYY-MM-DD HH24:MI:SS'));
end loop;
commit;
end;
/
SQL> select count(*) from year_2001;
行号 COUNT(*)
---------- --------------------
1 50
-
-
- 原主库现备库dm8dw01查询数据
-
SQL> select count(*) from year_2001;
行号 COUNT(*)
---------- --------------------
1 50
结论:原主库修复后自动加入集群成为STANDBY备库,原备库现主库dmdb02插入新数据后,现备库原主库dmdb01正常接收数据,数据完全一致。
Linux环境:dm_svc.conf放在应用服务器/etc目录下。
Windows32环境:dm_svc.conf放在应用服务器System32目录下。
Windows64环境:dm_svc.conf放在应用服务器System32和SysWOW64目录下。
创建dm_svc.conf
[root@~]# vi /etc/dm_svc.conf
TIME_ZONE=(+8:00)
LANGUAGE=(cn)
DW1=(84.0.191.5:5236,84.0.191.6:5236)
[DW1]
LOGIN_MODE=(1)
SWITCH_TIME=(300)
SWITCH_INTERVAL=(200)
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://DW1</URL>
#检查指定组的指定库是否满足自动恢复条件
check recover [group_name.]db_name
#检查指定组的指定库是否满足自动Open条件
check open [group_name.]db_name
#强制Open指定组的指定库
open database [group_name.] db_name
#切换指定组的指定库为Primary库
switchover [group_name[.]] [db_name]
#使用指定组的指定库接管故障Primary库
takeover [group_name[.]] [db_name]
#使用指定组的指定库强制接管故障Primary库
takeover force [group_name[.]] [db_name]