实时主备由一个主库以及一个或者多个配置了实时(Realtime)归档的备库组成,其主要目的是保障数据库可用性,提高数据安全性。实时主备系统中,主库提供完整的数据库功能,备库提供只读服务。主库修改数据产生的 Redo 日志,通过实时归档机制,在主库写入联机 Redo 日志文件之前发送到备库,实时备库通过重演 Redo 日志与主库保持数据同步。当主库出现故障时,备库在将所有 Redo 日志重演结束后,就可以切换为主库对外提供数据库服务。
1、环境准备与说明
本示例中数据守护进程组名为"GRP1" ,配置为实时主备,主库实例名为"NODE1" ,备库实例名为"NODE2"。
集群配置环境说明:
如果服务器上面有多个网卡,服务ip和心跳ip可以使用不同的网卡ip,这里只有一个网卡,就是使用相同的ip进行测试使用。
主备角色 | 服务ip | 心跳ip(MAL_HOST) | 实例名 | 实例端口 |
主库 | 192.168.58.30 | 192.168.58.30 | NODE1 | 5236 |
备库 | 192.168.58.31 | 192.168.58.31 | NODE2 | 5236 |
监视器 | 192.168.58.32 |
端口规划:
实例名 | PORT_NUM | MAL_INST_DW_ PORT | MAL_HOST | MAL_PORT | MAL_DW_ PORT |
NODE1 | 5236 | 5237 | 192.168.58.30 | 5238 | 5239 |
NODE2 | 5236 | 5237 | 192.168.58.31 | 5238 | 5239 |
端口说明:
-
PORT_NUM:数据库实例监听端口。
-
MAL_INST_DW_ PORT:实例对守护进程的监听端口,守护进程使用 MAL_HOST + MAL_INST_DW_PORT 创建到实例的 TCP连接。
-
MAL_PORT:MAL系统监听TCP连接的端口。
-
MAL_DW_ PORT:守护进程监听端口,其他守护进程或监视器使用 MAL_HOST + MAL_DW_ PORT创建 TCP 连接。监视器配置文件 dmmonitor.ini 中,MON_DW_ IP 就是一组 MAL_HOST: MAL_DW_PORT。
MAL系统是基于 TCP 协议实现的一种内部通信机制,DM通过 MAL系统实现 Redo日志传输, 以及其他一些实例间的消息通讯。
守护进程 (dmwatcher ) 是数据库实例和监视器之间信息流转的桥梁。数据库实例向本地守护进程发送信息, 接收本地守护进程的消息和命令;
监视器 (dmmonitor) 接收守护进程的消息,并向守护进程发送命令;数据库实例与监视器之间没有直接的消 息交互;
守护进程解析并执行监视器发起的各种命令 (Switchover/Takeover/Open force 等) ,并在必要时通知数据库实例执行相应的操作。
2、在主库、备库、监视器三台服务器上安装达梦数据库
1、安装前的准备工作
详情请参考官方文档:https://eco.dameng.com/document/dm/zh-cn/ops/before-installation.html
1、创建达梦数据库对应的用户和组
注意:安装前必须创建 dmdba 用户,禁止使用 root 用户安装数据库。
groupadd dinstall # 创建dinstall组
useradd -g dinstall dmdba # 创建dmdba用户
echo "DaMeng12345" |passwd --stdin dmdba # 为dmdba用户设置密码
2、创建达梦数据库安装目录
# dminstall是达梦数据库软件安装的位置,dmdata是达梦数据库实例存放位置,dmarch是达梦数据库归档日志存放位置,dmbak是达梦数据库备份文件存放位置
mkdir -p /dm8/{dminstall,dmdata,dmarch,dmbak}
chown -R dmdba:dinstall /dm8
chmod -R 755 /dm8
3、调整系统资源限制
查看dmdba用户的系统资源情况:
su - dmdba
ulimit -a
官方建议:
到root用户下配置资源限制,在/etc/security/limits.conf文件中追加下面的内容:
# soft软连接,hard硬连接,nofile打开文件,nproc打开的进程
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft nproc 65536
dmdba hard nproc 65536
配置完成之后,到dmdba用户下查看资源限制
su - dmdba
ulimit -a
2、去官网下载达梦8镜像并解压挂载到服务器上
选择好自己的cpu平台和操作系统版本,开放版这里没有银河麒麟v10,选择redhat7代替
root用户操作:
# 下载dm8
wget https://download.dameng.com/eco/adapter/DM8/202401END/dm8_20240408_x86_rh7_64.zip
# 解压dm8
unzip dm8_20240408_x86_rh7_64.zip
挂载iso镜像:
mount -o loop dm8_20240408_x86_rh7_64.iso /mnt
3、切换到dmdba用户下安装达梦数据库
注意:如果/tmp 目录不能保证 2GB 的存储空间,在安装达梦数据库的时候会报错,用户可以扩展/tmp 目录存储空间或者通过设置环境变量 DM_INSTALL_TMPDIR 指定安装程序的临时目录。具体操作如下所示:
1、切换到dmdba用户下:su - dmdba
2、在环境变量文件中追加配置:vim ~/.bash_profile
追加内容为:export DM_INSTALL_TMPDIR=/dm8/dmtmp
(/dm8/dmtmp这个目录确保有2g的空间,并且dmdba用户有权限操作该目录)
3、加载环境变量,让它生效:source ~/.bash_profile
# 切换成dmdba用户
su - dmdba
# 执行安装命令,这个是命令行安装命令,-i指定命令行
/mnt/DMInstall.bin -i
根据实际情况去配置:
根据上面执行结果的要求,新开一个窗口登录root用户执行上述root_installer.sh脚本注册数据库服务:
/dm8/dminstall/script/root/root_installer.sh
到这里,dm8软件就安装完成了
4、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3、在主、备库节点上初始化实例(使用dmdba用户操作)
按实际需要初始化实例:
本例只指定数据库存放路径、DB_NAME、INSTANCE_NAME,页大小为32k,其它参数使用默认值。
主库:192.168.58.30
su - dmdba
cd /dm8/dminstall/bin
./dminit PATH=/dm8/dmdata DB_NAME=APP INSTANCE_NAME=NODE1 PORT_NUM=5236 PAGE_SIZE=32
# 初始化成功后,前台启动实例
./dmserver /dm8/dmdata/APP/dm.ini
# 没有问题就exit退出数据库
exit
备库:192.168.58.31
su - dmdba
cd /dm8/dminstall/bin
./dminit PATH=/dm8/dmdata DB_NAME=APP INSTANCE_NAME=NODE2 PORT_NUM=5236 PAGE_SIZE=32
# 初始化成功后,前台启动实例
./dmserver /dm8/dmdata/APP/dm.ini
# 没有问题就exit退出数据库
exit
4、注册服务(使用root用户操作)
主库:192.168.58.30
# 切换到root用户,注册服务要使用root用户操作
su - root
/dm8/dminstall/script/root/dm_service_installer.sh -t dmserver -p NODE1 -dm_ini /dm8/dmdata/APP/dm.ini
#关闭DmServiceNODE1服务开机自启动,生产中用手动启动
systemctl disable DmServiceNODE1.service
备库:192.168.58.31
# 切换到root用户,注册服务要使用root用户操作
su - root
/dm8/dminstall/script/root/dm_service_installer.sh -t dmserver -p NODE2 -dm_ini /dm8/dmdata/APP/dm.ini
#关闭DmServiceNODE2服务开机自启动
systemctl disable DmServiceNODE2.service
5、脱机备份主库,还原备库(使用dmdba用户操作)
主库:192.168.58.30
su - dmdba
cd /dm8/dminstall/bin
# 备份数据库
./dmrman CTLSTMT="BACKUP DATABASE '/dm8/dmdata/APP/dm.ini' FULL BACKUPSET '/dm8/dmbak/DB_APP_FULL'"
# 主库上拷贝备份文件到备库
scp -r /dm8/dmbak/DB_APP_FULL dmdba@192.168.58.31:/dm8/dmbak/DB_APP_FULL
# 输入dmdba用户的密码
备库:192.168.58.31
su - dmdba
cd /dm8/dminstall/bin
# 还原数据库
./dmrman CTLSTMT="RESTORE DATABASE '/dm8/dmdata/APP/dm.ini' FROM BACKUPSET '/dm8/dmbak/DB_APP_FULL'"
./dmrman CTLSTMT="RECOVER DATABASE '/dm8/dmdata/APP/dm.ini' FROM BACKUPSET '/dm8/dmbak/DB_APP_FULL'"
./dmrman CTLSTMT="RECOVER DATABASE '/dm8/dmdata/APP/dm.ini' UPDATE DB_MAGIC"
6、修改dm.ini文件参数(使用dmdba用户操作)
主库:192.168.58.30
vim /dm8/dmdata/APP/dm.ini
#修改内容如下:
INSTANCE_NAME = NODE1 # 主库实例名
PORT_NUM = 5236 # 数据库实例监听端口
ALTER_MODE_STATUS = 0 # 0不允许手工方式修改实例模式/状态,1是允许
ENABLE_OFFLINE_TS = 2 # 不允许备库OFFLINE(脱机)表空间
MAL_INI = 1 # 打开MAL系统
ARCH_INI = 1 # 打开归档配置
备库:192.168.58.31
vim /dm8/dmdata/APP/dm.ini
#修改内容如下:
INSTANCE_NAME = NODE2 # 主库实例名
PORT_NUM = 5236 # 数据库实例监听端口
ALTER_MODE_STATUS = 0 # 0不允许手工方式修改实例模式/状态,1是允许
ENABLE_OFFLINE_TS = 2 # 不允许备库OFFLINE(脱机)表空间
MAL_INI = 1 # 打开MAL系统
ARCH_INI = 1 # 打开归档配置
7、配置dmmal.ini文件(使用dmdba用户操作)
集群中所有节点dmmal.ini文件内容必须一致。
主库和备库:192.168.58.30、192.168.58.31
vim /dm8/dmdata/APP/dmmal.ini
# 添加内容:
MAL_CHECK_INTERVAL = 5 # MAL系统链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL系统链路断开的时间
[MAL_INST1]
MAL_INST_NAME = NODE1 # 主库实例名
MAL_HOST = 192.168.58.30 # 主库MAL系统监听TCP连接的IP地址
MAL_PORT = 5238 # 主库中MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.58.30 # 主库实例的对外服务IP地址
MAL_INST_PORT = 5236 # 主库实例的对外服务端口, 和主库dm.ini配置中的PORT_NUM一致
MAL_INST_DW_PORT = 5237 # 主库实例监听守护进程TCP连接的端口
MAL_DW_PORT = 5239 # 主库中dmwatcher守护进程监听 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME=NODE2 # 备库实例名
MAL_HOST = 192.168.58.31 # 备库MAL系统监听TCP连接的IP地址
MAL_PORT = 5238 # 备库MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.58.31 # 备库实例的对外服务 IP 地址
MAL_INST_PORT = 5236 # 备库实例的对外服务端口, 和dm.ini 中的 PORT_NUM 一致
MAL_INST_DW_PORT = 5237 # 备库实例监听守护进程TCP连接的端口
MAL_DW_PORT = 5239 # 备库中dmwatcher守护进程监听 TCP 连接的端口
8、配置归档dmarch.ini文件(使用dmdba用户操作)
实时归档只有数据库是primary角色时才有效,指定的实例名对应mal配置文件中的实例名。
主备2个节点都配置,ARCH_DEST 分写写对方的实例。比如当前实例NODE1是主库,则ARCH_ DEST配置为NODE2。
主库:192.168.58.30
vim /dm8/dmdata/APP/dmarch.ini
# 添加如下:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME # 实时归档类型
ARCH_DEST = NODE2 # 实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL # 本地归档类型
ARCH_DEST = /dm8/dmarch # 本地归档文件存放路径
ARCH_FILE_SIZE = 128 # 单位 Mb ,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 # 单位 Mb ,0表示无限制,范围 1024~4294967294M
备库:192.168.58.31
vim /dm8/dmdata/APP/dmarch.ini
# 内容如下:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME # 实时归档类型
ARCH_DEST = NODE1 # 实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL # 本地归档类型
ARCH_DEST = /dm8/dmarch # 本地归档文件存放路径
ARCH_FILE_SIZE = 128 # 单位 Mb ,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 # 单位 Mb ,0表示无限制,范围 1024~4294967294M
9、配置dmwatcher.ini(使用dmdba用户操作)
主库:192.168.58.30
vim /dm8/dmdata/APP/dmwatcher.ini
# 内容如下:
[GRP1]
DW_TYPE = GLOBAL # 全局守护类型
DW_MODE = MANUAL # MANUAL为手动切换模式,AUTO为自动切换模式
DW_ERROR_TIME = 10 # 远程守护进程故障认定时间
INST_RECOVER_TIME = 60 # 主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 # 本地实例故障认定时间
INST_OGUID = 240605 # 守护进程唯一OGUID值
INST_INI = /dm8/dmdata/APP/dm.ini # dm.ini配置文件路径
INST_AUTO_RESTART = 0 # 0关闭实例的自动启动功能,1是打开
INST_STARTUP_CMD = /dm8/dminstall/bin/dmserver # 命令行方式启动
RLOG_SEND_THRESHOLD = 0 # 指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 # 指定备库重演日志的时间阀值,默认关闭
备库:192.168.58.31
vim /dm8/dmdata/APP/dmwatcher.ini
# 内容如下:
[GRP1]
DW_TYPE = GLOBAL # 全局守护类型
DW_MODE = MANUAL # MANUAL为手动切换模式,AUTO为自动切换模式
DW_ERROR_TIME = 10 # 远程守护进程故障认定时间
INST_RECOVER_TIME = 60 # 主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 # 本地实例故障认定时间
INST_OGUID = 240605 # 守护进程唯一OGUID值
INST_INI = /dm8/dmdata/APP/dm.ini # dm.ini配置文件路径
INST_AUTO_RESTART = 0 # 0关闭实例的自动启动功能,1是打开
INST_STARTUP_CMD = /dm8/dminstall/bin/dmserver # 命令行方式启动
RLOG_SEND_THRESHOLD = 0 # 指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 # 指定备库重演日志的时间阀值,默认关闭
10、配置监视器(192.168.58.32机器使用dmdba用户操作)
本例为自动切换需要配置确认监视器dmmonitor.ini文件(确认监视器只能配一个,一般选择主备库以外的其他机器,安装了达梦服务端的即可),其中 MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT配置项保持一致。
vim /dm8/dmdata/dmmonitor.ini
# 添加内容如下:
MON_DW_CONFIRM = 1 # 1是确认监视器模式,0是非确认监视器
MON_LOG_PATH = /dm8/dmdata/log # 监视器日志文件存放路径
MON_LOG_INTERVAL = 60 # 每隔 60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 # 每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 # 不限定日志文件总占用空间
# 守护进程组,跟dmwatcher.ini文件里面的组对应
[GRP1]
MON_INST_OGUID = 240605 # 组 GRP1的唯一OGUID值
MON_DW_IP = 192.168.58.30:5239
MON_DW_IP = 192.168.58.31:5239
11、以 mount 模式启动主备库(使用dmdba用户操作)
注意:
一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间, 生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主 备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。
主库:192.168.58.30
cd /dm8/dminstall/bin
./dmserver /dm8/dmdata/APP/dm.ini mount
备库:192.168.58.31
cd /dm8/dminstall/bin
./dmserver /dm8/dmdata/APP/dm.ini mount
12、设置 OGUID并修改主备库模式(使用dmdba用户操作)
主库:192.168.58.30
# 新开一个窗口操作
su - dmdba
# 启动命令行工具 DIsql,登录主库设置 OGUID 值为 240605,并修改为主库模式
cd /dm8/dminstall/bin
./disql SYSDBA/SYSDBA@192.168.58.30:5236
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(240605);
alter database primary;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
exit
备库:192.168.58.31
# 新开一个窗口操作
su - dmdba
# 启动命令行工具 DIsql,登录备库设置 OGUID 值为 240605,并修改为备库模式
cd /dm8/dminstall/bin
./disql SYSDBA/SYSDBA@192.168.58.31:5236
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(240605);
alter database standby;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
exit
13、启动数据库守护和监视器(使用dmdba用户操作)
主库:192.168.58.30
启动数据守护进程:
su - dmdba
cd /dm8/dminstall/bin
./dmwatcher /dm8/dmdata/APP/dmwatcher.ini
查看数据库状态:先执行完备库守护进程启动再操作下面的命令查看
# 另开一个窗口操作
su - dmdba
cd /dm8/dminstall/bin
./disql SYSDBA/SYSDBA@192.168.58.30:5236
select STATUS$ from v$instance;
# 显示内容如下:
行号 STATUS$
---------- -------
1 OPEN
备库:192.168.58.31
启动数据守护进程:
su - dmdba
cd /dm8/dminstall/bin
./dmwatcher /dm8/dmdata/APP/dmwatcher.ini
查看数据库状态:
# 另开一个窗口操作
su - dmdba
cd /dm8/dminstall/bin
./disql SYSDBA/SYSDBA@192.168.58.31:5236
select STATUS$ from v$instance;
# 显示内容如下:
行号 STATUS$
---------- -------
1 OPEN
监视器:192.168.58.32
启动监视器:查看主备集群运行情况:
su - dmdba
cd /dm8/dminstall/bin
./dmmonitor /dm8/dmdata/dmmonitor.ini
# 通过show命令查看主备集群信息
show
14、主备同步测试(使用dmdba用户操作)
主库:192.168.58.30
cd /dm8/dminstall/bin
./disql SYSDBA/SYSDBA@192.168.58.30:5236
# 新建一个表,并插入数据
create table test(id int,username varchar(20),age int);
insert into test(id,username,age) values (1,'张三',18),(2,'李四',19);
commit;
exit
备库:192.168.58.31
cd /dm8/dminstall/bin
./disql SYSDBA/SYSDBA@192.168.58.31:5236
# 查看test表是否有数据
select * from test;
exit
如果上面的操作都没有什么问题,主备集群状态都正常,按照顺序关闭监视器、备库数据守护进程、主库数据守护进程、主库实例、备库实例。
15、注册集群服务(使用root用户操作)
主库:192.168.58.30
注册数据守护进程服务:
需要root用户登录注册服务:
/dm8/dminstall/script/root/dm_service_installer.sh -t dmwatcher -p NODE1 -watcher_ini /dm8/dmdata/APP/dmwatcher.ini
# 禁用数据守护进程开机自启
systemctl disable DmWatcherServiceNODE1.service
备库:192.168.58.31
注册数据守护进程服务:
将守护进程注册为服务(数据库会由数据守护自动拉起),需要root用户登录注册服务:
/dm8/dminstall/script/root/dm_service_installer.sh -t dmwatcher -p NODE2 -watcher_ini /dm8/dmdata/APP/dmwatcher.ini
# 禁用数据守护进程开机自启
systemctl disable DmWatcherServiceNODE2.service
监视器:192.168.58.32
将确认监视器注册为服务:
root用户登录注册服务。
/dm8/dminstall/script/root/dm_service_installer.sh -t dmmonitor -p APP -monitor_ini /dm8/dmdata/dmmonitor.ini
# -p 原本是指定实例名,但是这个监视器是部署到第三台机器上,没有数据库实例,所以就使用主备库中APP数据库名
# 关闭自启动服务:
systemctl disable DmMonitorServiceAPP.service
创建非确认监视器用于管理:
su - dmdba
cp /dm8/dmdata/dmmonitor.ini /dm8/dmdata/dmmonitor_0.ini
vim /dm8/dmdata/dmmonitor_0.ini
# 修改dmmonitor_0.ini文件,内容如下:
MON_DW_CONFIRM = 0 # 0非确认监视器模式
16、修改后台启动文件,配置以mount启动(使用dmdba用户操作)
主库:192.168.58.30
su - dmdba
cd /dm8/dminstall/bin
vim DmServiceNODE1
# 修改内容
START_MODE=open改为START_MODE=mount
备库:192.168.58.31
su - dmdba
cd /dm8/dminstall/bin
vim DmServiceNODE2
# 修改内容
START_MODE=open改为START_MODE=mount
17、启动实时主备守护集群(使用dmdba用户操作)
1、启动主库实例(192.168.58.30)
cd /dm8/dminstall/bin
./DmServiceNODE1 start
2、启动备库实例(192.168.58.31)
cd /dm8/dminstall/bin
./DmServiceNODE2 start
3、启动主库守护进程(192.168.58.30)
cd /dm8/dminstall/bin
./DmWatcherServiceNODE1 start
4、启动备库守护进程(192.168.58.31)
cd /dm8/dminstall/bin
./DmWatcherServiceNODE2 start
5、启动监视器(192.168.58.32)
启动确认监视器:
cd /dm8/dminstall/bin
./DmMonitorServiceAPP start
启动非确认监视器查看主备运行情况:
/dm8/dminstall/bin/dmmonitor /dm8/dmdata/dmmonitor_0.ini
18、配置dm_svc.conf(使用dmdba用户操作)
dm_svc.conf配置文件,Windows平台下位于%SystemRoot%\system32目录中,Linux平台下位于/etc目录。
参数说明:
-
LOGIN_MODE:指定优先登录的服务器模式。0:优先连接 Primary 模式的库,Normal 模式次之, 最后选择 Stantby 模式;1:只连接主库;2:只连接备库;3:优先连接 Standby 模式的库,Primary 模式次之,最后选择Normal模式;4:优先连接Normal模式的库,Primary 模式次之,最后选择 Standby 模式。默认值为 4。
-
SWITCH_TIME:检测到数据库实例故障时,接口在服务器之间切换的次数;超过设置次数没有连接到有效数据库时,断开连接并报错。有效值范围 1~9223372036854775807,默认值为 3。
-
SWITCH_INTERVAL:表示在服务器之间切换的时间间隔 ,单位为毫秒,默认值为 200,有效值范围是1~9223372036854775807。
主库:192.168.58.30
vim /etc/dm_svc.conf
# 添加内容如下:
TIME_ZONE=(+8:00)
LANGUAGE=(cn)
DM_APP=(192.168.58.30:5236,192.168.58.31:5236)
[DM_APP]
LOGIN_MODE=(1)
SWITCH_TIME=2000
SWITCH_INTERVAL=10
测试:
/dm8/dminstall/bin/disql SYSDBA/SYSDBA@DM_APP
备库:192.168.58.31
vim /etc/dm_svc.conf
# 添加内容如下:
TIME_ZONE=(+8:00)
LANGUAGE=(cn)
DM_APP=(192.168.58.30:5236,192.168.58.31:5236)
[DM_APP]
LOGIN_MODE=(1)
SWITCH_TIME=2000
SWITCH_INTERVAL=10
测试:
/dm8/dminstall/bin/disql SYSDBA/SYSDBA@DM_APP
19、数据守护环境启动与关闭测试(使用dmdba用户操作)
因为Global守护类型的守护进程,会自动将数据库实例切换到 Open状态,并将守护进程状态也切换为 Open。 因此在关闭dmwatcher系统时,必须按照一定的顺序来关闭守护进程和实例。
可以在监视器中执行Stop Instance 命令关闭数据守护系统,命令执行成功后,数据库实例正常关闭。但守护进程并没有真正退出,而是将状态切换为 Shutdown 状态。
如果使用手动方式关闭数据守护进程系统,请严格按照以下顺序:
-
如果启动了确认监视器,先关闭确认监视器 (防止自动接管)
-
关闭备库守护进程 (防止重启实例)
-
关闭主库守护进程 (防止重启实例)
-
关闭主库实例
-
关闭备库实例
1、手动关闭dmwatcher环境
1、关闭监视器进程(192.168.58.32)
cd /dm8/dminstall/bin
./DmMonitorServiceAPP stop
2、关闭备库数据守护进程(192.168.58.31)
cd /dm8/dminstall/bin
./DmWatcherServiceNODE1 stop
3、关闭主库数据守护进程(192.168.58.30)
cd /dm8/dminstall/bin
./DmWatcherServiceNODE2 stop
4、关闭主库实例(192.168.58.30)
cd /dm8/dminstall/bin
./DmServiceNODE1 stop
5、关闭备库实例(192.168.58.31)
cd /dm8/dminstall/bin
./DmServiceNODE2 stop
2、手动启动dmwatcher环境
1、启动主库实例(192.168.58.30)
cd /dm8/dminstall/bin
./DmServiceNODE1 start
2、启动备库实例(192.168.58.31)
cd /dm8/dminstall/bin
./DmServiceNODE2 start
3、启动主库守护进程(192.168.58.30)
cd /dm8/dminstall/bin
./DmWatcherServiceNODE1 start
4、启动备库守护进程(192.168.58.31)
cd /dm8/dminstall/bin
./DmWatcherServiceNODE2 start
5、启动监视器(192.168.58.32)
启动确认监视器:
cd /dm8/dminstall/bin
./DmMonitorServiceAPP start
启动非确认监视器查看主备运行情况:
/dm8/dminstall/bin/dmmonitor /dm8/dmdata/dmmonitor_0.ini
20、在监视器上手动切换主备数据库(192.168.58.32)
1、主备库切换
# 1、查看数据守护集群中的状态信息
show
# 2、查看grp1组中允许执行Switchover命令的备库,也就是查看数据守护集群组中可以进行切换的数据库实例
choose switchover grp1
# 3、选择NODE2备库切换为新的主库,将当前的主库切换为新的备库,此命令要求执行切换的主备库都是正常 Open 状态,另外执行此命令需要先登录监视器。
switchover grp1.NODE2
# 可以看到NODE2已经切换为了主库,NODE1切换为了备库。
2、主库故障时,指定备库接管故障的主库
# 组中主库出现故障时,可以通过此命令选出组中可以执行正常接管的备库列表
choose takeover grp1
将主库网络直接中断,模拟主库故障,主库中执行命令
[root@NODE2 ~]# systemctl stop network
choose takeover grp1
# 用指定组中的指定备库接管组中的故障主库
takeover grp1.NODE1
# 该命令要求监视器曾经收到过故障主库的历史信息,并且主库的历史信息必须满足被接管条件,可以先通过 choose takeover [group_name]选出符合正常接管条件的备库列表,选择其中一个备库执行接管操作即可。
出现主库故障时,需要优先使用choose takeover [group_name] 选出可接管主库,并使用 takeover [group_name[.]] [db_name]来执行正常接管。
如果不存在可以正常接管的备库,但又需要主库对外提供服务,可再考虑使用choose takeover force [group_name]选出可强制接管的备库,并使用takeover force [group_name[.]] [db_name]进行强制接管。但是强制接管可能会导致出现分裂情况。
如果执行choose takeover grp1出现下面的提示
no database can do takeover! --守护进程是STARTUP状态不能执行takeover命令
可以使用备库强制接管
如果执行 Takeover 命令不成功,但主库可能由于硬件损坏等原因无法马上恢复,为DM 数据守护与读写分离集群 V4.0了及时恢复数据库服务,DM 提供了 Takeover Force 命令,强制将备库切换为主库。但需要由用户确认主库故障前,主库与接管备库的数据是一致的(主库到备库的归档是 Valid状态),避免引发守护进程组分裂。
RSTAT : 此 字 段 对 备 库 有效,表 示 主 库 到 备 库 的 归 档 状 态 , 可 能 为Valid/Invalid/Unknown,对于本地守护类型的备库,此字段为 NULL,对于主库本身,此字段值为 Valid。该字段值要从备库对应的主库实例上取,如果当前没有活动主库或者
DM 数据守护与读写分离集群 V4.0备库无法确认对应的主库,则该字段显示为 Unknown。
# 指定组中主库出现故障时,可以通过此命令选出组中可以执行强制接管的备库列表
choose takeover force grp1
# 使用指定组中的指定备库强制接管组中的故障主库。执行此命令需要先登录监视器。
takeover force grp1.NODE1
大家想学习达梦数据库或者解决报错问题,可以去达梦数据库社区地址(https://eco.dameng.com)
制作不易,各位看官如果觉得还可以,对您有帮助,请给小弟一键三连鼓励一下,后续还会继续保持