| 服务器 | 数据库实例 | 初始角色 |
|---|---|---|
| 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 |
在服务器 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
./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
./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
在服务器 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
./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
./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
在四个实例初始化完成后、首次启动前,一次性完成本节配置。
只修改下面列出的参数,其他初始化参数保持不变。
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
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
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
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=0、ENABLE_OFFLINE_TS=2。
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;
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;
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;
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
此时应没有上述四个实例。
数据守护不能将两个分别初始化的数据库直接组成主备,也不能直接复制数据文件。备库必须通过对应主库的备份集还原,确保永久魔数、密钥等信息一致。
确认备份集路径不存在:
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'"
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'"
以下命令将 SSH 的 known_hosts 文件也放在 /data/SLQ 下。
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/
在 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
确认 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
确认 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。
四个实例的 dmmal.ini 内容必须完全一致。手册要求 MAL_HOST 使用内部通信 IP;由于这里按单网卡实验配置,MAL_HOST 和 MAL_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
每个组必须双向配置实时归档,因为发生主备切换后,原备库可能成为新主库,需要把日志反向发送给原主库。
编辑:
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
做到这里。。。
编辑:
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
编辑:
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
编辑:
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
主库归档目标分别指向对应备库,备库归档目标反向指向原主库。
dmmpp.ctl 必须由同一份文本配置生成,然后原样复制到四个实例,不能在四个实例上分别生成不同文件。
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
/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
确认生成:
ls -l /data/SLQ/dmdata/shared/dmmpp.ctl
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
在 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=2 将 dmmpp.ini 转换为 dmmpp.ctl,并要求将同一个控制文件复制到其余主库和备库。
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
四个哈希值必须完全相同。
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
创建:
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,同时守护两个实例。
由于 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 一致。
必须先启动四个数据库,保持 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 &
nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP01/DAMENG/dm.ini mount > /data/SLQ/dmdata/log/EP01_mount.log 2>&1 &
nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP22/DAMENG/dm.ini mount > /data/SLQ/dmdata/log/EP22_mount.log 2>&1 &
nohup /data/SLQ/dmdbms/bin/dmserver /data/SLQ/dmdata/EP02/DAMENG/dm.ini mount > /data/SLQ/dmdata/log/EP02_mount.log 2>&1 &
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'
连接:
./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;
连接:
./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;
连接:
./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;
连接:
./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。
建议先启动 A,再启动 B,间隔几秒即可。
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
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 秒。
在服务器 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 主备搭建成功的正常状态。
EP01:
./disql SYSDBA/Dm123456@:5236
查询:
SELECT INSTANCE_NAME, STATUS$, MODE$, OGUID FROM V$INSTANCE;
EXIT;
EP22:
./disql SYSDBA/Dm123456@:5237
执行同一查询。
EP02:
./disql SYSDBA/Dm123456@:5236
EP11:
./disql SYSDBA/Dm123456@:5237
分别执行:
SELECT INSTANCE_NAME, STATUS$, MODE$, OGUID FROM V$INSTANCE;
EXIT;
本方案在服务器 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。GRP1_MPP_EP01 和 GRP2_MPP_EP02 组成,对应 mpp_seq_no 分别为 0 和 1。DW_MODE=AUTO 完成自动故障确认和主备切换。搭建和维护过程中应重点注意以下事项:
备库必须由对应主库的备份集还原。
EP11 必须使用 EP01 的备份集还原,EP22 必须使用 EP02 的备份集还原。不能将两个分别初始化的数据库直接组成主备,也不要直接复制数据文件。
四个实例的关键配置必须保持一致或严格对应。
四份 dmmal.ini 内容必须完全一致;dmmpp.ctl 必须由同一份 dmmpp.ini 生成后复制到四个实例,不能分别生成。复制完成后应使用 sha256sum 检查哈希值。
实例名称、端口和路径必须准确。
INSTANCE_NAME、PORT_NUM、MAL_PORT、MAL_DW_PORT、MAL_INST_DW_PORT 以及 ARCH_DEST 必须与实例规划一致。每个 dm.ini 中的 CONFIG_PATH、SYSTEM_PATH、CTL_PATH 都应指向本实例自己的 DAMENG 目录。
两个守护组必须使用不同的 OGUID。
GRP1 使用 45330,GRP2 使用 45331。同一守护组内主备库的 OGUID 必须相同,不同守护组之间不能重复。
设置数据库角色时必须使用本地 MPP 会话。
连接字符串应带有 #"{mpp_type=local}",并临时开启 ALTER_MODE_STATUS 后设置 OGUID 和主备角色,完成后再将该参数恢复为 0。
四个数据库必须先以 Mount 方式启动。
配置守护期间不要手工执行 ALTER DATABASE OPEN。数据库应保持 Mount 状态,由 dmwatcher 判断主备关系后自动 Open,避免产生额外 Redo 影响主备一致性。
实时归档必须双向配置。
每个主库的实时归档目标指向对应备库,备库同时反向指向原主库,以保证发生主备切换后日志仍能正常传输。
确认监视器地址必须与守护通信端口一致。
MON_DW_IP 应对应相应实例的 MAL_HOST:MAL_DW_PORT。部署前应确认 A、B、C 之间相关数据库端口、MAL 端口和守护端口均可访问。
启动顺序建议保持统一。
先启动四个数据库并保持 Mount,再启动 A、B 两台服务器上的 dmwatcher,最后启动服务器 C 上的确认监视器。
部署完成后必须进行综合检查。
使用监视器执行 show、show mpp、check mppctl 和 tip,确认:
OPEN;OPEN;MPP_FLAG 为 TRUE;VALID;dmmpp.ctl 内容一致。如出现守护进程进入 Shutdown、数据库长期保持 Mount、实时归档为 Invalid 或监视器只能看到部分实例,应优先检查实例名称、端口、OGUID、配置文件路径、dmmal.ini 一致性、dmmpp.ctl 哈希值以及网络连通性。
文章
阅读量
获赞
