主备集群 达梦实时主备集群搭建与主备切换实践(二)

字数: 10575

因为之前实施部署达梦数据库,通常是只部署开发环境、测试环境,生成环境的数据库并没有实践在项目中实践过,受限于工作项目,开发、测试环境通常只有一台数据库服务器,部署的单机版。

对于集群版本一直没有机会实践,最近使用虚拟机搭建了达梦实时主备集群,并进行实时主备数据同步、切换主备库的验证。特此做总结,包括:集群搭建、监视器、服务名、实时同步数据验证、手动主备切换与验证。

安装前准备说明

1.需要 linux 里有 tar 命令包,执行下边命令验证

1
tar --version

2.需要先将服务器同步时间,一般同步 ntp 服务器,也可以手动修改

1
2
date -s "yyyy-mm-dd HH:MM:SS"
date -s

3.关闭防火墙并禁止自启

1
2
systemctl stop firewalld
systemctl disable firewalld

4.确保主备服务器网络互通,避免同步数据失效,需要互相传 Redo 日志的

5.达梦数据库官方是建议关闭 SWAP 分区的,内存充足也可不关

6.调整 limit.sconf 参数

集群规划

需要注意的是,确认端口不会与其他服务进程冲突

部署信息

A机器 B机器
IP 192.168.163.9 192.168.163.10
实例名 GRP_TEST_01 GRP_TEST_02
实例端口 5236 5236
守护进程端口 5536 5536
MAL端口 5336 5336
守护组 GRP1 GPR1
安装目录 /home/dmdba/dmdbms /home/dmdba/dmdbms
实例目录 /home/dmdba/data /home/dmdba/data
归档上限 10240(生产一般不设上限,由DBA规划) 10240

切换模式

需要考虑 ALTER_MODE_STATUS 参数是多少:0-不可修改,1-可修改

集群搭建

安装数据库

步骤可参照 实施部署-达梦数据库linux版的安装(二) | WeiQi Blog (weiqifun.github.io)

按照下边也可以,总之步骤需要到初始化实例

搭建集群时,每台都需要初始化实例(即 192.168.163.9 和 192.168.163.10 都需要)

注意:在使用 ./dminit 初始化实例时,请注意修改实例名:

192.168.163.9 > GRP_TEST_01

192.168.163.10 > GRP_TEST_02

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
[root@linux1 soft]# groupadd dinstall
[root@linux1 soft]# useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
[root@linux1 soft]# passwd dmdba
更改用户 dmdba 的密码 。
新的 密码:!@#$qwer
重新输入新的 密码:!@#$qwer
passwd:所有的身份验证令牌已经成功更新。
[root@linux1 soft]# vi /etc/security/limits.conf
# 在conf文件内容的最后添加
dmdba hard nofile 65536
dmdba soft nofile 65536
dmdba hard stack 32768
dmdba soft stack 16384
# :wq 保存
[root@linux1 soft]# su - dmdba
[dmdba@linux1 ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14989
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 16384
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@linux1 soft]# chmod 755 dm8_20240408_x86_rh7_64.iso
[root@linux1 soft]# mount -o loop dm8_20240408_x86_rh7_64.iso /mnt/
mount: /dev/loop0 写保护,将以只读方式挂载
[root@linux1 soft]# su - dmdba
上一次登录:六 7月 20 23:55:52 CST 2024pts/0 上
[dmdba@linux1 ~]$ cd /mnt/
[dmdba@linux1 mnt]$ ll
总用量 1057031
-r-xr-xr-x. 1 root root    2587699 3月  20 14:04 DM8 Install.pdf
-r-xr-xr-x. 1 root root 1079810877 4月   8 13:35 DMInstall.bin
[dmdba@linux1 mnt]$ ./DMInstall.bin -i
安装语言:
[1]: 简体中文
[2]: English
请选择安装语言 [1]: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
所需空间: 2310M

请选择安装目录 [/home/dmdba/dmdbms]:
可用空间: 29G
是否确认安装路径(/home/dmdba/dmdbms)? (Y/y:是 N/n:否)  [Y/y]:

安装前小结
安装位置: /home/dmdba/dmdbms
所需空间: 2310M
可用空间: 29G
版本信息:
有效日期:
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y
2024-07-21 00:02:02
[INFO] 安装达梦数据库...
2024-07-21 00:02:02
[INFO] 安装 基础 模块...
2024-07-21 00:02:13
[INFO] 安装 服务器 模块...
2024-07-21 00:02:17
[INFO] 安装 客户端 模块...
2024-07-21 00:02:23
[INFO] 安装 驱动 模块...
2024-07-21 00:02:27
[INFO] 安装 手册 模块...
2024-07-21 00:02:28
[INFO] 安装 服务 模块...
2024-07-21 00:02:28
[INFO] 移动日志文件。
2024-07-21 00:02:29
[INFO] 安装达梦数据库完成。

请以root系统用户执行命令:
/home/dmdba/dmdbms/script/root/root_installer.sh

安装结束
[dmdba@linux1 mnt]$ su - root
密码:
上一次登录:六 7月 20 23:57:11 CST 2024pts/0 上
[root@linux1 ~]# /home/dmdba/dmdbms/script/root/root_installer.sh
移动 /home/dmdba/dmdbms/bin/dm_svc.conf 到/etc目录
创建DmAPService服务
Created symlink from /etc/systemd/system/multi-user.target.wants/DmAPService.service to /usr/lib/systemd/system/DmAPService.service.
创建服务(DmAPService)完成
启动DmAPService服务
[root@linux1 ~]# su - dmdba
上一次登录:日 7月 21 00:00:02 CST 2024pts/0 上
[dmdba@linux1 ~]$ cd /home/dmdba/dmdbms/bin


