达梦守护搭建

达梦守护搭建涉及dm.ini,dmarch.ini,dmmal.ini,dmwatcher.ini以及dmmonitor.ini这几个文件

,直接从现有的生产复制出来,将ip地址修改掉,创建对应的目录,修改内在参数

就可以启动主库。

基础操作

操作系统

复制代码
[dmdba@host01 ~]$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[dmdba@host01 ~]$

安装达梦软件

软件安装目录/opt/dmdbms,就是DM_HOM=/opt/dmdbms

复制代码
su - root
useradd dmdba
unzip dm8_20220720_x86_rh7_64_ent.zip
mount dm8_20220720_x86_rh7_64_ent_8.1.2.114_pack11.iso /mnt
cd /mnt
./DMInstall.bin -i

创建目录和授权

复制代码
useradd dmdba
mkdir -p /data/dmdata
mkdir -p /data/dmarch
chown dmdba. /data/dmdata /data/dmarch

创建达梦数据库实例

复制代码
su - dmdba
cd /opt/dmdbms/bin
./dminit  PATH=/data/dmdata/ PAGE_SIZE=32 EXTENT_SIZE=32 INSTANCE_NAME=DMSVR01 DB_NAME=DMGBRW SYSDBA_PWD=DMGBRw#123321 SYSAUDITOR_PWD=DMGBRw#123321 CASE_SENSITIVE=1 CHARSET=1

配置环境变量

复制代码
cat>>~/.bash_profile<<'EOF'
export DM_HOME=/opt/dmdbms
export PATH=$PATH:$DM_HOME/bin
EOF

创建dmserver服务

复制代码
su - root
cd /opt/dmdbms/script/root/
./dm_service_installer.sh -t dmserver -p DMSVR01 -dm_ini /data/dmdata/DMGBRW/dm.ini

官方文档:https://eco.dameng.com/document/dm/zh-cn/pm/data-guard-construction.html

https://eco.dameng.com/document/dm/zh-cn/pm/data-guard-construction.html

达梦守护和读写分离的搭建--开始搭建

7.1 数据准备

配置数据守护 V4.0 之前,必须先通过备份还原方式同步各数据库的数据,确保各数据库的数据保持完全一致。主库可以是新初始化的数据库,也可以是正在生产、使用中的数据库。备库在备份还原前,需要先准备初始化一个新库。不能使用分别初始化库或者直接拷贝数据文件的方法来直接配置数据库守护。

7.1.1 脱机备份、脱机还原方式

正常关闭数据库

DmServiceDMSVR01 stop

进行脱机备份

dmrman CTLSTMT="BACKUP DATABASE '/data/dmdata/DMGBRW/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/data/dmdata/BACKUP_FILE_01'"

提示:backup successfully!

cd /data/dmdata

tar zcf p.tar.gz BACKUP_FILE_01

传输到备库提前创建好的目录

scp p.tar.gz dmdba@192.168.56.30:/data/dmdata/

备库初始化数据库

备库的软件路径不同,不影响,但版本不同会导致恢复失败

卸载版本重新安装

cd /home/dmdba/dmdbm

sh uninstall.sh -i

安装用root就默认安装在/opt/dmdbms

不能使用分别初始化库或者直接拷贝数据文件的方法来直接配置数据库守护。

实例名:DMSVR02 其它和主库一致

su - root

mkdir -p /data/dmdata

mkdir -p /data/dmarch

chown dmdba. /data/dmdata /data/dmarch

su - dmdba

dminit PATH=/data/dmdata/ PAGE_SIZE=32 EXTENT_SIZE=32 INSTANCE_NAME=DMSVR02 DB_NAME=DMGBRW SYSDBA_PWD=DMGBRw#123321 SYSAUDITOR_PWD=DMGBRw#123321 CASE_SENSITIVE=1 CHARSET=1

创建服务

su - root

cd /opt/dmdbms/script/root/

