完成2节点数据守护集群的搭建,要求如下:
1)完成实时主备集群的部署,并测试建表和插入数据备机是否能及时同步,并可查询到数据。
2)制造主机故障,测试备机可接管并持续提供服务。
3)恢复故障主机,将故障主机加入集群。
4)手动切换主备集群,恢复原主备集群的位置。
由于前一篇已经详细介绍了虚拟机安装有可能的故障,这里默认已经在CentOS 7上安装好了DM8
mkdir -p /data/dmdata1 /data/dmdata2 /data/dmarch1 /data/dmarch2 /data/dmbackup /data/dmlog chown -R dmdba:dinstall /data
cd /home/dmdba/dmdbms/bin
# 主库
./dminit PATH=/data/dmdata1 DB_NAME=DAMENG INSTANCE_NAME=GRP1_RT_01 \
PORT_NUM=5236 PAGE_SIZE=32 LOG_SIZE=2048 \
CASE_SENSITIVE=1 CHARSET=1 \
SYSDBA_PWD=Admin2026 SYSAUDITOR_PWD=Admin2026
# 备库(端口5237)
./dminit PATH=/data/dmdata2 DB_NAME=DAMENG INSTANCE_NAME=GRP1_RT_02 \
PORT_NUM=5237 PAGE_SIZE=32 LOG_SIZE=2048 \
CASE_SENSITIVE=1 CHARSET=1 \
SYSDBA_PWD=Admin2026 SYSAUDITOR_PWD=Admin2026
踩坑点:达梦新版要求必须指定 SYSDBA_PWD 和 SYSAUDITOR_PWD,且密码需含大小写字母和数字(如 Admin2026),否则初始化失败。
运行结果如下:
先正常启动主库一次(让数据库初始化内部结构),然后关闭:
./dmserver /data/dmdata1/DAMENG/dm.ini # 正常启动,Ctrl+C关闭
脱机备份(终端任意):
./dmrman
RMAN> backup database '/data/dmdata1/DAMENG/dm.ini' full backupset '/data/dmbackup/full_bak' compressed level 1;
RMAN> exit;
备库还原(终端任意):
./dmrman
RMAN> restore database '/data/dmdata2/DAMENG/dm.ini' from backupset '/data/dmbackup/full_bak';
RMAN> recover database '/data/dmdata2/DAMENG/dm.ini' from backupset '/data/dmbackup/full_bak';
RMAN> recover database '/data/dmdata2/DAMENG/dm.ini' update db_magic;
RMAN> exit;
踩坑点:若初始化后从未正常启动过,dmrman 备份会报错 RMAN[-8029] 服务器未启动初始化,必须先正常启动一次再关闭。
主库 /data/dmdata1/DAMENG/dm.ini(修改关键参数):
执行命令:
vi /data/dmdata1/DAMENG/dm.ini
之后会进入一长段内容,不用一个一个找,可以把光标移动到最下面一行,输入斜杠/和需要查询的关键词,例如,我们需要查询INSTANCE_NAME,就需要在最后一行输入:
/INSTANCE_NAME
终端就会自动跳到INSTANCE_NAME的位置,这个时候按键盘上的i,可以进入insert模式,没次修改完按ESC按键退出,进行下一个参数的搜索,等所有的参数修改完,在最后一行输入:wq进行保存和退出
主库参数对应下列:
INSTANCE_NAME = GRP1_RT_01 PORT_NUM = 5236 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1
备库 /data/dmdata2/DAMENG/dm.ini:
命令:
vi /data/dmdata2/DAMENG/dm.ini
备库参数对应下列:
INSTANCE_NAME = GRP1_RT_02 PORT_NUM = 5237 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1
接下来是六个文件的创建和输入内容,都是使用vi + 地址,输入i进入insert模式,然后粘贴内容,按ESC退出,按:wq保存
主库 /data/dmdata1/DAMENG/dmarch.ini:
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/dmarch1
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 51200
备库 /data/dmdata2/DAMENG/dmarch.ini(ARCH_DEST 指向主库):
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/dmarch2
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 51200
主库与备库 dmmal.ini 内容完全相同(分别放到各自的 DAMENG 目录):
MAL_CHECK_INTERVAL = 10
MAL_CONN_FAIL_INTERVAL = 10
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.200.18
MAL_PORT = 61141
MAL_INST_HOST = 192.168.200.18
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.201.90
MAL_PORT = 61142
MAL_INST_HOST = 192.168.201.90
MAL_INST_PORT = 5237
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
备库可以直接用cp命令复制复制
主库 /data/dmdata1/DAMENG/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 = /data/dmdata1/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
备库 /data/dmdata2/DAMENG/dmwatcher.ini(仅 INST_INI 路径不同):
INST_INI = /data/dmdata2/DAMENG/dm.ini
监视器配置文件 /data/dmmonitor.ini(放在任意位置,此处为 /data/dmmonitor.ini):
MON_DW_CONFIRM = 1
MON_LOG_PATH = /data/dmlog
MON_LOG_INTERVAL = 60
[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.200.18:52141
MON_DW_IP = 192.168.201.90:52142
踩坑点:dmmal.ini 中 MAL_INST_HOST 必须与 dm.ini 中 LISTEN_IP(若配置)一致,本实验未配置 LISTEN_IP,默认监听所有IP。
给大家看一下这是我最后执行完的结果,虽然终端多,但还是比较方便的,从上到下从左到右依次是:
1、2、3、
4、5、6
终端1:
cd /home/dmdba/dmdbms/bin
./dmserver /data/dmdata1/DAMENG/dm.ini mount
终端2:
./dmserver /data/dmdata2/DAMENG/dm.ini mount
# 主库
./disql SYSDBA/Admin2026@localhost:5236
执行
SP_SET_OGUID(453331);
ALTER DATABASE PRIMARY;
EXIT;
# 备库
./disql SYSDBA/Admin2026@localhost:5237
执行:
SP_SET_OGUID(453331);
ALTER DATABASE STANDBY;
EXIT;
踩坑点:必须在启动守护进程前设置模式,否则守护进程会阻止修改,报错 [-720] Dmwatcher is active。
终端3:
./dmwatcher /data/dmdata1/DAMENG/dmwatcher.ini
显示 DMWATCHER[4.0] IS READY
终端4:
./dmwatcher /data/dmdata2/DAMENG/dmwatcher.ini
显示 DMWATCHER[4.0] IS READY
./dmmonitor /data/dmmonitor.ini
在监视器命令行输入 show,观察状态,等待两实例均为 OPEN,主库 PRIMARY,备库 STANDBY,且 FLSN/CLSN 一致。
主库(5236):
CREATE TABLE test_sync (id INT, name VARCHAR(50));
INSERT INTO test_sync VALUES (1, 'sync_test');
COMMIT;
SELECT * FROM test_sync;
备库(5237):
SELECT * FROM test_sync;
应返回相同记录。
验证通过条件:备库能查询到主库插入的数据。
如图所示运行结果:
这样任务1就算是做完了
集群处于任务1结束时的正常状态(主 PRIMARY,备 STANDBY,均 OPEN)。
可以看终端5监视器来确认
这里写终端3不要手动停止是因为我使用ctrl+C之后,终端3会卡死
在终端1按 Ctrl+C 停止主库实例(或 kill -9 <主库PID>)。
严禁停止终端3的主库守护进程,让它自动检测故障。
在终端5(监视器)等待约10~15秒,输入 show,应看到:
连接新主库(原备库,端口5237):
./disql SYSDBA/Admin2026@localhost:5237
执行:
INSERT INTO test_sync VALUES (2, 'after_failover');
COMMIT;
SELECT * FROM test_sync;
应返回两条记录。
验证通过条件:插入成功,确认备机已接管为主库。
实际运行结果如图:
当前主库为 GRP1_RT_02(原备库),故障主机为 GRP1_RT_01(原主库)已停止。
pkill -9 -f "dmserver.*GRP1_RT_01"
pkill -9 -f "dmwatcher.*GRP1_RT_01"
cd /home/dmdba/dmdbms/bin
./dmserver /data/dmdata1/DAMENG/dm.ini mount
等待 SYSTEM IS READY.
./dmwatcher /data/dmdata1/DAMENG/dmwatcher.ini
在监视器中输入 show,应看到:
验证通过条件:原主库成功加入,数据与主库一致。
运行结果如下:
当前主库为 GRP1_RT_02,备库为 GRP1_RT_01,两者数据同步。
查找 GRP1_RT_02 实例PID(终端任意):
ps -ef | grep dmserver | grep GRP1_RT_02
杀死实例:
kill -9 <PID>
查找并杀死守护进程:
ps -ef | grep dmwatcher | grep GRP1_RT_02
kill -9 <PID>
./disql SYSDBA/Admin2026@localhost:5236
执行:
ALTER DATABASE PRIMARY;
EXIT;
./dmwatcher /data/dmdata1/DAMENG/dmwatcher.ini
启动实例(终端2):
./dmserver /data/dmdata2/DAMENG/dm.ini mount
连接并设置为 STANDBY(终端6):
./disql SYSDBA/Admin2026@localhost:5237
ALTER DATABASE STANDBY;
EXIT;
启动守护进程(终端4):
./dmwatcher /data/dmdata2/DAMENG/dmwatcher.ini
退出当前监视器,重新启动:
./dmmonitor /data/dmmonitor.ini
输入 show,确认:
连接主库(5236)插入第三条数据:
INSERT INTO test_sync VALUES (3, 'switchback_test');
COMMIT;
SELECT * FROM test_sync;
连接备库(5237)查询,应返回三条记录。
验证通过条件:主备角色完全恢复,数据同步无误。
然后每个任务我其实都有过失败,有时候会陷入死胡同,我会选择从每个任务的开始状态重新做,有耐心一点就成功了
文章
阅读量
获赞