##########################################################

# ./dminit 这个步骤要注意,实例名要有区分
#
# ./dminit 参数详见 https://eco.dameng.com/document/dm/zh-cn/pm/dminit-parameters.html
# 如果需要将数据文件放到其他地方,则 path 参数应为具体的路径
# 例如:path=/home/dmdba/data (提前建好)
# 如果数据库名自定义,则 DM_NAME 参数应为自定义名称
# 例如:DB_NAME=TEST_DB
# 这样创建好的数据文件路径,则为:/home/dmdba/data/TEST_DB
##########################################################

[dmdba@linux1 bin]# ./dminit path=/home/dmdba/dmdbms PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y CHARSET=0 DB_NAME=DMDB INSTANCE_NAME=GRP_TEST_01 PORT_NUM=5236

initdb V8

db version: 0x7000c

file dm.key not found, use default license!
License will expire on 2025-03-21
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL


 log file path: /home/dmdba/dmdbms/DMDB/DMDB01.log

 log file path: /home/dmdba/dmdbms/DMDB/DMDB02.log


write to dir [/home/dmdba/dmdbms/DMDB].

create dm database success. 2024-07-21 00:06:03

到这里,初始化实例完成!

配置 A 机器

把 192.168.163.9 作为主库,即所谓的 A 机器

以下步骤非必要说明,均使用数据库用户 dmdba 操作

先把 A 机器的数据库服务启动

1)启动实例服务

1
2
3
# 前台启动服务
[dmdba@linux1 ~]$ cd /home/dmdba/dmdbms/bin
[dmdba@linux1 bin]$ ./dmserver /home/dmdba/dmdbms/DMDB/dm.ini

因为还没有在 ../script/root 执行创建服务的命令,所以现在是没有后台启动服务的命令的

2)开启归档

SPACE_LIMIT 是归档空间的最大限制,空间不足时,会将之前旧的归档文件删掉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
[dmdba@linux1 bin]$ ./disql SYSDBA/SYSDBA

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 17.680(ms)
disql V8

SQL> ALTER DATABASE MOUNT;
操作已执行
已用时间: 3.546(毫秒). 执行号:0.

SQL> ALTER DATABASE ARCHIVELOG;
操作已执行
已用时间: 17.101(毫秒). 执行号:0.

SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/home/dmdba/dmdbms/DMDB/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=10240';

操作已执行
已用时间: 4.701(毫秒). 执行号:0.
SQL> ALTER DATABASE OPEN;
操作已执行
已用时间: 16.531(毫秒). 执行号:0.

3)备份数据

1
2
3
SQL> BACKUP DATABASE BACKUPSET '/home/dmdba/dmdbms/DMDB/bak/BACKUP_FILE';
操作已执行
已用时间: 00:00:08.767. 执行号:501.

4)修改 dm.ini

1
2
3
4
5
6
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236); #数据库实例监听端口
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60); #接收守护进程消息超时时间
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);  #不允许手工方式修改实例模式/状态/OGUID
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);  #不允许备库 OFFLINE 表空间
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);     #打开 MAL 系统
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);    #统计最近 64 次的日志重演信息

5)退出并关闭数据库服务

1
2
3
SQL> exit;

# 到开启服务的linux窗口,终止前台服务

6)修改 dmarch.ini

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[dmdba@linux1~]$ vi /home/dmdba/dmdbms/DMDB/dmarch.ini

ARCH_WAIT_APPLY            = 0   #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE                = LOCAL  #本地归档类型
ARCH_DEST                = /home/dmdba/dmdbms/DMDB/arch/  #本地归档存放路径
ARCH_FILE_SIZE           = 1024  #单个归档大小,单位 MB
ARCH_SPACE_LIMIT         = 10240  #归档上限,单位 MB
ARCH_FLUSH_BUF_SIZE      = 0
ARCH_HANG_FLAG           = 1


[ARCHIVE_REALTIME1]
ARCH_TYPE                = REALTIME  #实时归档类型
ARCH_DEST                = GRP_TEST_02  #实时归档目标实例名(备库实例名)

7)创建 dmmal.ini

dm.ini 相同目录下,创建 dmmal.ini

是两个机器传 Redo 日志、响应消息的配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
vi /home/dmdba/dmdbms/DMDB/dmmal.ini

MAL_CHECK_INTERVAL         = 10  #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL     = 10  #判定 MAL 链路断开的时间
MAL_TEMP_PATH              = /home/dmdba/dmdbms/DMDB/malpath/  #临时文件目录
MAL_BUF_SIZE               = 512  #单个 MAL 缓存大小,单位 MB
MAL_SYS_BUF_SIZE           = 2048  #MAL 总大小限制,单位 MB
MAL_COMPRESS_LEVEL         = 0  #MAL 消息压缩等级,0 表示不压缩

[MAL_INST1]
MAL_INST_NAME            = GRP_TEST_01  #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST                 = 192.168.163.9  #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT                 = 5336  #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST            = 192.168.163.9  #实例的对外服务 IP 地址
MAL_INST_PORT            = 5236  #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口

[MAL_INST2]
MAL_INST_NAME            = GRP_TEST_02
MAL_HOST                 = 192.168.163.10
MAL_PORT                 = 5336
MAL_INST_HOST            = 192.168.163.10
MAL_INST_PORT            = 5236
MAL_DW_PORT              = 5436
MAL_INST_DW_PORT         = 5536

8)创建 dmwatcher.ini

dm.ini 相同目录下,创建 dmwatcher.ini

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[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                 = /home/dmdba/dmdbms/DMDB/dm.ini  #dm.ini 文件路径
INST_AUTO_RESTART        = 1  #打开实例的自动启动功能
INST_STARTUP_CMD         = /home/dmdba/dmdbms/bin/dmserver  #命令行方式启动
RLOG_SEND_THRESHOLD      = 0  #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD     = 0  #指定备库重演日志的时间阈值,默认关闭

9)拷贝备份文件到备库