./dm_service_installer.sh -t dmserver -p DMSVR02 -dm_ini /data/dmdata/DMGBRW/dm.ini

备库还原

使用主库传输过来的备份

su - dmdba

cd /data/dmdata

tar zxf p.tar.gz

dmrman CTLSTMT="RESTORE DATABASE '/data/dmdata/DMGBRW/dm.ini' FROM BACKUPSET '/data/dmdata/BACKUP_FILE_01'"

-8310:some error occur while backupset checking

查看日志

2025-11-12 08:17:16.446 ERROR dmrman P0000030873 T0000000000000030873 os_dir_create_low failed! path: ../log, code: 13, desc: Permission denied

cd /opt/dmdbms/log

chmod 777 *.log

再次还原就可以解析权限问题了

还有提示:-8310:some error occur while backupset checking

但看日志是没有dm.key的问题,这个测试过程中不算问题

因为脱机备份没有产生任何 REDO 日志,所以恢复这一步此处省略。

数据库更新:

dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/DMGBRW/dm.ini' UPDATE DB_MAGIC"

启动备库成功

dmdba@host01 bin$ DmServiceDMSVR02 start

Starting DmServiceDMSVR02: OK

dmdba@host01 bin$

7.1.2 联机备份、脱机还原方式

这个是已经单节点上线的情况

注意:如果单节点系统已经上线,数据库服务不允许中断情况下,可以按照第6.14备库重建的步骤完成备库数据准备。

备份文件中会记录原备份库的模式和OGUID信息,使用备份文件还原成功后,需要再根据实际配置情况修改数据库的模式和OGUID值。

如果执行备份时,待备份的库是Normal模式,并且不能确定这个库一定作为主库使用,则对Normal模式的库必须使用脱机备份,不能使用联机备份方式,避免备份完成后,Normal模式的库LSN有增长,又将其修改为Standby模式,而使用备份集还原后的库修改为Primary模式,备库数据比主库数据多,导致主备数据不一致的情况出现。因此,对执行联机备份的库,建议是已经修改为Primary模式的库。

备份

复制代码
SQL> BACKUP DATABASE BACKUPSET '/data/dmdata/BACKUP_FILE_01';
executed successfully
used time: 00:00:01.020. Execute id is 700.
SQL>

拷贝备份到备库

复制代码
[dmdba@host02 ~]$ cd /data/dmdata/
[dmdba@host02 dmdata]$ scp -r BACKUP_FILE_01/ host01:/data/dmdata
The authenticity of host 'host01 (192.168.56.30)' can't be established.
ECDSA key fingerprint is SHA256:Yr/a/J0Otvw10FXf6V42j1cMp6UwvJI3ILMI3kRw15o.
ECDSA key fingerprint is MD5:c7:fb:f1:34:a2:79:5b:6e:a9:35:7f:00:44:ee:8f:ac.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'host01' (ECDSA) to the list of known hosts.
dmdba@host01's password:
BACKUP_FILE_01.bak                                                                          100%   14MB  27.4MB/s   00:00
BACKUP_FILE_01_1.bak                                                                        100%   12KB   1.4MB/s   00:00
BACKUP_FILE_01.meta                                                                         100%   81KB  20.5MB/s   00:00
[dmdba@host02 dmdata]$

执行脱机数据库还原与恢复

复制代码
cd /opt/dmdbms/bin
./dmrman CTLSTMT="RESTORE DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/data/dmdata/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' FOR STANDBY FROM BACKUPSET '/data/dmdata/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"

7.2 配置实时主备

192.168.56.30 主 host01

192.168.56.31 备 host01

192.168.56.32 确认监视器 host03

表7.2 端口规划

|------------|----------|------------------|---------------|----------|-------------|
| 实例名 | PORT_NUM | MAL_INST_DW_PORT | MAL_HOST | MAL_PORT | MAL_DW_PORT |
| GRP1_RT_01 | 32141 | 33141 | 192.168.56.30 | 61141 | 52141 |
| GRP1_RT_02 | 32142 | 33142 | 192.168.56.31 | 61142 | 52142 |

