本手册适用 DM7(现场 V7.6.0.139)
dm7和dm8在数据守护上有一些不同,列举如下:
| 项目 | DM8 | DM7(本手册) |
|---|---|---|
| 实例监听守护进程的端口 | dmmal.ini 的 MAL_INST_DW_PORT | dm.ini 的 DW_PORT;dmmal.ini 写 MAL_INST_DW_PORT 会报 Read dmmal.ini error |
| dm.ini 守护参数 | DW_INACTIVE_INTERVAL、DW_ARCH_SPACE_CHECK | 没有这两个;用 DW_ERROR_TIME = 60、HA_INST_CHECK_FLAG = 1 |
| dmwatcher.ini | 有 DW_RECONNECT、DW_FAILOVER_FORCE、INST_SERVICE_IP_CHECK | 没有,写了会报 Read ini file error in line N |
| dmwatcher.ctl | 不需要 | Global 守护必须有;dmctlcvt TYPE=3 生成在 DEST/组名/ 下,拷到主备数据目录 |
| 确认监视器 | 多实例(RAFT,3 个) | 只能 1 个;MON_INST_NUM 等参数会报错 |
| 监视器关闭命令 | stop group / detach database | stop instance / detach instance |
现有单机 .76 直接作为主库,在 .75 上用主库备份还原出实时备库,配 1 个确认监视器实现故障自动切换。主库只在第 6 节停机一次。
| 角色 | IP | INSTANCE_NAME | PORT_NUM | DW_PORT(dm.ini) | MAL_PORT | MAL_DW_PORT |
|---|---|---|---|---|---|---|
| 主库(现有单机) | 192.168.252.76 | GRP1_RT_01 | 5236 | 33141 | 61141 | 52141 |
| 备库(新机器) | 192.168.252.75 | GRP1_RT_02 | 5236 | 33142 | 61142 | 52142 |
备库必须与主库同一版本、同一建库参数。先在主库查清楚,备库照抄。
查版本,主备两台输出必须完全相同:
SQL> SELECT * FROM V$VERSION; -- 主库上查
# 备机未建库时:前台运行 ./dmap,首行即打印版本号,看完 Ctrl+C
确认主库已开归档:SELECT ARCH_MODE FROM V$DATABASE; 应为 Y。联机备份和实时主备都依赖归档。
确认 dmap 可用(主库联机备份、备库 dmrman 还原都会用到):
[dmdba@bin]$ ./DmAPService status
[dmdba@bin]$ grep -n "DM_HOME" DmAPService # 检查目录
网络:.76、.75、监视器机器之间放通 5236、33141/33142、61141/61142、52141/52142。
备机目录与主机一致并属 dmdba:/dbdata/dmdata、/dbarch/dmarch、/dbbak/dmbak。
主库归档余量充足,从备份到备库追平期间的归档不能被清理。
准备备机的 dm.key(与主库同类型、未过期)。
DM7 手册 7.1.2 规定:Normal 模式的库如果不能确定一定作为主库,必须用脱机备份,否则可能备库数据比主库多。所以还原出来的库只能作备库,不要反过来用。
主库联机全备:
[dmdba@bin]$ ./disql SYSDBA/SYSDBA
SQL> BACKUP DATABASE BACKUPSET '/dbbak/dmbak/BACKUP_FILE';
SQL> exit
传到备机:
[dmdba@bin]$ scp -rp /dbbak/dmbak/BACKUP_FILE dmdba@192.168.252.75:/dbbak/dmbak/
备机装同版本软件、dminit 一个同参数的空库,再用主库备份覆盖还原。不能主备各自初始化后直接搭建:永久魔数和加密密钥不同(DM7 手册 7.1)。
安装与主库同版本(V7.6.0.139)的 DM7 软件到 /home/dmdba/dm/dmdbms,用 root 执行 root_installer.sh。
确认 DmAPService 脚本里 DM_HOME 为 /home/dmdba/dm/dmdbms,并已启动(./DmAPService status)。
放入 dm.key 到 bin 目录。
初始化(下为示例):
[dmdba@bin]$ ./dminit PATH=/dbdata/dmdata PAGE_SIZE=32 EXTENT_SIZE=16 CASE_SENSITIVE=Y UNICODE_FLAG=0 LOG_SIZE=2048
拷 dm.ini 到 bin(与主库一致),配好 dmarch.ini 本地归档、dmserverd 脚本,不要启动数据库。
把主库 dm.ini 里调优过的参数(内存、缓冲区等)同步到备库,实例名、路径类参数保持备库自己的。
还原并恢复到备份点:
[dmdba@bin]$ ./dmrman
RMAN> RESTORE DATABASE '/home/dmdba/dm/dmdbms/bin/dm.ini' FROM BACKUPSET '/dbbak/dmbak/BACKUP_FILE';
RMAN> RECOVER DATABASE '/home/dmdba/dm/dmdbms/bin/dm.ini' FROM BACKUPSET '/dbbak/dmbak/BACKUP_FILE';
#下面这不dm7不需要
RMAN> RECOVER DATABASE '/home/dmdba/dm/dmdbms/bin/dm.ini' UPDATE DB_MAGIC;
RMAN> exit
还原的库会带着备份时的模式和 OGUID,。
主备只有三处不同,其余完全一致。所有文件去掉中文注释、用 Linux 换行符(从 Word 复制后执行 sed -i 's/\r$//' 文件名),改前先备份。
| 参数 | 主库 .76 | 备库 .75 |
|---|---|---|
| dm.ini 的 INSTANCE_NAME | GRP1_RT_01 | GRP1_RT_02 |
| dm.ini 的 DW_PORT | 33141 | 33142 |
| dmarch.ini 实时归档 ARCH_DEST | GRP1_RT_02 | GRP1_RT_01 |
已有参数就地修改,没有的加在末尾(DM7 手册 7.2.3.1):
INSTANCE_NAME = GRP1_RT_01
PORT_NUM = 5236
DW_PORT = 33141
DW_ERROR_TIME = 60
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
HA_INST_CHECK_FLAG = 1
RLOG_SEND_APPLY_MON = 64
备库改为 INSTANCE_NAME = GRP1_RT_02、DW_PORT = 33142。
保留已有本地归档段,增加实时归档段:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dbarch/dmarch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 4096
备库 ARCH_DEST = GRP1_RT_01。ARCH_SPACE_LIMIT 按 /dbarch 容量的 80% 设置。
DM7 没有 MAL_INST_DW_PORT,不要写:
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.252.76
MAL_PORT = 61141
MAL_INST_HOST = 192.168.252.76
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.252.75
MAL_PORT = 61142
MAL_INST_HOST = 192.168.252.75
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142
两边用 dmmal.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 = /home/dmdba/dm/dmdbms/bin/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dm/dmdbms/bin/dmserverd start
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
一个守护组只生成一份,拷到主备各自的数据目录(DM7 手册 3.5.3、7.2.3.5)。在主库执行:
[dmdba@bin]$ ./dmctlcvt TYPE=3 SRC=/dbdata/dmdata/DAMENG/dmwatcher.ini DEST=/dbdata/dmdata/DAMENG
# 文件生成在 DEST/组名 子目录下
[dmdba@bin]$ mv /dbdata/dmdata/DAMENG/GRP1/dmwatcher.ctl /dbdata/dmdata/DAMENG/
[dmdba@bin]$ ./dmctlcvt TYPE=4 SRC=/dbdata/dmdata/DAMENG/dmwatcher.ctl DEST=/tmp/dmwatcher_ctl.txt
[dmdba@bin]$ scp /dbdata/dmdata/DAMENG/dmwatcher.ctl dmdba@192.168.252.75:/dbdata/dmdata/DAMENG/
修改 dmwatcher.ini 后要重新生成并拷贝。
[dmdba@bin]$ cp ./service_template/DmWatcherService ./dmwatcherd
[dmdba@bin]$ vi dmwatcherd # INI_PATH=/dbdata/dmdata/DAMENG/dmwatcher.ini
[dmdba@bin]$ chmod +x dmwatcherd
自动切换模式必须配确认监视器,且最多 1 个(DM7 手册 7.2.5)。bin/dmmonitor.ini:
MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/dm/dmdbms/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.252.76:52141
MON_DW_IP = 192.168.252.75:52142
制作脚本:cp ./service_template/DmMonitorService ./dmmonitord,INI_PATH 指向上面的文件。主备机上另建 dmmonitor_0.ini 作日常查看用,内容相同但 MON_DW_CONFIRM = 0(普通监视器可以有多个)。
唯一需要停主库的一步,约 5–10 分钟。先停应用。实例必须以 mount 启动,否则会生成 Redo 并可能被应用连上,破坏主备一致。
主库正常停机:./dmserverd stop
主库 mount 启动并设为 PRIMARY(窗口 1 前台启动,窗口 2 执行 SQL):
# 窗口 1
[dmdba@bin]$ ./dmserver /home/dmdba/dm/dmdbms/bin/dm.ini mount
# 窗口 2
[dmdba@bin]$ ./disql SYSDBA/SYSDBA
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(453331);
SQL> ALTER DATABASE PRIMARY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL> exit
# 回窗口 1 输入 exit
备库同样操作,设为 STANDBY:
[dmdba@bin]$ ./dmserver /home/dmdba/dm/dmdbms/bin/dm.ini mount
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(453331);
SQL> ALTER DATABASE STANDBY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL> exit
确认主备数据目录都有 dmwatcher.ctl,然后启动守护进程,先主后备:
[dmdba@bin]$ ls -l /dbdata/dmdata/DAMENG/dmwatcher.ctl
[dmdba@bin]$ ./dmwatcherd start
[dmdba@bin]$ tail ../log/dmwatcherd_err.log
守护进程先进入 Startup 状态,实例为 Mount;互相确认后自动 Open 实例。
监视器机器启动确认监视器:./dmmonitord start
主库 Open 后恢复应用;备库在后台追平备份后的归档。
注册开机自启(root,主备都做;监视器机器注册 dmmonitord):
[root@root]# cd /home/dmdba/dm/dmdbms/script/root/
[root@root]# ./dm_service_installer.sh -s /home/dmdba/dm/dmdbms/bin/dmwatcherd
通过标准:监视器 show 里所有实例和守护进程都是 Open,主库写入的数据备库可查到。
监视器查看:
[dmdba@bin]$ ./dmmonitor dmmonitor_0.ini
show
数据验证:主库建测试表插一行并提交,备库查询可见,验完删表。
关闭顺序不能错:
./dmmonitord stop(防自动接管)./dmwatcherd stop./dmwatcherd stop./dmserverd stop./dmserverd stop启动顺序:主库守护 → 备库守护 → 确认监视器。
login
choose switchover GRP1
switchover GRP1.GRP1_RT_02 # 备库切为主库
show
switchover GRP1.GRP1_RT_01 # 切回
下表是本次在 DM7 上实际遇到的报错,多数来自照抄 DM8 配置。
| 报错 | 原因 | 处理 |
|---|---|---|
[-7109]: 管道连接失败 |
DmAPService 脚本里 DM_HOME 路径不对,dmap 管道建在别处 | 改正 DM_HOME,systemctl daemon-reload 后重启 DmAPService |
dmap init failed, code[-7157]: Named pipe exist |
已有 dmap 在运行,或残留管道文件 | ps -ef \| grep dmap 停掉旧进程,删 bin/DM_PIPE_DMAP* 后用 DmAPService start |
Job for DmAPService.service failed |
同上两条之一 | 看 systemctl status DmAPService -l |
Read dmmal.ini error in line 11 |
DM7 不支持 MAL_INST_DW_PORT | 删掉该参数,改在 dm.ini 配 DW_PORT |
Read ini file(dmwatcher.ini) error in line 13 |
DM7 不支持 DW_RECONNECT、DW_FAILOVER_FORCE、INST_SERVICE_IP_CHECK | 删掉这三个参数 |
Instance(GRP1_RT_01) DW_PORT has not config in dm.ini |
DM7 守护端口要配在 dm.ini | 加 DW_PORT(静态,重启实例生效) |
dmwatcher.ctl not exist in path |
DM7 Global 守护必须有控制文件 | 按 5.5 生成并拷到主备数据目录 |
dmmonitor.ini error in line 6 |
DM7 不支持多实例监视器参数 MON_INST_NUM 等 | 按 5.7 用单实例写法 |
| 各 ini 报无法识别字符 | Word 复制带入 Windows 换行或全角字符 | cat -A 检查,sed -i 's/\r$//' 清理 |
| 备库长期不同步 | 备份后的归档被清理,或 dm.key 过期 | check recover 看原因;重做第 3–4 节;过期则替换 dm.key 并执行 SP_LOAD_LIC_INFO(); |
文章
阅读量
获赞