1
2
3
4
5
6
7
8
9
[dmdba@linux1 DMDB]$ scp -r /home/dmdba/dmdbms/DMDB/bak/BACKUP_FILE dmdba@192.168.163.10:/home/dmdba/dmdbms/DMDB/bak/
The authenticity of host '192.168.163.10 (192.168.163.10)' can't be established.
ECDSA key fingerprint is SHA256:xU91rJPNr+WlgJJ3xkHHHdDAo/vxPcgYj7U+VH4zLYg.
ECDSA key fingerprint is MD5:1c:b2:a6:11:d1:b8:20:e7:c4:6d:a1:0b:df:2a:d0:1c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.163.10' (ECDSA) to the list of known hosts.
dmdba@192.168.163.10's password:
BACKUP_FILE.bak                                                                                                                  100%   27MB  20.5MB/s   00:01
BACKUP_FILE.meta

10)注册服务

使用 root 用户操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
[root@linux1 ~]# cd /home/dmdba/dmdbms/script/root/
[root@linux1 root]# ll
总用量 44
-rwxr-xr-x. 1 dmdba dinstall 25373 7月  21 00:02 dm_service_installer.sh
-rwxr-xr-x. 1 dmdba dinstall  9214 7月  21 00:02 dm_service_uninstaller.sh
-rwxr-xr-x. 1 dmdba dinstall   490 7月  21 00:02 root_installer.sh

####################
# 创建数据库服务
# -p 实例名
####################
[root@linux1 root]# ./dm_service_installer.sh -t dmserver -p GRP_TEST_01 -dm_ini /home/dmdba/dmdbms/DMDB/dm.ini -m mount
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceGRP_TEST_01.service to /usr/lib/systemd/system/DmServiceGRP_TEST_01.service.
创建服务(DmServiceGRP_TEST_01)完成

####################
# 创建数据守护服务
####################
[root@linux1 root]# ./dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /home/dmdba/dmdbms/DMDB/dmwatcher.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceWatcher.service to /usr/lib/systemd/system/DmWatcherServiceWatcher.service.
创建服务(DmWatcherServiceWatcher)完成
如果需要删除服务
1
2
[root@~]# ./dm_service_uninstaller.sh -n DmServiceGRP_TEST_01
[root@~]# ./dm_service_uninstaller.sh -n DmWatcherServiceWatcher

配置 B 机器

192.168.163.10 为备库

因为安装数据库的时候,已经初始化实例了

现在需要做的就是在备库同步主库的数据,让主备保持一致的状态

1)备库恢复数据

执行下边两条,注意 dm.ini 的位置和备份文件的位置,备份文件是从 A 机器拷贝过来的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
###################
# 这步是 RESTORE DATEBASE
###################
[dmdba@linux2 bin]$ ./dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dmdbms/DMDB/dm.ini' FROM BACKUPSET '/home/dmdba/dmdbms/DMDB/bak/BACKUP_FILE'"
dmrman V8
RESTORE DATABASE '/home/dmdba/dmdbms/DMDB/dm.ini' FROM BACKUPSET '/home/dmdba/dmdbms/DMDB/bak/BACKUP_FILE'
file dm.key not found, use default license!
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:03][Remaining:00:00:00]
restore successfully.
time used: 00:00:03.874

###################
# 这步是 RECOVER DATEBASE
###################
[dmdba@linux2 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/DMDB/dm.ini' FROM BACKUPSET '/home/dmdba/dmdbms/DMDB/bak/BACKUP_FILE'"

###################
# 这步是 RECOVER DATEBASE UPDATE DM_MAGIC
###################
[dmdba@linux2 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/DMDB/dm.ini' UPDATE DB_MAGIC"
dmrman V8
RECOVER DATABASE '/home/dmdba/dmdbms/DMDB/dm.ini' UPDATE DB_MAGIC
file dm.key not found, use default license!
Database mode = 2, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[42972], file_lsn[42972]
recover successfully!
time used: 00:00:01.421

2)创建 dmarch.ini

A 机器开启了归档,B 机器是还没有开启归档的,所以没有归档配置文件 dmarch.ini 的,在 B 机器创建它

注意 ARCH_DEST 参数,主库的 dmarch.ini 文件填备库的实例名,备库的 dmarch.ini 文件填主库的实例名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ARCH_WAIT_APPLY            = 0   #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE                = LOCAL  #本地归档类型
ARCH_DEST                = /home/dmdba/dmdbms/DMDB/arch/  #本地归档存放路径
ARCH_FILE_SIZE           = 1024  #单个归档大小,单位 MB
ARCH_SPACE_LIMIT         = 10240  #归档上限,单位 MB
ARCH_FLUSH_BUF_SIZE      = 0
ARCH_HANG_FLAG           = 1


[ARCHIVE_REALTIME1]
ARCH_TYPE                = REALTIME  #实时归档类型
ARCH_DEST                = GRP_TEST_01  #实时归档目标实例名,这里则填主库的实例

3)修改 dm.ini

在 B 机器上修改 dm.ini ,它比 A 机器上多了一个参数修改 ARCH_INI = 1 打开归档配置

因为 A 机器是通过 SQL 的方式打开归档的,B 机器这里并没有启动服务,所以通过修改参数文件的方式开启

并且确保文件里的实例名为:GRP_TEST_02

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[dmdba@linux2 DMDB]$ vi /home/dmdba/dmdbms/DMDB/dm.ini

INSTANCE_NAME  = GRP_TEST_02
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 次的日志重演信息