7.2.2 数据准备

创建默认库名为DAMENG,实例名DMSERVER的初始化数据库

host01

cd /opt/dmdbms/bin

./dminit path=/data/dmdata SYSDBA_PWD=DMdba_123 SYSAUDITOR_PWD=DMauditor_123

host02

cd /opt/dmdbms/bin

./dminit path=/data/dmdata SYSDBA_PWD=DMdba_123 SYSAUDITOR_PWD=DMauditor_123

host03

cd /opt/dmdbms/bin

./dminit path=/data/dmdata SYSDBA_PWD=DMdba_123 SYSAUDITOR_PWD=DMauditor_123

然后按照 7.1 数据准备中的方法准备备库数据。

命令行启动一次主库(初始化库不能用做备库在7.1有说明)

cd /opt/dmdbms/bin

./dmserver path=/data/dmdata/DAMENG/dm.ini

SYSTEM IS READY. 在提示这个时,输入exit关闭数据库

exit

然后备份

./dmrman CTLSTMT="BACKUP DATABASE '/data/dmdata/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/data/dmdata/BACKUP_FILE_01'"

传输

cd /data/dmdata

scp -r BACKUP_FILE_01 host02:/data/dmdata

备库还原

./dmrman CTLSTMT="RESTORE DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/data/dmdata/BACKUP_FILE_01'"

数据库更新:因为脱机备份没有产生任何 REDO 日志,所以恢复这一步此处省略。---执行它没有错,不然后面可能也提醒执行

./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"

7.2.3 配置主库 GRP1_RT_01

##实例名,建议使用"组名_守护环境_序号"的命名方式,总长度不能超过16

INSTANCE_NAME = GRP1_RT_01

PORT_NUM = 32141 ##数据库实例监听端口

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次的日志发送信息

#语法\s\+表示连续多个空格,而^\s\+表示连续多个空格开头

sed -n 's/^\s\+DW_INACTIVE_INTERVAL .*/DW_INACTIVE_INTERVAL=60/p' /data/dmdata/DAMENG/dm.ini

#命令行直接替换

cd /data/dmdata/DAMENG/

sed -i 's/INSTANCE_NAME.*/INSTANCE_NAME=GRP1_RT_01/g' dm.ini

sed -i 's/^\s\+PORT_NUM .*/PORT_NUM=32141/g' dm.ini

sed -i 's/^\s\+DW_INACTIVE_INTERVAL .*/DW_INACTIVE_INTERVAL=60/g' dm.ini

sed -i 's/^\s\+ALTER_MODE_STATUS .*/ALTER_MODE_STATUS=0/g' dm.ini

sed -i 's/^\s\+ENABLE_OFFLINE_TS .*/ENABLE_OFFLINE_TS=2/g' dm.ini

sed -i 's/^\s\+MAL_INI .*/MAL_INI=1/g' dm.ini

sed -i 's/^\s\+ARCH_INI .*/ARCH_INI=1/g' dm.ini

sed -i 's/^\s\+RLOG_SEND_APPLY_MON .*/RLOG_SEND_APPLY_MON=64/g' dm.ini

检查

cat dm.ini|awk '{print 12$3}'|grep -E "^INSTANCE_NAME|^PORT_NUM|^DW_INACTIVE_INTERVAL|^ALTER_MODE_STATUS|^ENABLE_OFFLINE_TS|^MAL_INI|^ARCH_INI|^RLOG_SEND_APPLY_MON"

结果:

INSTANCE_NAME=GRP1_RT_01

PORT_NUM=32141

RLOG_SEND_APPLY_MON=64

DW_INACTIVE_INTERVAL=60

ALTER_MODE_STATUS=0

ENABLE_OFFLINE_TS=2

MAL_INI=1

ARCH_INI=1

7.2.3.2 配置 dmmal.ini

