业务不能停,数据不能丢——这是每一位DBA的底线。
本文将带你一步步完成达梦数据库单机不停机搭建实时备库的全过程,主库业务零影响,备库实时同步,高可用一步到位。
传统搭建备库往往需要停主库、拷数据、重配置,对业务影响大。而达梦数据库从版本 03134284393-20250324-265835-20151 开始,支持在线备份 + 实时归档的方式,在主库完全不停机的情况下,搭建出一套完整的实时备库。
本文基于真实环境配置,两台机器(A:主库,B:备库),所有命令均经过验证。跟着做,你也能轻松实现不停机搭建。
在动手前,先明确集群规划。以下是本次搭建使用的参数:
| 配置项 | A机器(主库) | B机器(备库) |
|---|---|---|
| 业务IP | 172.10.80.81 | 172.10.80.82 |
| 心跳IP(MAL) | 192.168.80.81 | 192.168.80.82 |
| 实例名 | DMSERVER | DMSERVER1 |
| 实例端口 | 15236 | 15236 |
| MAL端口 | 15336 | 15336 |
| MAL守护进程端口 | 15436 | 15436 |
| 守护进程端口 | 15536 | 15536 |
| OGUID | 45331234 | 45331234 |
| 守护组 | GDW_11 | GDW_11 |
| 安装目录 | /dmdba/dmdbms_1/ | /dmdba/dmdbms_1/ |
| 数据目录 | /dmdba/dmdata1/ | /dmdba/dmdata1/ |
| 归档目录 | /dmdba/dmdata1/DAMENG/arch | 同左 |
| 备份目录 | /dmdba/dmdata1/DAMENG/bak | 同左 |
| 归档上限 | 51200 MB | 51200 MB |
网络要求:业务IP和心跳IP需要互通,建议心跳使用独立网卡,避免业务流量干扰同步。
如果你的主库已经运行中,可以跳过“创建实例”,直接从修改参数开始。
# 初始化实例
/dmdba/dmdbms_1/bin/dminit PATH=/dmdba/dmdata1/ INSTANCE_NAME=DMSERVER \
PAGE_SIZE=32 LOG_SIZE=2048 PORT_NUM=15236 \
SYSDBA_PWD=Sysdba123 SYSAUDITOR_PWD=Sysdba123
# 注册系统服务(需root)
/scripts/root/dm_service_installer.sh -t dmserver -p DMSERVER \
-dm_ini /dmdba/dmdata1/DAMENG/dm.ini
# 启动数据库
DmServiceDMSERVER start
# 连接数据库
disql SYSDBA/Sysdba123@172.10.80.81:15236
执行以下SQL:
-- 开启归档(如已开启可跳过)
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmdba/dmdata1/DAMENG/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
ALTER DATABASE OPEN;
-- 调整dm.ini参数
SP_SET_PARA_VALUE (1,'DW_INACTIVE_INTERVAL',60);
SP_SET_PARA_VALUE (1,'ALTER_MODE_STATUS',0);
SP_SET_PARA_VALUE (1,'ENABLE_OFFLINE_TS',2);
创建 /dmdba/dmdata1/DAMENG/dmmal.ini,内容如下:
MAL_CHECK_INTERVAL = 10
MAL_CONN_FAIL_INTERVAL = 10
MAL_TEMP_PATH = /dmdba/dmdata1/malpath/
MAL_BUF_SIZE = 512
MAL_SYS_BUF_SIZE = 2048
MAL_COMPRESS_LEVEL = 0
[MAL_INST1]
MAL_INST_NAME = DMSERVER
MAL_HOST = 192.168.80.81
MAL_PORT = 15336
MAL_INST_HOST = 172.10.80.81
MAL_INST_PORT = 15236
MAL_DW_PORT = 15436
MAL_INST_DW_PORT = 15536
[MAL_INST2]
MAL_INST_NAME = DMSERVER1
MAL_HOST = 192.168.80.82
MAL_PORT = 15336
MAL_INST_HOST = 172.10.80.82
MAL_INST_PORT = 15236
MAL_DW_PORT = 15436
MAL_INST_DW_PORT = 15536
启用MAL:
SP_SET_PARA_VALUE (1,'MAL_INI',1);
-- 添加指向备库的实时归档
ALTER DATABASE ADD ARCHIVELOG 'DEST=DMSERVER1,TYPE=REALTIME';
-- 在线备份(关键步骤!备份期间主库正常读写)
BACKUP DATABASE BACKUPSET '/dmdba/dmdata1/DAMENG/bak/BACKUP_FILE';
创建 /dmdba/dmdata1/DAMENG/dmwatcher.ini:
[GDW_11]
DW_TYPE = GLOBAL
DW_MODE = MANUAL # 手动切换模式,生产环境可按需改为自动
DW_ERROR_TIME = 20
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 45331234
INST_INI = /dmdba/dmdata1/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dmdba/dmdbms_1/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD= 0
注册守护服务:
/scripts/root/dm_service_installer.sh -t dmwatcher -p Watcher \ -watcher_ini /dmdba/dmdata1/DAMENG/dmwatcher.ini
编辑 DmServiceDMSERVER,将 START_MODE 改为 mount:
vi /dmdba/dmdbms_1/bin/DmServiceDMSERVER
# 找到 START_MODE=mount
为什么要改成 mount?因为守护进程启动时会自动将实例 open,我们只需确保实例以 mount 方式被守护拉起即可。
/dmdba/dmdbms_1/bin/dminit PATH=/dmdba/dmdata1/ INSTANCE_NAME=DMSERVER1 \ PAGE_SIZE=32 LOG_SIZE=2048 PORT_NUM=15236 \ SYSDBA_PWD=Sysdba123 SYSAUDITOR_PWD=Sysdba123
DmServiceDMSERVER1 start disql SYSDBA/Sysdba123@172.10.80.82:15236
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmdba/dmdata1/DAMENG/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
ALTER DATABASE OPEN;
SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SP_SET_PARA_VALUE (2,'MAL_INI',1);
修改完成后 停止备库实例(后面会用备份恢复):
DmServiceDMSERVER1 stop
备库的实时归档目标应指向主库。编辑 /dmdba/dmdata1/DAMENG/dmarch.ini:
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdba/dmdata1/DAMENG/arch/
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
ARCH_FLUSH_BUF_SIZE= 2
ARCH_HANG_FLAG = 1
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = DMSERVER # 指向主库实例名
# 拷贝 dmmal.ini 和 dmwatcher.ini(两台机器配置相同)
scp /dmdba/dmdata1/DAMENG/dmmal.ini \
/dmdba/dmdata1/DAMENG/dmwatcher.ini \
dmdba@192.168.80.82:/dmdba/dmdata1/DAMENG/
# 拷贝在线备份文件
scp -r /dmdba/dmdata1/DAMENG/bak/BACKUP_FILE \
dmdba@192.168.80.82:/dmdba/dmdata1/DAMENG/bak/
# 注册 dmserver,指定以 mount 方式启动
/scripts/root/dm_service_installer.sh -t dmserver -p DMSERVER1 \
-dm_ini /dmdba/dmdata1/DAMENG/dm.ini -m mount
# 注册守护进程
/scripts/root/dm_service_installer.sh -t dmwatcher -p Watcher \
-watcher_ini /dmdba/dmdata1/DAMENG/dmwatcher.ini
# 还原
dmrman CTLSTMT="RESTORE DATABASE '/dmdba/dmdata1/DAMENG/dm.ini' FROM BACKUPSET '/dmdba/dmdata1/DAMENG/bak/BACKUP_FILE'"
# 恢复
dmrman CTLSTMT="RECOVER DATABASE '/dmdba/dmdata1/DAMENG/dm.ini' FROM BACKUPSET '/dmdba/dmdata1/DAMENG/bak/BACKUP_FILE'"
# 更新DB_MAGIC
dmrman CTLSTMT="RECOVER DATABASE '/dmdba/dmdata1/DAMENG/dm.ini' UPDATE DB_MAGIC"
监视器用来查看集群状态、执行切换。在任意一台机器(或第三方)上创建 dmmonitor.ini:
MON_DW_CONFIRM = 0 # 非确认监视器,只做观察
MON_LOG_PATH = /dmdba/dmdbms_1/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 512
MON_LOG_SPACE_LIMIT = 2048
[GDW_11]
MON_INST_OGUID = 45331234
MON_DW_IP = 192.168.80.81:15436
MON_DW_IP = 192.168.80.82:15436
主库(A机器):
disql SYSDBA/Sysdba123@172.10.80.81:15236
SP_SET_OGUID(45331234);
ALTER DATABASE PRIMARY FORCE;
备库(B机器):
# 启动备库实例
DmServiceDMSERVER1 start
disql SYSDBA/Sysdba123@172.10.80.82:15236
SP_SET_OGUID(45331234);
ALTER DATABASE STANDBY;
DmWatcherServiceWatcher start
dmmonitor /dmdba/dmdbms_1/bin/dmmonitor.ini
在监视器界面输入 show,如果看到主库状态为 OPEN,备库状态为 STANDBY,并且归档状态为 VALID,恭喜你——实时备库搭建成功!
启动集群:
先启动 A、B 两机的守护进程(会自动拉起实例)
DmWatcherServiceWatcher start
停止集群(建议顺序):
DmWatcherServiceWatcher stop # 两台
DmServiceDMSERVER stop # 主库
DmServiceDMSERVER1 stop # 备库
03134284393-20250324-265835-20151 及以上版本,才支持不停机搭建。搭建实时备库,不必再停机维护。希望这篇指南能帮你顺利完成达梦数据库的高可用部署。如果有任何疑问,欢迎在评论区留言交流。
原文文档基于达梦数据库官方最佳实践整理,经实际环境验证。
文章
阅读量
获赞