4)创建 dmmal.ini

配置它与 A 机器的参数相同(即保持与主库一致),用 A 机器的 dmmal.ini 配置即可

5)创建 dmwatcher.ini

配置它与 A 机器的参数相同(即保持与主库一致),用 A 机器的 dmwatcher.ini 配置即可

6)注册服务

使用 root 用户执行,跟 A 机器的注册服务类似,创建一个 GRP_TEST_02 实例服务,创建一个数据守护服务

1
2
3
4
5
6
7
[root@linux2 root]# ./dm_service_installer.sh -t dmserver -p GRP_TEST_02 -dm_ini /home/dmdba/dmdbms/DMDB/dm.ini -m mount
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceGRP_TEST_02.service to /usr/lib/systemd/system/DmServiceGRP_TEST_02.service.
创建服务(DmServiceGRP_TEST_02)完成

[root@linux2 root]# ./dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /home/dmdba/dmdbms/DMDB/dmwatcher.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceWatcher.service to /usr/lib/systemd/system/DmWatcherServiceWatcher.service.
创建服务(DmWatcherServiceWatcher)完成
【注意】

一般生产上通常的配置,是两台,一主一备,并没有给配置监视器的机器,所以。到这里,其实我们的实时主备就搭建完成了,剩下的就是做启动集群服务,和验证是否真的实时同步数据。

监视器

需要监视器的说明

如果需要监视器,则应该再使用一台服务器,单独部署监视器,用来监控集群服务,以及实现自动切换主备。现有接触到的项目,监视器直接部署到了主库服务器上了。

需要监视器,则按照此步骤继续部署监视器,否则请跳过该步骤,往下接【3.5 启动服务】步骤

为了更贴近实际项目,所以我在 A 机器(192.168.163.9)上安装(反正随便装在一台上)监视器

1)创建 dmmonitor.ini

这个是确认监视器,就是MON_DW_CONFIRE=1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[dmdba@linux1 DMDB]# vi dmmonitor.ini

MON_DW_CONFIRM             = 1  #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH               = ../log_monitor  #监视器日志文件存放路径
MON_LOG_INTERVAL           = 60  #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE          = 32  #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT        = 1024  #日志上限,单位 MB

[GRP1]
MON_INST_OGUID           = 45331  #组 GRP1 的唯一 OGUID 值
MON_DW_IP                = 192.168.163.9:5436  #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
MON_DW_IP                = 192.168.163.10:5436

2)创建 dmmonitor_manual.ini

再配置一个非监视器,就是 MON_DW_CONFIRE=0

它可以在手动切换的时候,直接通过这个非监视器命令去手动切换,就不需要这么麻烦的切换主备数据库模式了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[dmdba@linux1 DMDB]# vi dmmonitor_manaul.ini

MON_DW_CONFIRM             = 0  #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH               = ../log_monitor  #监视器日志文件存放路径
MON_LOG_INTERVAL           = 60  #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE          = 32  #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT        = 1024  #日志上限,单位 MB

[GRP1]
MON_INST_OGUID           = 45331  #组 GRP1 的唯一 OGUID 值
MON_DW_IP                = 192.168.163.9:5436  #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
MON_DW_IP                = 192.168.163.10:5436

3)注册监视器服务

【注意】确认监视器需要注册服务,非确认监视器不需要注册服务

1
2
3
[root@linux1 root]# ./dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /home/dmdba/dmdbms/DMDB/dmmonitor.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmMonitorServiceMonitor.service to /usr/lib/systemd/system/DmMonitorServiceMonitor.service.
创建服务(DmMonitorServiceMonitor)完成
附:删除监视器服务
1
[root@linux1 root]# ./dm_service_uninstaller.sh -n DmMonitorServiceMonitor

4)监视器启动

1
2
[dmdba@linux1 bin]# ./DmMonitorServiceMonitor start
Starting DmMonitorServiceMonitor: 上一次登录:日 7月 21 11:07:16 CST 2024pts/1 上	[OK]

监视器的启动,需要在达梦数据库服务启动才能启

5)非确认监视器的使用

确认监视器为自动切换,所以不需要使用它

只有需要手动切换主备的时候,使用非确认监视器就行

5.1)进入非确认监视器
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[dmdba@linux1 bin]$ ./dmmonitor ../DMDB/dmmonitor_manual.ini
[monitor]         2024-07-22 21:44:14: DMMONITOR[4.0] V8
[monitor]         2024-07-22 21:44:15: DMMONITOR[4.0] IS READY.

[monitor]         2024-07-22 21:44:15:
#-----------------------------------------------------------------------------------------------#
GET MONITOR CONNECT INFO FROM DMWATCHER(GRP_TEST_01), THE FIRST LINE IS SELF INFO.

DW_CONN_TIME         MON_CONFIRM    MID            MON_IP                MON_VERSION
2024-07-22 21:44:15  FALSE          930807350      ::ffff:192.168.163.9  DMMONITOR[4.0] V8

2024-07-22 21:34:50  TRUE           826253418      ::ffff:192.168.163.9  DMMONITOR[4.0] V8

#-----------------------------------------------------------------------------------------------#

[monitor]         2024-07-22 21:44:15: 收到守护进程(GRP_TEST_01)消息
                  WTIME                WSTATUS        INST_OK   INAME            ISTATUS     IMODE     RSTAT    N_OPEN   FLSN            CLSN
                  2024-07-22 21:44:15  OPEN           OK        GRP_TEST_01      OPEN        STANDBY   NULL     5        43526           43526