一个inst可以只使用一个ip

cat>dmmal.ini<<EOF

MAL_CHECK_INTERVAL = 5

MAL_CONN_FAIL_INTERVAL = 5

MAL_INST1

MAL_INST_NAME = GRP1_RT_01

MAL_HOST = 192.168.56.30

MAL_PORT = 61141

MAL_INST_HOST = 192.168.56.30

MAL_INST_PORT = 32141

MAL_DW_PORT = 52141

MAL_INST_DW_PORT = 33141

MAL_INST2

MAL_INST_NAME = GRP1_RT_02

MAL_HOST = 192.168.56.31

MAL_PORT = 61142

MAL_INST_HOST = 192.168.56.31

MAL_INST_PORT = 32142

MAL_DW_PORT = 52142

MAL_INST_DW_PORT = 33142

EOF

7.2.3.3 配置 dmarch.ini

当前实例 GRP1_RT_01 是主库,需要向 GRP1_RT_02(实时备库)同步数据,因此实时归档的 ARCH_DEST 配置为 GRP1_RT_02。

cat>dmarch.ini<<EOF

ARCHIVE_REALTIME

ARCH_TYPE = REALTIME

ARCH_DEST = GRP1_RT_02

ARCHIVE_LOCAL1

ARCH_TYPE = LOCAL

ARCH_DEST = /data/dmarch

ARCH_FILE_SIZE = 128

ARCH_SPACE_LIMIT = 0

EOF

7.2.3.4 配置 dmwatcher.ini

修改 dmwatcher.ini 配置守护进程,配置为全局守护类型DW_TYPE = GLOBAL,使用自动切换模式。

cat>dmwatcher.ini<<EOF

GRP1

DW_TYPE = GLOBAL

DW_MODE = AUTO

DW_ERROR_TIME = 10

INST_RECOVER_TIME = 60

INST_ERROR_TIME = 10

INST_OGUID = 453331

INST_INI = /data/dmdata/DAMENG/dm.ini

INST_AUTO_RESTART = 1

INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver

RLOG_SEND_THRESHOLD = 0

RLOG_APPLY_THRESHOLD = 0

EOF

ls /data/dmdata/DAMENG/dm.ini

#这个可以换成服务DmServiceDAMENG,使用相同的服务名应该是可以的

ls /opt/dmdbms/bin/dmserver

7.2.3.5 启动主库

以 Mount 方式启动主库

./dmserver /data/dmdata/DAMENG/dm.ini mount

注意:

一定要以Mount方式启动数据库实例,否则系统启动时会重构回滚表空间,生成Redo日志;

并且,启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动Open数据库。

7.2.3.6 设置 OGUID

disql sysdba/DMdba_123@127.0.0.1:32141

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

sp_set_oguid(453331);

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

注意

系统通过OGUID值确定一个守护进程组,由用户保证OGUID值的唯一性,并确保数据守护系统中,数据库、守护进程和监视器配置相同的OGUID值。

7.2.3.7 修改数据库模式

启动命令行工具 DIsql,登录主库修改数据库为 Primary 模式

disql sysdba/DMdba_123@127.0.0.1:32141

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

ALTER DATABASE Primary;

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

7.2.4 配置备库 GRP1_RT_02

7.2.4.1 配置 dm.ini

在 DW_S1 机器上配置备库的实例名为 GRP1_RT_02,dm.ini 参数修改如下:

INSTANCE_NAME = GRP1_RT_02

PORT_NUM = 32142

DW_INACTIVE_INTERVAL = 60

ALTER_MODE_STATUS = 0

ENABLE_OFFLINE_TS = 2

MAL_INI = 1

ARCH_INI = 1

RLOG_SEND_APPLY_MON = 64

#命令行直接替换

cd /data/dmdata/DAMENG/

sed -i 's/INSTANCE_NAME.*/INSTANCE_NAME=GRP1_RT_02/g' dm.ini

