注册
MPP主备集群搭建
技术分享/ 文章详情 /

MPP主备集群搭建

Kira 2026/08/07 105 0 0

配置MPP主备

1. 配置环境

服务器 数据库实例 初始角色
A GRP1_MPP_EP01 GRP1 主库、MPP 0 号节点
A GRP2_MPP_EP22 GRP2 备库
B GRP2_MPP_EP02 GRP2 主库、MPP 1 号节点
B GRP1_MPP_EP11 GRP1 备库
C dmmonitor 单实例确认监视器
用途 主实例 备实例
数据库服务端口 PORT_NUM 5236 5237
MAL 通信端口 MAL_PORT 5337 5338
实例监听守护端口 MAL_INST_DW_PORT 5243 5244
守护进程通信端口 MAL_DW_PORT 5253 5254

2. 初始化服务器 A 的 EP01 和 EP22

2.1 创建目录

在服务器 A 执行:

mkdir -p /data/SLQ/dmdata/EP01 mkdir -p /data/SLQ/dmdata/EP22 mkdir -p /data/SLQ/dmdata/backup mkdir -p /data/SLQ/dmdata/log mkdir -p /data/SLQ/dmdata/shared

2.2 A 机器初始化 GRP1 主库 EP01

./dminit path=/data/SLQ/dmdata/EP01 SYSDBA_PWD=Dm123456 SYSAUDITOR_PWD=Dm123456

创建归档目录:

mkdir -p /data/SLQ/dmdata/EP01/DAMENG/arch

创建:

vi /data/SLQ/dmdata/EP01/DAMENG/dmarch.ini

写入:

[ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/SLQ/dmdata/EP01/DAMENG/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

2.3 A 机器初始化 GRP2 备库目标 EP22

./dminit path=/data/SLQ/dmdata/EP22 SYSDBA_PWD=Dm123456 SYSAUDITOR_PWD=Dm123456

创建归档目录:

mkdir -p /data/SLQ/dmdata/EP22/DAMENG/arch

创建:

vi /data/SLQ/dmdata/EP22/DAMENG/dmarch.ini

写入:

[ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/SLQ/dmdata/EP22/DAMENG/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

3. 初始化服务器 B 的 EP02 和 EP11

3.1 创建目录

在服务器 B 执行:

mkdir -p /data/SLQ/dmdata/EP02 mkdir -p /data/SLQ/dmdata/EP11 mkdir -p /data/SLQ/dmdata/backup mkdir -p /data/SLQ/dmdata/log mkdir -p /data/SLQ/dmdata/shared

3.2 初始化 GRP2 主库 EP02

./dminit path=/data/SLQ/dmdata/EP02 SYSDBA_PWD=Dm123456 SYSAUDITOR_PWD=Dm123456

创建本地归档:

mkdir -p /data/SLQ/dmdata/EP02/DAMENG/arch vi /data/SLQ/dmdata/EP02/DAMENG/dmarch.ini

写入:

[ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/SLQ/dmdata/EP02/DAMENG/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

3.3 初始化 GRP1 备库目标 EP11

./dminit path=/data/SLQ/dmdata/EP11 SYSDBA_PWD=Dm123456 SYSAUDITOR_PWD=Dm123456

创建本地归档:

mkdir -p /data/SLQ/dmdata/EP11/DAMENG/arch vi /data/SLQ/dmdata/EP11/DAMENG/dmarch.ini

写入:

[ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/SLQ/dmdata/EP11/DAMENG/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

4. 一次性配置四个实例的 dm.ini

在四个实例初始化完成后、首次启动前,一次性完成本节配置。

只修改下面列出的参数,其他初始化参数保持不变。

4.1 A:EP01

vi /data/SLQ/dmdata/EP01/DAMENG/dm.ini
INSTANCE_NAME = GRP1_MPP_EP01 PORT_NUM = 5236 DW_INACTIVE_INTERVAL = 60 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1 MPP_INI = 1 RLOG_SEND_APPLY_MON = 64

4.2 A:EP22

vi /data/SLQ/dmdata/EP22/DAMENG/dm.ini
INSTANCE_NAME = GRP2_MPP_EP22 PORT_NUM = 5237 DW_INACTIVE_INTERVAL = 60 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1 MPP_INI = 1 RLOG_SEND_APPLY_MON = 64

4.3 B:EP02

vi /data/SLQ/dmdata/EP02/DAMENG/dm.ini
INSTANCE_NAME = GRP2_MPP_EP02 PORT_NUM = 5236 DW_INACTIVE_INTERVAL = 60 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1 MPP_INI = 1 RLOG_SEND_APPLY_MON = 64

4.4 B:EP11

vi /data/SLQ/dmdata/EP11/DAMENG/dm.ini
INSTANCE_NAME = GRP1_MPP_EP11 PORT_NUM = 5237 DW_INACTIVE_INTERVAL = 60 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1 MPP_INI = 1 RLOG_SEND_APPLY_MON = 64

四个实例均启用 MAL、归档和 MPP,并设置 ALTER_MODE_STATUS=0ENABLE_OFFLINE_TS=2

5. 首次启动并关闭四个实例

5.1 服务器 A:首次启动 EP01

nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP01/DAMENG/dm.ini > /data/SLQ/dmdata/log/EP01_first_start.log 2>&1 &

等待数据库能够连接:

/data/SLQ/dmdbms/bin/disql SYSDBA/Dm123456@127.0.0.1:5236

进入 DIsql 后:

SHUTDOWN IMMEDIATE; EXIT;

5.2 服务器 A:首次启动 EP22

nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP22/DAMENG/dm.ini > /data/SLQ/dmdata/log/EP22_first_start.log 2>&1 &

连接:

/data/SLQ/dmdbms/bin/disql SYSDBA/Dm123456@127.0.0.1:5237

执行:

SHUTDOWN IMMEDIATE; EXIT;

5.3 服务器 B:首次启动 EP02

nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP02/DAMENG/dm.ini > /data/SLQ/dmdata/log/EP02_first_start.log 2>&1 &

连接:

/data/SLQ/dmdbms/bin/disql SYSDBA/DMdba_123@127.0.0.1:6236

执行:

SHUTDOWN IMMEDIATE; EXIT;

5.4 服务器 B:首次启动 EP11

nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP11/DAMENG/dm.ini > /data/SLQ/dmdata/log/EP11_first_start.log 2>&1 &

连接:

/data/SLQ/dmdbms/bin/disql SYSDBA/DMdba_123@127.0.0.1:6237

执行:

SHUTDOWN IMMEDIATE; EXIT;

确认四个实例均已停止:

ps -ef | grep '/data/SLQ/dmdbms/bin/dmserver' | grep -v grep

此时应没有上述四个实例。

6. 对两个主库进行脱机备份

数据守护不能将两个分别初始化的数据库直接组成主备,也不能直接复制数据文件。备库必须通过对应主库的备份集还原,确保永久魔数、密钥等信息一致。

6.1 服务器 A:备份 EP01

确认备份集路径不存在:

ls -ld /data/SLQ/dmdata/backup/EP01_FULL

如果提示不存在,则执行:

/data/SLQ/dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '/data/SLQ/dmdata/EP01/DAMENG/dm.ini' FULL BACKUPSET '/data/SLQ/dmdata/backup/EP01_FULL'"
/data/SLQ/dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '/data/SLQ/dmdata/EP01/DAMENG/dm.ini' FULL TO EP01_FULL BACKUPSET '/data/SLQ/dmdata/backup/EP01_FULL'"

6.2 服务器 B:备份 EP02

ls -ld /data/SLQ/dmdata/backup/EP02_FULL

确认不存在后执行:

/data/SLQ/dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '/data/SLQ/dmdata/EP02/DAMENG/dm.ini' FULL TO EP02_FULL BACKUPSET '/data/SLQ/dmdata/backup/EP02_FULL'"

7. 交叉复制备份集

以下命令将 SSH 的 known_hosts 文件也放在 /data/SLQ 下。

7.1 A 将 EP01 备份发给 B

scp命令格式:

scp -r 文件名 用户名@ip:目的路径 例: scp -r EP01_FULL dmdba@13.8.2.57:/data/SLQ/dmdata/backup/

在 A 执行:

scp -r EP01_FULL dmdba@13.8.2.57:/data/SLQ/dmdata/backup/

7.2 B 将 EP02 备份发给 A

在 B 执行:

scp -r EP02_FULL dmdba@13.8.2.56:/data/SLQ/dmdata/backup/

确认:

A 上应有:

ls -l /data/SLQ/dmdata/backup/EP02_FULL

B 上应有:

ls -l /data/SLQ/dmdata/backup/EP01_FULL

8. 在两个备库目标上执行还原

8.1 服务器 B:将 EP01 的备份还原到 EP11(EP01对应备库)的数据库下

确认 EP11 没有运行:

ps -ef | grep '/data/SLQ/dmdata/EP11/DAMENG/dm.ini' | grep -v grep

执行还原:

./dmrman RESTORE DATABASE '/data/SLQ/dmdata/EP11/DAMENG/dm.ini' FROM BACKUPSET '/data/SLQ/dmdata/backup/EP01_FULL';

更新数据库魔数:

RECOVER DATABASE '/data/SLQ/dmdata/EP11/DAMENG/dm.ini' UPDATE DB_MAGIC

8.2 服务器 A:将 EP02 的备份还原到 EP22(EP02对应备库)的数据库下

确认 EP22 没有运行:

ps -ef | grep '/data/SLQ/dmdata/EP22/DAMENG/dm.ini' | grep -v grep

执行:

RESTORE DATABASE '/data/SLQ/dmdata/EP22/DAMENG/dm.ini' FROM BACKUPSET '/data/SLQ/dmdata/backup/EP02_FULL';

更新数据库魔数:

RECOVER DATABASE '/data/SLQ/dmdata/EP22/DAMENG/dm.ini' UPDATE DB_MAGIC;

脱机备份未产生新的 Redo,因此按手册流程不需要执行 RECOVER ... FOR STANDBY,只需 Restore 后更新 DB_MAGIC。

9. 配置完全一致的 dmmal.ini

四个实例的 dmmal.ini 内容必须完全一致。手册要求 MAL_HOST 使用内部通信 IP;由于这里按单网卡实验配置,MAL_HOSTMAL_INST_HOST 使用同一个服务器 IP。若实际有双网卡,应把 MAL_HOST 换成内部 IP,把 MAL_INST_HOST 换成业务 IP。

先在 A 的 EP01 创建:

vi /data/SLQ/dmdata/EP01/DAMENG/dmmal.ini

写入,

MAL_CHECK_INTERVAL = 5 MAL_CONN_FAIL_INTERVAL = 5 [MAL_INST1] MAL_INST_NAME = GRP1_MPP_EP01 MAL_HOST = 13.8.2.56 MAL_PORT = 5337 MAL_INST_HOST = 13.8.2.56 MAL_INST_PORT = 5236 MAL_DW_PORT = 5253 MAL_INST_DW_PORT = 5243 [MAL_INST2] MAL_INST_NAME = GRP2_MPP_EP02 MAL_HOST = 13.8.2.57 MAL_PORT = 5337 MAL_INST_HOST = 13.8.2.57 MAL_INST_PORT = 5236 MAL_DW_PORT = 5253 MAL_INST_DW_PORT = 5243 [MAL_INST3] MAL_INST_NAME = GRP1_MPP_EP11 MAL_HOST = 13.8.2.57 MAL_PORT = 5338 MAL_INST_HOST = 13.8.2.57 MAL_INST_PORT = 5237 MAL_DW_PORT = 5254 MAL_INST_DW_PORT = 5244 [MAL_INST4] MAL_INST_NAME = GRP2_MPP_EP22 MAL_HOST = 13.8.2.56 MAL_PORT = 5338 MAL_INST_HOST = 13.8.2.56 MAL_INST_PORT = 5237 MAL_DW_PORT = 5254 MAL_INST_DW_PORT = 5244

复制到 A 的 EP22:

cp -f /data/SLQ/dmdata/EP01/DAMENG/dmmal.ini /data/SLQ/dmdata/EP22/DAMENG/dmmal.ini

将同一文件复制到 B:

scp -r 文件名 用户名@ip:目的路径 例: scp -r /data/SLQ/dmdata/EP01/DAMENG/dmmal.ini dmdba@13.8.2.57:/data/SLQ/dmdata/shared/dmmal.ini

在 B 执行:

cp -f /data/SLQ/dmdata/shared/dmmal.ini /data/SLQ/dmdata/EP02/DAMENG/dmmal.ini cp -f /data/SLQ/dmdata/shared/dmmal.ini /data/SLQ/dmdata/EP11/DAMENG/dmmal.ini

10. 配置四个实例的 dmarch.ini

每个组必须双向配置实时归档,因为发生主备切换后,原备库可能成为新主库,需要把日志反向发送给原主库。

10.1 A:EP01 指向 B 的 EP11

编辑:

vi /data/SLQ/dmdata/EP01/DAMENG/dmarch.ini

写入:

[ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = GRP1_MPP_EP11 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/SLQ/dmdata/EP01/DAMENG/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

做到这里。。。

10.2 B:EP11 反向指向 A 的 EP01

编辑:

vi /data/SLQ/dmdata/EP11/DAMENG/dmarch.ini

写入:

[ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = GRP1_MPP_EP01 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/SLQ/dmdata/EP11/DAMENG/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

10.3 B:EP02 指向 A 的 EP22

编辑:

vi /data/SLQ/dmdata/EP02/DAMENG/dmarch.ini

写入:

[ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = GRP2_MPP_EP22 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/SLQ/dmdata/EP02/DAMENG/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

10.4 A:EP22 反向指向 B 的 EP02

编辑:

vi /data/SLQ/dmdata/EP22/DAMENG/dmarch.ini

写入:

[ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = GRP2_MPP_EP02 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /data/SLQ/dmdata/EP22/DAMENG/arch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 0

重新确认归档目录均存在:

mkdir -p /data/SLQ/dmdata/EP01/DAMENG/arch mkdir -p /data/SLQ/dmdata/EP22/DAMENG/arch

B 上:

mkdir -p /data/SLQ/dmdata/EP02/DAMENG/arch mkdir -p /data/SLQ/dmdata/EP11/DAMENG/arch

主库归档目标分别指向对应备库,备库归档目标反向指向原主库。

11. 生成唯一的 dmmpp.ctl

dmmpp.ctl 必须由同一份文本配置生成,然后原样复制到四个实例,不能在四个实例上分别生成不同文件。

11.1 在 A 上创建 dmmpp.ini

vi /data/SLQ/dmdata/shared/dmmpp.ini

写入:

[service_name1] mpp_seq_no = 0 mpp_inst_name = GRP1_MPP_EP01 [service_name2] mpp_seq_no = 1 mpp_inst_name = GRP2_MPP_EP02

11.2 转换成二进制 dmmpp.ctl

/data/SLQ/dmdbms/bin/dmctlcvt TYPE=2 SRC=/data/SLQ/dmdata/shared/dmmpp.ini DEST=/data/SLQ/dmdata/shared/dmmpp.ctl
./dmctlcvt TYPE=2 SRC=/data/SLQ/dmdata/shared/dmmpp.ini DEST=/data/SLQ/dmdata/shared/dmmpp.ctl

image.png

确认生成:

ls -l /data/SLQ/dmdata/shared/dmmpp.ctl

11.3 复制到 A 的两个实例

cp -f /data/SLQ/dmdata/shared/dmmpp.ctl /data/SLQ/dmdata/EP01/DAMENG/dmmpp.ctl cp -f /data/SLQ/dmdata/shared/dmmpp.ctl /data/SLQ/dmdata/EP22/DAMENG/dmmpp.ctl

11.4 复制到 B

在 A 执行:

scp /data/SLQ/dmdata/shared/dmmpp.ctl dmdba@13.8.2.57:/data/SLQ/dmdata/shared/dmmpp.ctl

scp命令格式:

scp -r 文件名 用户名@ip:目的路径 例: scp -r EP01_FULL dmdba@13.8.2.57:/data/SLQ/dmdata/backup/

在 B 执行:

cp -f /data/SLQ/dmdata/shared/dmmpp.ctl /data/SLQ/dmdata/EP02/DAMENG/dmmpp.ctl cp -f /data/SLQ/dmdata/shared/dmmpp.ctl /data/SLQ/dmdata/EP11/DAMENG/dmmpp.ctl

通过 dmctlcvt TYPE=2dmmpp.ini 转换为 dmmpp.ctl,并要求将同一个控制文件复制到其余主库和备库。

11.5 检查文件一致性

A:

sha256sum /data/SLQ/dmdata/EP01/DAMENG/dmmpp.ctl /data/SLQ/dmdata/EP22/DAMENG/dmmpp.ctl

B:

sha256sum /data/SLQ/dmdata/EP02/DAMENG/dmmpp.ctl /data/SLQ/dmdata/EP11/DAMENG/dmmpp.ctl

四个哈希值必须完全相同。


12. 配置服务器 A 的 dmwatcher.ini

A 上一个守护进程同时管理本机两个不同守护组。

创建:

vi /data/SLQ/dmdata/dmwatcher.ini

写入:

[GRP1] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 45330 INST_INI = /data/SLQ/dmdata/EP01/DAMENG/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /data/SLQ/dmdbms/bin/dmserver RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0 [GRP2] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 45331 INST_INI = /data/SLQ/dmdata/EP22/DAMENG/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /data/SLQ/dmdbms/bin/dmserver RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0

13. 配置服务器 B 的 dmwatcher.ini

创建:

vi /data/SLQ/dmdata/dmwatcher.ini

写入:

[GRP1] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 45330 INST_INI = /data/SLQ/dmdata/EP11/DAMENG/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /data/SLQ/dmdbms/bin/dmserver RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0 [GRP2] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 45331 INST_INI = /data/SLQ/dmdata/EP02/DAMENG/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /data/SLQ/dmdbms/bin/dmserver RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0

在同一台机器部署不同组的两个实例时,可以只启动一个 dmwatcher,同时守护两个实例。


14. 配置单实例服务器 C 的确认监视器

由于 DW_MODE=AUTO,必须配置确认监视器。

在 C 创建目录:

mkdir -p /data/SLQ/dmdata/monitor/log

创建:

vi /data/SLQ/dmdata/monitor/dmmonitor.ini

写入,将 IP 替换为真实 IP:

MON_DW_CONFIRM = 1 MON_LOG_PATH = /data/SLQ/dmdata/monitor/log MON_LOG_INTERVAL = 60 MON_LOG_FILE_SIZE = 32 MON_LOG_SPACE_LIMIT = 0 [GRP1] MON_INST_OGUID = 45330 MON_DW_IP = 13.8.2.56:5253 MON_DW_IP = 13.8.2.57:5254 [GRP2] MON_INST_OGUID = 45331 MON_DW_IP = 13.8.2.57:5253 MON_DW_IP = 13.8.2.56:5254

对应关系必须是:

GRP1:
A 上 EP01 的 MAL_DW_PORT = 5253
B 上 EP11 的 MAL_DW_PORT = 5254

GRP2:
B 上 EP02 的 MAL_DW_PORT = 5253
A 上 EP22 的 MAL_DW_PORT = 5254

自动切换模式必须有确认监视器,MON_DW_IP 要与相应实例的 MAL_HOST:MAL_DW_PORT 一致。


15. 四个数据库全部以 Mount 方式启动

必须先启动四个数据库,保持 Mount,不要手工 Open。

手册强调,配置守护时必须使用 Mount 启动,否则可能生成新的 Redo 日志,破坏主备数据一致性;最终由守护进程自动 Open。

以 Mount 方式启动主库。

./dmserver /data/SLQ/dmdata/EP01/DAMENG/dm.ini mount
nohup ./dmserver /data/SLQ/dmdata/EP01/DAMENG/dm.ini mount > /data/SLQ/dmdata/log/EP01_mount.log 2>&1 &

15.1 A 启动 EP01

nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP01/DAMENG/dm.ini mount > /data/SLQ/dmdata/log/EP01_mount.log 2>&1 &

15.2 A 启动 EP22

nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP22/DAMENG/dm.ini mount > /data/SLQ/dmdata/log/EP22_mount.log 2>&1 &

15.3 B 启动 EP02

nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP02/DAMENG/dm.ini mount > /data/SLQ/dmdata/log/EP02_mount.log 2>&1 &

15.4 B 启动 EP11

nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP11/DAMENG/dm.ini mount > /data/SLQ/dmdata/log/EP11_mount.log 2>&1 &

确认端口已监听。

A:

ss -lnt | grep -E ':(5236|5237)\b'

B:

ss -lnt | grep -E ':(5236|5237)\b'

16. 设置 OGUID 和数据库模式

16.1 A:设置 EP01 为 GRP1 主库

连接:

./disql SYSDBA/Dm123456@:5236

执行:

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SP_SET_OGUID(45330); ALTER DATABASE PRIMARY; SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); EXIT;

16.2 B:设置 EP11 为 GRP1 备库

连接:

./disql SYSDBA/Dm123456@:5237

执行:

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SP_SET_OGUID(45330); ALTER DATABASE STANDBY; SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); EXIT;

16.3 B:设置 EP02 为 GRP2 主库

连接:

./disql SYSDBA/Dm123456@:5236

执行:

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SP_SET_OGUID(45331); ALTER DATABASE PRIMARY; SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); EXIT;

16.4 A:设置 EP22 为 GRP2 备库

连接:

./disql SYSDBA/Dm123456@:5237

执行:

SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SP_SET_OGUID(45331); ALTER DATABASE STANDBY; SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); EXIT;

先临时打开 ALTER_MODE_STATUS,设置 OGUID 和角色,再重新关闭该参数。

不要执行:

ALTER DATABASE OPEN;

此时四个实例应继续保持 Mount。


17. 启动 A、B 的 dmwatcher

建议先启动 A,再启动 B,间隔几秒即可。

17.1 A 启动守护进程

nohup /data/SLQ/dmdbms/bin/dmwatcher /data/SLQ/dmdata/dmwatcher.ini > /data/SLQ/dmdata/log/dmwatcher_A.log 2>&1 &
./dmwatcher /data/SLQ/dmdata/dmwatcher.ini

查看日志:

tail -f /data/SLQ/dmdata/log/dmwatcher_A.log

17.2 B 启动守护进程

nohup /data/SLQ/dmdbms/bin/dmwatcher /data/SLQ/dmdata/dmwatcher.ini > /data/SLQ/dmdata/log/dmwatcher_B.log 2>&1 &

查看:

tail -f /data/SLQ/dmdata/log/dmwatcher_B.log

启动后,守护进程先处于 Startup。它们互相收到状态信息后,会判断主备关系,并把四个数据库自动 Open。

等待约 10~30 秒。


18. 启动 C 的确认监视器

在服务器 C 前台执行:

/data/SLQ/dmdbms/bin/dmmonitor /data/SLQ/dmdata/monitor/dmmonitor.ini

进入监视器后执行:

show

然后:

show mpp

检查 MPP 控制文件:

check mppctl

综合检查:

tip

正确状态:

show 应显示:

GRP1
  GRP1_MPP_EP01    PRIMARY    OPEN
  GRP1_MPP_EP11    STANDBY    OPEN

GRP2
  GRP2_MPP_EP02    PRIMARY    OPEN
  GRP2_MPP_EP22    STANDBY    OPEN

同时满足:

所有守护进程状态:OPEN
所有数据库实例状态:OPEN
GRP1 OGUID:45330
GRP2 OGUID:45331
MPP_FLAG:TRUE
主库到备库的 REALTIME 归档:VALID

show mpp 应显示两个站点:

GRP1_MPP_EP01   EP_SEQNO=0
GRP2_MPP_EP02   EP_SEQNO=1

check mppctl 不应报告控制文件不一致。

将“所有实例 Open、所有守护进程 Open”作为 MPP 主备搭建成功的正常状态。


19. 部署后额外验证

19.1 检查 A 的实例模式

EP01:

./disql SYSDBA/Dm123456@:5236

查询:

SELECT INSTANCE_NAME, STATUS$, MODE$, OGUID FROM V$INSTANCE; EXIT;

EP22:

./disql SYSDBA/Dm123456@:5237

执行同一查询。

19.2 检查 B的实例模式

EP02:

./disql SYSDBA/Dm123456@:5236

EP11:

./disql SYSDBA/Dm123456@:5237

分别执行:

SELECT INSTANCE_NAME, STATUS$, MODE$, OGUID FROM V$INSTANCE; EXIT;

21. 总结与注意事项

本方案在服务器 A、B 上分别部署两个数据库实例,并通过两个数据守护组实现 MPP 主备架构:

  • GRP1:A 上的 GRP1_MPP_EP01 为主库,B 上的 GRP1_MPP_EP11 为备库,OGUID 为 45330
  • GRP2:B 上的 GRP2_MPP_EP02 为主库,A 上的 GRP2_MPP_EP22 为备库,OGUID 为 45331
  • MPP 节点由 GRP1_MPP_EP01GRP2_MPP_EP02 组成,对应 mpp_seq_no 分别为 01
  • 服务器 C 部署单实例确认监视器,用于配合 DW_MODE=AUTO 完成自动故障确认和主备切换。

搭建和维护过程中应重点注意以下事项:

  1. 备库必须由对应主库的备份集还原。
    EP11 必须使用 EP01 的备份集还原,EP22 必须使用 EP02 的备份集还原。不能将两个分别初始化的数据库直接组成主备,也不要直接复制数据文件。

  2. 四个实例的关键配置必须保持一致或严格对应。
    四份 dmmal.ini 内容必须完全一致;dmmpp.ctl 必须由同一份 dmmpp.ini 生成后复制到四个实例,不能分别生成。复制完成后应使用 sha256sum 检查哈希值。

  3. 实例名称、端口和路径必须准确。
    INSTANCE_NAMEPORT_NUMMAL_PORTMAL_DW_PORTMAL_INST_DW_PORT 以及 ARCH_DEST 必须与实例规划一致。每个 dm.ini 中的 CONFIG_PATHSYSTEM_PATHCTL_PATH 都应指向本实例自己的 DAMENG 目录。

  4. 两个守护组必须使用不同的 OGUID。
    GRP1 使用 45330,GRP2 使用 45331。同一守护组内主备库的 OGUID 必须相同,不同守护组之间不能重复。

  5. 设置数据库角色时必须使用本地 MPP 会话。
    连接字符串应带有 #"{mpp_type=local}",并临时开启 ALTER_MODE_STATUS 后设置 OGUID 和主备角色,完成后再将该参数恢复为 0

  6. 四个数据库必须先以 Mount 方式启动。
    配置守护期间不要手工执行 ALTER DATABASE OPEN。数据库应保持 Mount 状态,由 dmwatcher 判断主备关系后自动 Open,避免产生额外 Redo 影响主备一致性。

  7. 实时归档必须双向配置。
    每个主库的实时归档目标指向对应备库,备库同时反向指向原主库,以保证发生主备切换后日志仍能正常传输。

  8. 确认监视器地址必须与守护通信端口一致。
    MON_DW_IP 应对应相应实例的 MAL_HOST:MAL_DW_PORT。部署前应确认 A、B、C 之间相关数据库端口、MAL 端口和守护端口均可访问。

  9. 启动顺序建议保持统一。
    先启动四个数据库并保持 Mount,再启动 A、B 两台服务器上的 dmwatcher,最后启动服务器 C 上的确认监视器。

  10. 部署完成后必须进行综合检查。
    使用监视器执行 showshow mppcheck mppctltip,确认:

    • 四个数据库实例均为 OPEN
    • 四个守护进程状态均为 OPEN
    • GRP1、GRP2 的主备角色和 OGUID 正确;
    • MPP_FLAGTRUE
    • 实时归档状态为 VALID
    • 四份 dmmpp.ctl 内容一致。

如出现守护进程进入 Shutdown、数据库长期保持 Mount、实时归档为 Invalid 或监视器只能看到部分实例,应优先检查实例名称、端口、OGUID、配置文件路径、dmmal.ini 一致性、dmmpp.ctl 哈希值以及网络连通性。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服