[monitor]         2024-07-22 21:44:15: 收到守护进程(GRP_TEST_02)消息
                  WTIME                WSTATUS        INST_OK   INAME            ISTATUS     IMODE     RSTAT    N_OPEN   FLSN            CLSN
                  2024-07-22 21:44:15  OPEN           OK        GRP_TEST_02      OPEN        PRIMARY   VALID    5        43526           43526
5.2)监视器命令
命令 含义
list 查看守护进程的配置信息
show global info 查看所有实例组的信息
tip 查看系统当前允许状态
login 登录监视器,使用的具有 DBA 权限数据库用户,非服务器用户
logout 退出登录
choose switchover GRP1 主机正常时,查看可切换为主机的实例
switchover GRP1.GRP_TEST_01 主机正常时,使用指定组.实例 切换为主机
choose takeover GRP1 主机故障时,查看可切换为主机的实例
takeover GRP1.GRP_TEST_01 主机故障时,使用指定组.实例 切换为主机
choose takeover force GRP1 查看可强制切换为主机的实例
takeover force GRP1.GRP_TEST_01 使用组.实例 强制切换为主机

使用命令例子:都是进入监视器后直接输入即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
login
用户名:SYSDBA
密码:
[monitor]         2024-07-22 21:46:33: 登录监视器成功!
tip
[monitor]         2024-07-22 21:49:01: [!!! 提示:本监视器不是确认监视器,在故障自动切换模式下如果发生主库故障,本监视器无法执行自动接管 !!!]

[monitor]         2024-07-22 21:49:01: 实例GRP_TEST_02[PRIMARY, OPEN, ISTAT_SAME:TRUE]不可加入其他实例,守护进程状态:OPEN,Open记录状态:VALID
[monitor]         2024-07-22 21:49:01: 实例GRP_TEST_02[PRIMARY, OPEN, ISTAT_SAME:TRUE]当前没有命令正在执行
[monitor]         2024-07-22 21:49:01: 实例GRP_TEST_02[PRIMARY, OPEN, ISTAT_SAME:TRUE]运行正常, 守护进程是OPEN状态,守护类型是GLOBAL

[monitor]         2024-07-22 21:49:01: 实例GRP_TEST_01[STANDBY, OPEN, ISTAT_SAME:TRUE]可加入实例GRP_TEST_02[PRIMARY, OPEN, ISTAT_SAME:TRUE]
[monitor]         2024-07-22 21:49:01: 实例GRP_TEST_01[STANDBY, OPEN, ISTAT_SAME:TRUE]当前没有命令正在执行
[monitor]         2024-07-22 21:49:01: 实例GRP_TEST_01[STANDBY, OPEN, ISTAT_SAME:TRUE]运行正常, 守护进程是OPEN状态,守护类型是GLOBAL

[monitor]         2024-07-22 21:49:01: 组(GRP1)当前活动实例运行正常

[monitor]         2024-07-22 21:49:01: 所有组中的活动实例运行正常!

启动服务

启动数据库并修改参数

A 机器,启动数据库实例服务,并修改 OGUIDdmwatcher.ini 里配置的 OGUID 一致,并将 A 机器的库设置为 PRIMARY 模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[dmdba@linux1 bin]$ ./DmServiceGRP_TEST_01 start
Starting DmServiceGRP_TEST_01:                             [ OK ]
[dmdba@linux1 bin]$ ./disql SYSDBA/SYSDBA

服务器[LOCALHOST:5236]:处于普通配置状态
登录使用时间 : 19.397(ms)
disql V8

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
DMSQL 过程已成功完成
已用时间: 40.185(毫秒). 执行号:1.

################
# 修改 OGUID
################
SQL> SP_SET_OGUID(45331);
DMSQL 过程已成功完成
已用时间: 10.529(毫秒). 执行号:2.

#########################
# 修改为主库为 PRIMARY 模式
#########################

SQL> ALTER DATABASE PRIMARY;
操作已执行
已用时间: 34.763(毫秒). 执行号:0.

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
DMSQL 过程已成功完成
已用时间: 26.340(毫秒). 执行号:3.

B 机器,启动数据库实例服务,并修改 OGUIDdmwatcher.ini 里配置的 OGUID 一致,并将 B 机器的库设置为 STANDBY 模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[dmdba@linux2 bin]$ ./DmServiceGRP_TEST_02 start
Starting DmServiceGRP_TEST_02:                             [ OK ]
[dmdba@linux2 bin]$ ./disql SYSDBA/SYSDBA

服务器[LOCALHOST:5236]:处于普通配置状态
登录使用时间 : 48.562(ms)
disql V8
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
DMSQL 过程已成功完成
已用时间: 50.707(毫秒). 执行号:1.

SQL> SP_SET_OGUID(45331);
DMSQL 过程已成功完成
已用时间: 8.188(毫秒). 执行号:2.

SQL> ALTER DATABASE STANDBY;
操作已执行
已用时间: 48.859(毫秒). 执行号:0.

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
DMSQL 过程已成功完成
已用时间: 36.601(毫秒). 执行号:3.

启动守护进程

机器 A 和 B 都启动数据守护进程

1
2
[dmdba@linux1 bin]$ ./DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher:                          [ OK ]

到这里,数据库服务启动完毕!

附:集群启停

在刚部署时,按照 数据库 » 数据守护 的顺序,如上

如果需要重启时,则应该:数据守护停止 » 数据库重启 » 数据守护启动

1
2
3
4
cd /home/dmdba/dmdbms/bin
./DmWatcherServiceWatcher stop
./DmServiceGRP_TEST_01 restart
./DmWatcherServiceWatcher start

如果需要停止时,则应该:数据守护停止 » 数据库停止

1
2
3
cd /home/dmdba/dmdbms/bin
./DmWatcherServiceWatcher stop
./DmServiceGRP_TEST_01 stop

有监视器的情况下:

启动:数据库实例 » 数据守护 » 监视器