sed -i 's/^\s\+PORT_NUM .*/PORT_NUM=32141/g' dm.ini

sed -i 's/^\s\+DW_INACTIVE_INTERVAL .*/DW_INACTIVE_INTERVAL=60/g' dm.ini

sed -i 's/^\s\+ALTER_MODE_STATUS .*/ALTER_MODE_STATUS=0/g' dm.ini

sed -i 's/^\s\+ENABLE_OFFLINE_TS .*/ENABLE_OFFLINE_TS=2/g' dm.ini

sed -i 's/^\s\+MAL_INI .*/MAL_INI=1/g' dm.ini

sed -i 's/^\s\+ARCH_INI .*/ARCH_INI=1/g' dm.ini

sed -i 's/^\s\+RLOG_SEND_APPLY_MON .*/RLOG_SEND_APPLY_MON=64/g' dm.ini

cat dm.ini|awk '{print 12$3}'|grep -E "^INSTANCE_NAME|^PORT_NUM|^DW_INACTIVE_INTERVAL|^ALTER_MODE_STATUS|^ENABLE_OFFLINE_TS|^MAL_INI|^ARCH_INI|^RLOG_SEND_APPLY_MON"

结果:

INSTANCE_NAME=GRP1_RT_02

PORT_NUM=32142

RLOG_SEND_APPLY_MON=64

DW_INACTIVE_INTERVAL=60

ALTER_MODE_STATUS=0

ENABLE_OFFLINE_TS=2

MAL_INI=1

ARCH_INI=1

7.2.4.2 配置 dmmal.ini

配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致,MAL_HOST 使用内部网络 IP,MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值,MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:

官网配置的实例1和实例2的数据库连接端口是不一样的,一个是32141,一个是32142,需要MAL_INST_PORT对应,这点需要注意,在修改dm.ini的PORT_NUM时

cat>dmmal.ini<<EOF

MAL_CHECK_INTERVAL = 5

MAL_CONN_FAIL_INTERVAL = 5

MAL_INST1

MAL_INST_NAME = GRP1_RT_01

MAL_HOST = 192.168.56.30

MAL_PORT = 61141

MAL_INST_HOST = 192.168.56.30

MAL_INST_PORT = 32141

MAL_DW_PORT = 52141

MAL_INST_DW_PORT = 33141

MAL_INST2

MAL_INST_NAME = GRP1_RT_02

MAL_HOST = 192.168.56.31

MAL_PORT = 61142

MAL_INST_HOST = 192.168.56.31

MAL_INST_PORT = 32142

MAL_DW_PORT = 52142

MAL_INST_DW_PORT = 33142

EOF

7.2.4.3 配置 dmarch.ini

当前实例 GRP1_RT_02 是备库,守护系统配置完成后,可能在各种故障处理中,GRP1_RT_02 切换为新的主库,

正常情况下,GRP1_RT_01 会切换为新的备库,需要向 GRP1_RT_01 同步数据,因此实时归档的 ARCH_DEST 配置为 GRP1_RT_01。

cat>dmarch.ini<<EOF

ARCHIVE_REALTIME

ARCH_TYPE = REALTIME

ARCH_DEST = GRP1_RT_01

ARCHIVE_LOCAL1

ARCH_TYPE = LOCAL

ARCH_DEST = /data/dmarch

ARCH_FILE_SIZE = 128

ARCH_SPACE_LIMIT = 0

EOF

7.2.4.4 配置 dmwatcher.ini

和主库一样

修改 dmwatcher.ini 配置守护进程,配置为全局守护类型DW_TYPE = GLOBAL,使用自动切换模式。

cat>dmwatcher.ini<<EOF

GRP1

DW_TYPE = GLOBAL

DW_MODE = AUTO

DW_ERROR_TIME = 10

INST_RECOVER_TIME = 60

INST_ERROR_TIME = 10

INST_OGUID = 453331

INST_INI = /data/dmdata/DAMENG/dm.ini

