达梦守护搭建涉及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 $1$2$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\<\ 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 当前实例 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 修改 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 以 Mount 方式启动主库 ./dmserver /data/dmdata/DAMENG/dm.ini mount 注意: 一定要以Mount方式启动数据库实例,否则系统启动时会重构回滚表空间,生成Redo日志; 并且,启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动Open数据库。 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值。 启动命令行工具 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); 在 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 当前实例 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 和主库一样 修改 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 以 Mount 方式启动备库 cd /opt/dmdbms/bin ./dmserver /data/dmdata/DAMENG/dm.ini mount 启动命令行工具 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); 如果当前数据库不是 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); 由于主库和实时备库的守护进程配置为自动切换模式,因此这里必须配置确认监视器。和普通监视器相比, 确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知实时备库接管为新的主库,具有自动故障处理的功能。 配置确认监视器时可以选择配置单实例监视器或配置多实例监视器,下面将分别介绍配置单实例监视器以及 多实例监视器时 dmmonitor.ini 配置文件中的配置信息。 修改 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 为每个实例配置一个 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
DMWATCHER\[4.0\] V8
DMWATCHER\[4.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
Server\[127.0.0.1:32141\]:mode is primary, state is open
login used time : 2.057(ms)
disql V8
SQL\> select status$ from v$instance;
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
Server\[127.0.0.1:32142\]:mode is standby, state is open
login used time : 1.579(ms)
disql V8
SQL\> select status$ from v$instance;
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
Server\[127.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_02\[PRIMARY, 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]
7.2.3.3 配置 dmarch.ini
7.2.3.4 配置 dmwatcher.ini
7.2.3.5 启动主库
7.2.3.6 设置 OGUID
7.2.3.7 修改数据库模式
7.2.4 配置备库 GRP1_RT_02
7.2.4.1 配置 dm.ini
7.2.4.3 配置 dmarch.ini
7.2.4.4 配置 dmwatcher.ini
7.2.4.5 启动备库
7.2.4.6 设置 OGUID
7.2.4.7 修改数据库模式
7.2.5 配置监视器
7.2.5.1 配置单实例监视器
7.2.5.2 配置多实例监视器