停止:监视器 » 数据守护 » 数据库实例

重启同上

配置 dm_svc.conf

达梦数据库在安装完成后,在 /etc 目录下生成一个 dm_svc.conf 文件,用于实现达梦集群的故障自动重连、读写分离

并且它可以在 JDBC 中使用,连接数据库时指定连接服务名,接口会随机选择 一个 IP 进行连接,如果连接不成功或者服务器状态不正确,则顺序获取下一个 IP 进行连接, 直至连接成功或者遍历了所有 IP 。

实施部署-达梦数据库linux版的安装(二) | WeiQi Blog (weiqifun.github.io) 也记录总结过

官方文档《DM8系统管理员手册.pdf》2.1.1.4 章节介绍了这个文件里详细的参数

实时主备服务名配置

这个是需要数据库服务器上配置,应用服务器上也要配置,即应用如果想要通过服务名连接数据库,则也需要配置这个文件,双方才能互相通信

linux 在 /etc/dm_svc.conf

windows 在 C:\Windows\System32 (多数 64 位机器是这个位置,反正是在 %SystemRoot%\system32 下)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
vi /etc/dm_svc.conf

###################### 添加以下内容 #############################
# 全局配置
TIME_ZONE=(480) # 时区 +8:00   60一个时区
LANGUAGE=(cn)
GRP1=(192.168.163.9:5236,192.168.163.10:5236)   # 服务名 = (各个数据库的 IP:PORT ) 逗号分割

# 服务配置
[GRP1]
TIME+ZONE=(+480)
# 指定优先登录的服务器模式 0-优先PRIMARY 1-只连接主库 2-只连接备库 3-优先STANDBY 4-优先NORMAL(缺省默认)
LOGIN_MODE=(1)
SWITCH_TIME=(3) # 以服务名连接数据库时,发生故障时,失败重连次数
SWITCH_INTERVAL=(200)   # 主备服务器切换、重连等待的时间间隔,毫秒
###################### 以上为实时主备数据守护配置 #####################################

# 读写分离配置
RW_SEPARATE=(1) # 启用读写分离,使用此参数时,LOGIN_MODE 参数失效
RW_PERCENT=(25) # 读写分离时,读写分离的分发比例

JDBC 连接

1
2
jdbc:dm://GRP1?schema=TEST
jdbc:dm://GRP1?schema=TEST&columnNameUpperCase=false

达梦管理工具连接

因为目前手上的机器为 LINUX + WINDOWS ,应用在 WINDOWS 上,所以我在 C:\Windows\System32 找到该文件,然后进行相同的配置。应用在 LINUX 上则同理数据库服务器上的路径。

img

把客户端重启,配置才会生效

img

到这里也就 OK 了,服务名配置成功

验证-主库挂掉后是否会自动切换

1)停止主库

采用的方式为停止主库(即把主库的DmWatcher守护进程服务、DmService服务停止掉),看看使用服务名是否能连接到备库

1
2
3
4
5
[dmdba@linux1 bin]$ ./DmWatcherServiceWatcher stop
Stopping DmWatcherServiceWatcher:                          [ OK ]

[dmdba@linux1 bin]$ ./DmServiceGRP_TEST_01 stop
Stopping DmServiceGRP_TEST_01:                             [ OK ]

我把达梦客户端重启,重新连接 GRP1

img

报错服务器模式不匹配,因为 dm_svc.conf 的 LOGIN_MODE = 1 只连接 PRIMARY 库,因此主库挂掉后无法连接到备库

修改数据库服务器、应用服务器的 dm_svc.conf 配置文件,修改里边的 LOGIN_MODE=0 ,优先连接 PRIMARY

再重启客户端,重连 GRP1

嗯,这个连接过程会有明显的卡顿了一下,估计是在遍历 GRP1 里的数据库实例

当前连的是备库(备库是 STANDBY 模式,因为没有监视器,所以是不会自动切换主备的,我这边没有手动切换,所以连接到备库,只提供只读服务)

2)重启主库

把主库重新启动,再重启客户端连接,连接正常的

1
2
SELECT NAME, INSTANCE_NAME, STATUS$, MODE$ FROM V$INSTANCE;
-- MODE$ 的值为 PRIMARY

验证实时同步

验证一:主库操作

1)执行创建表空间、用户、授权等操作

打开达梦管理工具,连接到主库(192.168.163.9:5236),默认的管理员用户 SYSDBA/SYSDBA

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
CREATE TABLESPACE "TS_TEST" DATAFILE '/home/dmdba/dmdbms/DMDB/TS_TEST.DBF' SIZE 500 AUTOEXTEND ON NEXT 40 MAXSIZE 2048;

CREATE USER "TEST" IDENTIFIED BY "TEST123456" DEFAULT TABLESPACE "TS_TEST";

GRANT "DBA" TO "TEST";
GRANT DELETE ANY TABLE TO TEST;
GRANT EXECUTE ANY PROCEDURE TO TEST;
GRANT INSERT ANY TABLE TO TEST;
GRANT SELECT ANY DICTIONARY TO TEST;
GRANT SELECT ANY TABLE TO TEST;
GRANT UNLIMITED TABLESPACE TO TEST;
GRANT UPDATE ANY TABLE TO TEST;

连接备库(192.168.163.10:5236),验证是否有刚刚创建的表空间、用户

img

主备实时同步正常

2)创建表、插入数据操作

打开达梦管理工具,连接到主库(192.168.163.9:5236),默认的管理员用户 SYSDBA/SYSDBA

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
CREATE TABLE "TEST"."ST_TEST_1"
(
"BUSI_DATE" INTEGER,
"NAME" VARCHAR2(20),
"AGE" VARCHAR2(2),
"SEX" VARCHAR2(1)) STORAGE(ON "TS_TEST", CLUSTERBTR) ;