INST_AUTO_RESTART = 1

INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver

RLOG_SEND_THRESHOLD = 0

RLOG_APPLY_THRESHOLD = 0

EOF

7.2.4.5 启动备库

以 Mount 方式启动备库

cd /opt/dmdbms/bin

./dmserver /data/dmdata/DAMENG/dm.ini mount

7.2.4.6 设置 OGUID

启动命令行工具 DIsql,登录备库设置 OGUID 值为 453331

disql sysdba/DMdba_123@127.0.0.1:32142

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

sp_set_oguid(453331);

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

7.2.4.7 修改数据库模式

如果当前数据库不是 Normal 模式,需要先修改 dm.ini 中 ALTER_MODE_STATUS 值为 1,允许修改数据库模式,修改 Standby 模式成功后再改回为 0。

如果是 Normal 模式,请忽略下面的第 1 步和第 3 步。

disql sysdba/DMdba_123@127.0.0.1:32141

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

alter database standby;

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

7.2.5 配置监视器

由于主库和实时备库的守护进程配置为自动切换模式,因此这里必须配置确认监视器。和普通监视器相比,

确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知实时备库接管为新的主库,具有自动故障处理的功能。

配置确认监视器时可以选择配置单实例监视器或配置多实例监视器,下面将分别介绍配置单实例监视器以及

多实例监视器时 dmmonitor.ini 配置文件中的配置信息。

7.2.5.1 配置单实例监视器

修改 dmmonitor.ini 配置确认监视器,其中 MON_DW_IP 中的 IP 和 PORT 和 dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致。

在三个节点(host01,host02,host03)都创建这个监视器配置文件

cat>dmmonitor.ini<<'EOF'

##实例名,建议使用"组名_守护环境_序号"的命名方式,总长度不能超过16

MON_DW_CONFIRM = 1 ##确认监视器模式

MON_LOG_PATH = /data/dmdata/log ##监视器日志文件存放路径

MON_LOG_INTERVAL = 60 ##每隔60s定时记录系统信息到日志文件

MON_LOG_FILE_SIZE = 32 ##每个日志文件最大32M

MON_LOG_SPACE_LIMIT = 0 ##不限定日志文件总占用空间

GRP1

MON_INST_OGUID = 453331 ##组GRP1的唯一OGUID值

##以下配置为监视器到组GRP1的守护进程的连接信息,以"IP:PORT"的形式配置

##IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT

MON_DW_IP = 192.168.56.30:52141

MON_DW_IP = 192.168.56.31:52142

EOF

7.2.5.2 配置多实例监视器

为每个实例配置一个 dmmonitor.ini。众多 dmmonitor.ini 中,除 MON_ID 和 MON_NAME 参数不同以外,其他参数应完全一致。

7.2.6 启动守护进程

启动各个主备库上的守护进程:

./dmwatcher /data/dmdata/DAMENG/dmwatcher.ini

dmdba@host01 bin$ ./dmwatcher /data/dmdata/DAMENG/dmwatcher.ini

DMWATCHER4.0 V8

DMWATCHER4.0 IS READY

守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始广播自身和其监控实例的状态信息,

结合自身信息和远程守护进程的广播信息,守护进程将本地实例 Open,并切换为 Open 状态。

主库,虽然是看到进程是mount状态启动的,但查看状态已经是OPEN

dmdba@host01 DAMENG$ ps -ef|grep dmserver

dmdba 2964 30820 0 01:50 pts/1 00:00:00 grep --color=auto dmserver

dmdba 30480 13467 0 01:12 pts/0 00:00:04 ./dmserver /data/dmdata/DAMENG/dm.ini mount

dmdba@host01 DAMENG$ disql sysdba/DMdba_123@127.0.0.1:32141

open fail! path:./libcrypto.so

Server127.0.0.1:32141:mode is primary, state is open

login used time : 2.057(ms)

disql V8

SQL> select status from vinstance;

