本机主备是在单台服务器上部署两个独立的数据库实例,通过端口错开、目录分离、独立进程等方式实现逻辑层面的主备隔离,使二者能够完成数据同步与故障自动切换。但由于两个实例共享同一套物理资源,该架构仅能应对数据库进程或实例级别的故障,无法防范服务器硬件损坏、操作系统崩溃、磁盘故障等底层风险。
一、环境信息与规划
1、基本信息

操作系统版本为银河麒麟高级服务器操作系统V10
达梦数据库版本为DM8 V8 64位版本(dm8_20260428_x86_kylin10_sp3_64)
虚拟化平台:Oracle VM VirtualBox7.1.6
远程管理工具:MobaXterm
数据库管理工具:达梦数据库管理工具
2、网络规划

3、端口规划

4、实例路径规划

5、归档文件路径规划

二、新建虚拟机dm111
1、在VirtualBox中新建虚拟机,命名为dm111放在D盘;使用麒麟操作系统ISO镜像
网络连接方式改为Host-Only;显示设置放大至 250%。
3、网络和主机名中打开以太网开关,配置IPv4,ip设置成192.168.56.111,子网掩
码设置成255.255.255.0,网关设置成192.168.56.1;勾选"需要 IPv4 地址完成这个连接";主机名设置为 dm111后应用。
4、设置 root 密码后进行安装,完成后重启。
5、登录root用户,并配置网卡自动启动。
即:vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
将ONBOOT=no 改成 ONBOOT=yes
三、系统环境配置
1、挂载镜像
将虚拟机的光驱从麒麟系统替换成达梦安装包。
mount /dev/cdrom /media
2、创建用户
cd /media/
groupadd dinstall
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
passwd dmdba 
3、修改存放目录后进行安装
export DM_INSTALL_TMPDIR=/home
./DMInstall.bin -i
(选择简体中文;不输入key;时区21;典型安装;默认路径)

4、配置环境变量
su – dmdba
vi .bash_profile
在里面添加:export PATH=$PATH:$DM_HOME/bin
source .bash_profile
5、给dmdba权限并创建data目录
cd /opt
mkdir data
chown -R dmdba:dinstall data/
su – dmdba
6、关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl status firewalld
四、本机主备集群配置
1、创建数据目录并赋权:
mkdir -p /opt/data/dmdw01
mkdir -p /opt/data/dmdw02
mkdir -p /opt/data/arch01
mkdir -p /opt/data/arch02
chown -R dmdba:dinstall /opt/data/

2、初始化主库实例 dmdw01(端口 5236)
su – dmdba
dminit path=/opt/data/dmdw01 db_name=dmdw instance_name=dmdw01 port_num=5236 sysdba_pwd=Zhangxinyu-0221 sysauditor_pwd=Zhangxinyu-0221
启动实例:
dmserver /opt/data/dmdw01/dmdw/dm.ini
SYSTEM IS READY后退出

3、初始化备库实例 dmdw02(端口 5237)
dminit path=/opt/data/dmdw02 db_name=dmdw instance_name=dmdw02 port_num=5237 sysdba_pwd=Zhangxinyu-0221 sysauditor_pwd=Zhangxinyu-0221
启动实例:
dmserver /opt/data/dmdw02/dmdw/dm.ini
SYSTEM IS READY后退出

创建备份目录并赋权:
su – root
mkdir -p /opt/dbfull01
chown -R dmdba:dinstall /opt/dbfull01
su – dmdba后进行:
使用dmrman工具进行主库备份:
dmrman
backup database '/opt/data/dmdw01/dmdw/dm.ini' backupset '/opt/dbfull01';
exit退出
使用dmrman工具进行备库还原
dmrman
restore database '/opt/data/dmdw02/dmdw/dm.ini' from backupset '/opt/dbfull01';
recover database '/opt/data/dmdw02/dmdw/dm.ini' from backupset '/opt/dbfull01';
recover database '/opt/data/dmdw02/dmdw/dm.ini' update db_magic;
exit退出

5、修改dmdw01和dmdw02的dm.ini
vi /opt/data/dmdw01/dmdw/dm.ini

6、主备机上都创建dmarch.ini
主库:vi /opt/data/dmdw01/dmdw/dmarch.ini,写入:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = dmdw02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/data/arch01
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
备库:vi /opt/data/dmdw02/dmdw/dmarch.ini,写入:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = dmdw01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/data/arch02
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200

7、主备机上都创建 dmmal.ini
注意:单节点主备必须使用真实网卡 IP(192.168.56.111),不能使用 127.0.0.1,否则 MAL 初始化会失败。
主库:vi /opt/data/dmdw01/dmdw/dmmal.ini
备库:vi /opt/data/dmdw02/dmdw/dmmal.ini
都写入:
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = dmdw01
MAL_HOST = 192.168.56.111
MAL_PORT = 61141
MAL_INST_HOST = 192.168.56.111
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = dmdw02
MAL_HOST = 192.168.56.111
MAL_PORT = 61142
MAL_INST_HOST = 192.168.56.111
MAL_INST_PORT = 5237
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142