COMMENT ON COLUMN "TEST"."ST_TEST_1"."SEX" IS '1-男; 2-女';
INSERT INTO "TEST"."ST_TEST_1" ("BUSI_DATE", "NAME", "AGE", "SEX") VALUES (20240702, 'DY L', '18', '1');
INSERT INTO "TEST"."ST_TEST_1" ("BUSI_DATE", "NAME", "AGE", "SEX") VALUES (20240702, 'DO W', '19', '1');
INSERT INTO "TEST"."ST_TEST_1" ("BUSI_DATE", "NAME", "AGE", "SEX") VALUES (20240702, 'PE J', '10', '2');
INSERT INTO "TEST"."ST_TEST_1" ("BUSI_DATE", "NAME", "AGE", "SEX") VALUES (20240702, 'DER K', '52', '1');
INSERT INTO "TEST"."ST_TEST_1" ("BUSI_DATE", "NAME", "AGE", "SEX") VALUES (20240702, 'NC VC', '60', '2');

COMMIT;

连接备库(192.168.163.10:5236),验证是否有刚刚创建表和数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT * FROM TEST.ST_TEST_1;


BUSI_DATE   NAME    AGE SEX
20240702    DY L    18  1
20240702    DO W    19  1
20240702    PE J    10  2
20240702    DER K   52  1

20240702    NC VC   60  2

主备实时同步正常

验证二:备库写操作

因为备库是 STANDBY 模式,提供只读服务,是不能往备库操作对象的,所以看看是否模式生效

连接备库(192.168.163.10:5236),使用 SYSDBA 管理员用户试图创建一张表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[执行语句1]:

CREATE TABLE "TEST"."ST_TEST_2"
(
  "BUSI_DATE" INTEGER,
  "NAME" VARCHAR2(20),
  "AGE" VARCHAR2(2),
  "SEX" VARCHAR2(1)) STORAGE(ON "TS_TEST", CLUSTERBTR) ;
执行失败(语句1)

-710: 试图在STANDBY模式下,修改用户库


1条语句执行失败
[执行语句1]:
DELETE FROM TEST.ST_TEST_1;
执行失败(语句1)

-710: 试图在STANDBY模式下,修改用户库

主备模式正常

无监视器进行主备切换

当异常发生时,没有配置监视器的实时主备,如何进行切换主备库?

直接使用 SQL 进行切换,切换之前,先使用 VMware 的快照功能备份一下当前的服务器状态,增加主备切换的容错,让自己能够使用快照快速恢复到刚刚搭建好集群的状态。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
-- 先将数据库切换为 Mount 状态

[dmdba@linux1 bin]$ ./disql SYSDBA/SYSDBA

服务器[LOCALHOST:5236]:处于主库打开状态
登录使用时间 : 37.834(ms)

disql V8
SQL> ALTER DATABASE MOUNT;

ALTER DATABASE MOUNT;

第1 行附近出现错误[-720]:守护进程处于活动状态,或当前配置(ALTER_MODE_STATUS)不允许该操作.

已用时间: 1.582(毫秒). 执行号:0.


##################################################
# 需要先关闭数据守护 和 修改 ALTER_MODE_STATUS 参数
##################################################

需要将守护进程关掉和模式的参数修改为可修改,才能切换,关掉守护进程的顺序:

备库的守护进程 » 主库的守护进程(其实无所谓)

【注意】

需要确保数据库中没有活动事务,手动切换需要将数据库调整为 mount 状态,它会回滚所以处于活动中的事务,已提交的事务不影响。

所以确保一下当下数据库事务的状态,如果有正在执行增删改操作的,强行调整的话,后续切换成功后,需要手动重新执行增删改的事务。

A 机器操作(主库操作)

主库切换为 PRIMARY 模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[dmdba@linux1 bin]$ ./DmWatcherServiceWatcher stop
Stopping DmWatcherServiceWatcher:                          [ OK ]

[dmdba@linux1 bin]$ ./disql SYSDBA/SYSDBA

服务器[LOCALHOST:5236]:处于主库打开状态
登录使用时间 : 20.108(ms)
disql V8

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
DMSQL 过程已成功完成
已用时间: 37.106(毫秒). 执行号:1001.

SQL> ALTER DATABASE MOUNT;
操作已执行
已用时间: 71.860(毫秒). 执行号:0.

SQL> ALTER DATABASE STANDBY;
操作已执行
已用时间: 73.077(毫秒). 执行号:0.

##################
# 非 NORMAL 模式需要 OPEN FORCE 强制开启
##################
SQL> ALTER DATABASE OPEN FORCE;
操作已执行
已用时间: 33.830(毫秒). 执行号:0.

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
DMSQL 过程已成功完成
已用时间: 36.470(毫秒). 执行号:1002.

B 机器操作(备库操作)

备库切换为 STANDBY 模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[dmdba@linux2 bin]$ ./DmWatcherServiceWatcher stop
Stopping DmWatcherServiceWatcher:                          [ OK ]

[dmdba@linux2 bin]$ ./disql SYSDBA/SYSDBA

服务器[LOCALHOST:5236]:处于备库打开状态
登录使用时间 : 21.257(ms)
disql V8
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
DMSQL 过程已成功完成
已用时间: 36.238(毫秒). 执行号:301.

SQL> ALTER DATABASE MOUNT;
操作已执行
已用时间: 20.816(毫秒). 执行号:0.

SQL> ALTER DATABASE PRIMARY;
操作已执行
已用时间: 66.994(毫秒). 执行号:0.

SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN;
第1 行附近出现错误[-516]:非NORMAL模式需要OPEN FORCE.
已用时间: 0.959(毫秒). 执行号:0.