LINEID STATUS$


1 OPEN

used time: 1.840(ms). Execute id is 600.

SQL> create table t1 as select * from dba_tables;

备库也同样,并且验证数据已经同步

dmdba@host02 DAMENG$ ps -ef|grep dmserver

dmdba 2558 13311 0 01:33 pts/0 00:00:02 ./dmserver /data/dmdata/DAMENG/dm.ini mount

dmdba 6877 3010 0 01:49 pts/1 00:00:00 grep --color=auto dmserver

dmdba@host02 DAMENG$ cd

dmdba@host02 \~$ disql sysdba/DMdba_123@127.0.0.1:32142

open fail! path:./libcrypto.so

Server127.0.0.1:32142:mode is standby, state is open

login used time : 1.579(ms)

disql V8

SQL> select status from vinstance;

LINEID STATUS$


1 OPEN

used time: 2.873(ms). Execute id is 100.

SQL> select count(1) from t1;

LINEID COUNT(1)


1 58

used time: 1.216(ms). Execute id is 101.

SQL>

7.2.7 启动监视器

启动监视器命令:

cd /opt/dmdbms/bin

./dmmonitor /data/dmdata/dmmonitor.ini

输入show命令查看主备状态

输入help命令查看帮助

输入login命令登陆监视器

host03也安装达梦软件

su - dmdba

cd /data/dmdata/DAMENG

cat>dmmonitor.ini<<'EOF'

##实例名,建议使用"组名_守护环境_序号"的命名方式,总长度不能超过16

MON_DW_CONFIRM = 1 ##确认监视器模式

MON_LOG_PATH = /data/dmdata/log ##监视器日志文件存放路径

MON_LOG_INTERVAL = 60 ##每隔60s定时记录系统信息到日志文件

MON_LOG_FILE_SIZE = 32 ##每个日志文件最大32M

MON_LOG_SPACE_LIMIT = 0 ##不限定日志文件总占用空间

GRP1

MON_INST_OGUID = 453331 ##组GRP1的唯一OGUID值

##以下配置为监视器到组GRP1的守护进程的连接信息,以"IP:PORT"的形式配置

##IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT

MON_DW_IP = 192.168.56.30:52141

MON_DW_IP = 192.168.56.31:52142

EOF

cd /opt/dmdbms/bin

./dmmonitor /data/dmdata/DAMENG/dmmonitor.ini

只能启动一个监视器

dmdba@host03 bin$ ./dmmonitor /data/dmdata/DAMENG/dmmonitor.ini

Exist multiple CONFIRM dmmonitor, can only startup one!

dmdba@host03 bin$

把在host01运行的关闭

重新启动

实验

1)关闭Host01 主库电源

结论:备库自动升主

2)新主在原主未启动情况下做ddl和dml

disql sysdba/DMdba_123@127.0.0.1:32142

create table t2 as select * from dba_tables;

dmdba@host02 \~$ disql sysdba/DMdba_123@127.0.0.1:32142

open fail! path:./libcrypto.so

Server127.0.0.1:32142:mode is primary, state is open

login used time : 1.833(ms)

disql V8

SQL> create table t2 as select * from dba_tables;

executed successfully

used time: 51.884(ms). Execute id is 500.

SQL> insert into t2 select * from t1;

affect rows 58

used time: 1.757(ms). Execute id is 502.

SQL>

结论:可以正常在新主ddl和dml操作

3)开启原主电源

启动dmwatcher

cd /opt/dmdbms/bin

./dmwatcher /data/dmdata/DAMENG/dmwatcher.ini

dmwatcher会自动启动down掉的实例

root@host01 \~# ps -ef|grep dmserver

dmdba 1699 1 1 02:27 ? 00:00:00 /opt/dmdbms/bin/dmserver /data/dmdata/DAMENG/dm.ini mount

root 1722 1626 0 02:27 pts/1 00:00:00 grep --color=auto dmserver