8、主备机上都创建dmwatcher.ini
主库:vi /opt/data/dmdw01/dmdw/dmwatcher.ini后写入:
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453331
INST_INI = /opt/data/dmdw01/dmdw/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver
备库:vi /opt/data/dmdw02/dmdw/dmwatcher.ini后写入:
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453331
INST_INI = /opt/data/dmdw02/dmdw/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver


9、启动主备集群(分别开启多个终端执行以下命令)
(1)在终端1上启动主库为 mount 状态
dmserver /opt/data/dmdw01/dmdw/dm.ini mount

(2)在终端2上登录主库,设置 primary
disql sysdba/Zhangxinyu-0221@192.168.56.111:5236
SQL> sp_set_oguid(453331);
SQL> alter database primary;
SQL> exit

(3)在终端3上启动备库为 mount 状态
dmserver /opt/data/dmdw02/dmdw/dm.ini mount

(4)在终端4上登录备库,设置 standby
disql sysdba/Zhangxinyu-0221@192.168.56.111:5237
SQL> sp_set_oguid(453331);
SQL> alter database standby;
SQL> exit
(5)在终端5上启动主库守护进程
主库:dmwatcher /opt/data/dmdw01/dmdw/dmwatcher.ini

(6)在终端6上启动备库守护进程
备库:dmwatcher /opt/data/dmdw02/dmdw/dmwatcher.ini
(守护进程启动后,主备库会自动 open)
10、验证主备同步
连接主库:disql sysdba/Zhangxinyu-0221@192.168.56.111:5236
SQL> select * from v$instance;
应该显示 MODE = PRIMARY, STATUS = OPEN

连接备库:disql sysdba/Zhangxinyu-0221@192.168.56.111:5237
SQL> select * from v$instance;
应该显示 MODE = STANDBY, STATUS = OPEN

11、在主库上配置监视器
vi /opt/data/dmdw01/dmmonitor.ini后写入:
MON_DW_CONFIRM = 1
MON_LOG_PATH = /opt/data/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.56.111:52141
MON_DW_IP = 192.168.56.111:52142

12、注册主备库系统服务(可选)
先进入到root用户:cd /opt/dmdbms/script/root/
注册主库服务:
./dm_service_installer.sh -t dmserver -p dmdw01 -dm_ini /opt/data/dmdw01/dmdw/dm.ini
./dm_service_installer.sh -t dmwatcher -p dmdw01 -watcher_ini /opt/data/dmdw01/dmdw/dmwatcher.ini
注册备库服务:
./dm_service_installer.sh -t dmserver -p dmdw02 -dm_ini /opt/data/dmdw02/dmdw/dm.ini
./dm_service_installer.sh -t dmwatcher -p dmdw02 -watcher_ini /opt/data/dmdw02/dmdw/dmwatcher.ini
13、启动监视器
su – dmdba
dmmonitor /opt/data/dmdw01/dmmonitor.ini
show
可查看主备状态、OGUID、守护进程状态等信息。

五、单节点主备与双节点主备配置对比
本机主备与双机主备的核心差异在于故障隔离的层级不同:前者仅在数据库实例层面实现主备分离,两个实例共享同一台服务器的CPU、内存、磁盘及操作系统,因此只能应对数据库进程崩溃等软件级故障,一旦硬件损坏或系统宕机则整体失效;后者则在物理机器层面完全隔离,主备库分属独立服务器,各自拥有专属资源,既能处理软件故障,也能抵御单台机器断电、硬盘损坏、主板故障等硬件级风险,是真正具备容灾能力的生产级方案。

六、常见问题
1、备份时提示 “No space left on device”
磁盘空间不足,需要扩容虚拟机磁盘或者清理无用文件,当清理完后还是没用就需要扩容虚拟机磁盘,此处采用的方法是直接扩大现有磁盘:
(1)关闭dm111虚拟机(必须关机才能扩容)
(2)在虚拟硬盘页面直接拉大磁盘

(3)开启虚拟机dm111,查看当前分区
fdisk -l
lsblk

(4)扩大sda2分区
fdisk /dev/sda后依次输入:


结束后执行:
partprobe /dev/sda
pvresize /dev/sda2
lvextend -l +100%FREE /dev/mapper/klas-root
xfs_growfs /dev/mapper/klas-root
(5)df -h后可以看到扩容成功

2、systemctl 启动服务失败
检查是否已有手动启动的进程占用端口,如果有则需要先kill掉再启动。
ps -ef | grep -E "dmserver|dmwatcher"
kill -9 [进程]
3、备库在磁盘空间不足、扩大磁盘还原后启动失败,提示需要再次update db_magic
即在dmrman中执行recover database '备库路径' update db_magic;
达梦数据库 – 新一代大型通用关系型数据库 | 达梦在线服务平台