SQL> ALTER DATABASE OPEN FORCE;
操作已执行
已用时间: 93.506(毫秒). 执行号:0.

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
DMSQL 过程已成功完成
已用时间: 32.835(毫秒). 执行号:302.

启动数据守护

A \ B 机器都启动

1
2
[dmdba@linux1 bin]$ ./DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher:                          [ OK ]

验证切换是否成功

查看实例的模式

A 机器查看,因为已经将 A 切换为备库了,所以 ./disql 会显示处于备库打开状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[dmdba@linux1 bin]$ ./disql SYSDBA/SYSDBA

服务器[LOCALHOST:5236]:处于备库打开状态
登录使用时间 : 18.106(ms)
disql V8

SQL> SELECT NAME, INSTANCE_NAME, STATUS$, MODE$ FROM V$INSTANCE;

行号     NAME        INSTANCE_NAME STATUS$ MODE$
---------- ----------- ------------- ------- -------

1          GRP_TEST_01 GRP_TEST_01   OPEN    STANDBY

B 机器查看,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[dmdba@linux2 bin]$ ./disql SYSDBA/SYSDBA

服务器[LOCALHOST:5236]:处于主库打开状态
登录使用时间 : 31.640(ms)
disql V8

SQL> SELECT NAME, INSTANCE_NAME, STATUS$, MODE$ FROM V$INSTANCE;

行号     NAME        INSTANCE_NAME STATUS$ MODE$
---------- ----------- ------------- ------- -------

1          GRP_TEST_02 GRP_TEST_02   OPEN    PRIMARY

在主库操作

主库执行 SQL

1
2
3
CREATE TABLE "TEST"."T_LISTAGG_TEST"
( "ID" INTEGER,
  "C1" VARCHAR(4000)) STORAGE(ON "TS_TEST", CLUSTERBTR) ;

在备库中查看是否同步,已同步证明没问题

确认监视器自动切换验证

在【6 无监视器进行主备切换】步骤中,已经把 A 机器(GRP_TEST_01)切换为备库,B 机器(GRP_TEST_02)切换为主库了。

把主库 GRP_TEST_02 挂掉(即把主库的DmWatcher守护进程服务、DmService服务停止掉),然后使用达梦管理工具使用服务名进入数据库,查看是否连接到 GRP_TEST_01 并且将该数据库是模式切换为 PRIMARY

1
2
3
4
[dmdba@linux2 bin]$ ./DmWatcherServiceWatcher stop
Stopping DmWatcherServiceWatcher:                          [ OK ]
[dmdba@linux2 bin]$ ./DmServiceGRP_TEST_02 stop
Stopping DmServiceGRP_TEST_02:                             [ OK ]

img

确认是自动切换了 OK

非确认监视器切换

这里就不再详细说明了,把确认监视器失效掉(把里边的 MON_DW_CONFIRM 改为 1),然后使用非确认监视器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 前台方式进入非确认监视器
cd /home/dmdba/dmdbms/bin
./dmmonitor /home/dmdba/dmdbms/DMDB/dmmonitor_manual.ini
# 检查集群状态
tip
# 登录非确认监视器:使用有 DBA 权限的用户,我用 SYSBDA
login
# 查看满足切换条件的实例
choose switchover GRP1
# 进行主备切换
switchover GRP1.GRP_TEST_01
# 切换成功,退出监视器
logout
# 再次查看集群状态
tip
# 正常了,退出非确认监视器即可
exit

报错问题

主要还是步骤并没有按顺序来导致的,或者配置文件里配置错误导致

启动数据守护报错

1
2
3
4
5
6
[dmdba@linux1 bin]$ ./dmwatcher /home/dmdba/dmdbms/DMDB/dmwatcher.ini
DMWATCHER[4.0] V8
Invalid [mal_name] or the file contains unrecognized characters in [/home/dmdba/dmdbms/DMDB/dmmal.ini]!
Read ini file(/home/dmdba/dmdbms/DMDB/dmmal.ini) error in line 1, code(-104)
Read dm.ini(/home/dmdba/dmdbms/DMDB/dm.ini) failed, code = -104!
fail to read ini file

读两个文件报错了,第一个报错给出了明确的列

dmmal.ini 的第一列报错,查看了一下,复制进shell的时候,缺少了 MA 两个字母,补充形成完整的

MAL_CHECK_INTERVAL 参数

1
MAL_CHECK_INTERVAL         = 10  #MAL 链路检测时间间隔

然后重新启动就成功了

1
2
[dmdba@linux1 bin]$ ./DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher:                          [ OK ]

启动数据库实例报错

1
2
[dmdba@linux1 bin]$ ./DmServiceGRP_TEST_01 start
Starting DmServiceGRP_TEST_01:                             [ FAILED ]

查看日志 dm_实例名_年月.log

1
2
2024-07-21 11:22:01.998 [INFO] database P0000036451 T0000000000000036513  utsk_tcp_conn_validate failed, seqno:0, from_name:, code:-9423!
2024-07-21 11:22:03.014 [INFO] database P0000036451 T0000000000000036513  Dmwatcher oguid(45331) is not match with local dmserver oguid(0), code -9423, cannot build connection!

查看数据守护的日志 dm_dmwatcher_实例名_年月.log

1
2024-07-21 11:26:58.830 [INFO] dmwatcher P0000036411 T0000000000000036416  dw2_tcp_conn_startup, oguid(45331) configured in dmwatcher.ini not equal with local dmserver's oguid(0)!

是因为没有启动数据库,并到数据库里修改 OGUID 参数导致。看上边启动服务步骤。

Licensed under CC BY-NC-SA 4.0
最后更新于 2024年10月14号 22:36