root@host01 \~#

在监视器show命令可以看到原主状态正常,

disql sysdba/DMdba_123@127.0.0.1:32141

SQL> select count(*) from t2;

LINEID COUNT(*)


1 59

used time: 0.686(ms). Execute id is 1.

SQL>

但是数据不同步,在新主数据是

SQL> select count(*) from t2;

LINEID COUNT(*)


1 117

根据文档来排查问题

https://eco.dameng.com/document/dm/zh-cn/ops/troubleshooting-database.html

check recover GRP1.GRP1_RT_02

monitor 2025-11-13 02:38:54: Instance GRP1_RT_02PRIMARY, OPEN, ISTAT_SAME:TRUE is PRIMARY mode, cannot do recover!

check recover GRP1.GRP1_RT_01

monitor 2025-11-13 02:39:05: Instance(grp1_rt_01) check result: Primary instance(GRP1_RT_02) arch status to instance(GRP1_RT_01) is VALID, recovery of instance(GRP1_RT_01) is not necessary!

主库切换日志

SQL> alter system switch logfile;

executed successfully

used time: 13.948(ms). Execute id is 0.

SQL>

通过监视器show发现FSEQ=4067而备还是4054不变

达梦的take over(灾切)的发生,有可能导致新的主备不一致,需要重建主备--如果原本主备是不同步的,还有可能丢失部分数据。

复制代码
./dmrman CTLSTMT="RESTORE DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' FOR STANDBY FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' UPDATE DB_MAGIC"

[dmdba@host01 bin]$ ./dmrman CTLSTMT="RESTORE DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/data/dmdata/BACKUP_FILE_01'"
dmrman V8
RESTORE DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/data/dmdata/BACKUP_FILE_01'
file dm.key not found, use default license!
[Percent:0.00%][Speed:0.00M/s][Cost:00:00:00][Remaining:00:00:00]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:02][Remaining:00:00:00]
restore successfully.
time used: 00:00:02.061
[dmdba@host01 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' FOR STANDBY FROM BACKUPSET '/data/dmdata/BACKUP_FILE_01'"
dmrman V8
[-8301]:line [1],col [46] and nearby [FOR] exists error[-2007]:Syntax error
[dmdba@host01 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' FOR STANDBY FROM BACKUPSET '/data/dmdata/BACKUP_FILE_01'"
dmrman V8
[-8301]:line [1],col [46] and nearby [FOR] exists error[-2007]:Syntax error
[dmdba@host01 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"
dmrman V8
RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC
file dm.key not found, use default license!
Database mode = 1, oguid = 453331
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[28080], file_lsn[28080]
[-8308]:recover database should be executed, before recover database update db_magic



dmwatcher日志
2025-11-13 08:18:34.457 [INFO] dmwatcher P0000022800 T0000140575379752704  Instance: dmwatcher status(OPEN) Instance status(OK) Instance Name(GRP1_RT_02) Mode(PRIMARY) Instance status(OPEN) Arch status(INVALID) POCNT(4) FLSN(28106) CLSN(28106) SLSN(28106) SSLSN(28106).
2025-11-13 08:18:44.490 [INFO] dmwatcher P0000022800 T0000140575513085696  dw2_group_set_restart_flag, flag is TRUE, last msg time:1762993124
2025-11-13 08:18:44.490 [INFO] dmwatcher P0000022800 T0000140575393437440  [Local instance restarted by dmwatcher. start info is in dmserver log]
相关推荐
丷丩1 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空991 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
TheRouter2 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro2 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
JAVA面经实录9173 小时前
Hibernate面试题库
数据库·oracle·hibernate
迷枫7123 小时前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi4 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
小程故事多_805 小时前
Claude Code自定义workflow skills用法
数据库·人工智能·智能体
大鹏说大话5 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
夏贰四5 小时前
数据建模工具如何筑牢数据根基?数据建模工具怎样落实标准体系?
数据库·数学建模·数据建模工具