注册
DM7单机扩展为主备(数据守护)操作手册
专栏/技术分享/ 文章详情 /

DM7单机扩展为主备(数据守护)操作手册

科技不收敛 2026/10/16 181 0 0
摘要

DM7单机扩展为主备(数据守护)操作手册

0. 与 DM8 版本的差异

本手册适用 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

1. 概述与环境规划

现有单机 .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
  • 守护组 GRP1,OGUID = 453331
  • 安装目录 /home/dmdba/dm/dmdbms,dm.ini 在 bin 目录
  • 数据目录 /dbdata/dmdata/DAMENG,归档 /dbarch/dmarch,备份 /dbbak/dmbak
  • 端口全部互不重复;MAL_HOST 建议用内网 IP,MAL_INST_HOST 用对外服务 IP

2. 前置检查(不停机)

备库必须与主库同一版本、同一建库参数。先在主库查清楚,备库照抄。

  1. 查版本,主备两台输出必须完全相同:

    SQL> SELECT * FROM V$VERSION;     -- 主库上查
    # 备机未建库时:前台运行 ./dmap,首行即打印版本号,看完 Ctrl+C
    
  2. 确认主库已开归档:SELECT ARCH_MODE FROM V$DATABASE; 应为 Y。联机备份和实时主备都依赖归档。

  3. 确认 dmap 可用(主库联机备份、备库 dmrman 还原都会用到):

    [dmdba@bin]$ ./DmAPService status
    [dmdba@bin]$ grep -n "DM_HOME" DmAPService     # 检查目录
    
  4. 网络:.76、.75、监视器机器之间放通 5236、33141/33142、61141/61142、52141/52142。

  5. 备机目录与主机一致并属 dmdba:/dbdata/dmdata、/dbarch/dmarch、/dbbak/dmbak。

  6. 主库归档余量充足,从备份到备库追平期间的归档不能被清理。

  7. 准备备机的 dm.key(与主库同类型、未过期)。

3. 主库:联机全备并传到备机(不停机)

DM7 手册 7.1.2 规定:Normal 模式的库如果不能确定一定作为主库,必须用脱机备份,否则可能备库数据比主库多。所以还原出来的库只能作备库,不要反过来用。

  1. 主库联机全备:

    [dmdba@bin]$ ./disql SYSDBA/SYSDBA
    SQL> BACKUP DATABASE BACKUPSET '/dbbak/dmbak/BACKUP_FILE';
    SQL> exit
    
  2. 传到备机:

    [dmdba@bin]$ scp -rp /dbbak/dmbak/BACKUP_FILE dmdba@192.168.252.75:/dbbak/dmbak/
    

4. 备库:安装、初始化、还原(不停机)

备机装同版本软件、dminit 一个同参数的空库,再用主库备份覆盖还原。不能主备各自初始化后直接搭建:永久魔数和加密密钥不同(DM7 手册 7.1)。

  1. 安装与主库同版本(V7.6.0.139)的 DM7 软件到 /home/dmdba/dm/dmdbms,用 root 执行 root_installer.sh。

  2. 确认 DmAPService 脚本里 DM_HOME 为 /home/dmdba/dm/dmdbms,并已启动(./DmAPService status)。

  3. 放入 dm.key 到 bin 目录。

  4. 初始化(下为示例):

    [dmdba@bin]$ ./dminit PATH=/dbdata/dmdata PAGE_SIZE=32 EXTENT_SIZE=16 CASE_SENSITIVE=Y UNICODE_FLAG=0 LOG_SIZE=2048
    
  5. 拷 dm.ini 到 bin(与主库一致),配好 dmarch.ini 本地归档、dmserverd 脚本,不要启动数据库。

  6. 把主库 dm.ini 里调优过的参数(内存、缓冲区等)同步到备库,实例名、路径类参数保持备库自己的。

  7. 还原并恢复到备份点:

    [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,。

5. 配置文件(不停机,重启后生效)

主备只有三处不同,其余完全一致。所有文件去掉中文注释、用 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

5.1 dm.ini(/home/dmdba/dm/dmdbms/bin/dm.ini)

已有参数就地修改,没有的加在末尾(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。

5.2 dmarch.ini(/dbdata/dmdata/DAMENG/dmarch.ini)

保留已有本地归档段,增加实时归档段:

[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% 设置。

5.3 dmmal.ini(/dbdata/dmdata/DAMENG/dmmal.ini,主备完全一致)

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 必须相同。

5.4 dmwatcher.ini(/dbdata/dmdata/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 = /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

5.5 dmwatcher.ctl(DM7 必须)

一个守护组只生成一份,拷到主备各自的数据目录(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 后要重新生成并拷贝。

5.6 启动脚本(主备都做)

[dmdba@bin]$ cp ./service_template/DmWatcherService ./dmwatcherd
[dmdba@bin]$ vi dmwatcherd      # INI_PATH=/dbdata/dmdata/DAMENG/dmwatcher.ini
[dmdba@bin]$ chmod +x dmwatcherd

5.7 确认监视器

自动切换模式必须配确认监视器,且最多 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(普通监视器可以有多个)。

6. 停机窗口:设置模式与 OGUID,启动守护

唯一需要停主库的一步,约 5–10 分钟。先停应用。实例必须以 mount 启动,否则会生成 Redo 并可能被应用连上,破坏主备一致。

  1. 主库正常停机:./dmserverd stop

  2. 主库 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
    
  3. 备库同样操作,设为 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
    
  4. 确认主备数据目录都有 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 实例。

  5. 监视器机器启动确认监视器:./dmmonitord start

  6. 主库 Open 后恢复应用;备库在后台追平备份后的归档。

  7. 注册开机自启(root,主备都做;监视器机器注册 dmmonitord):

    [root@root]# cd /home/dmdba/dm/dmdbms/script/root/
    [root@root]# ./dm_service_installer.sh -s /home/dmdba/dm/dmdbms/bin/dmwatcherd
    

7. 验证、关闭顺序与切换测试

通过标准:监视器 show 里所有实例和守护进程都是 Open,主库写入的数据备库可查到。

7.1 验证

  1. 监视器查看:

    [dmdba@bin]$ ./dmmonitor dmmonitor_0.ini
    show
    
  2. 数据验证:主库建测试表插一行并提交,备库查询可见,验完删表。

7.2 关闭顺序

关闭顺序不能错:

  1. 关确认监视器 ./dmmonitord stop(防自动接管)
  2. 关备库守护 ./dmwatcherd stop
  3. 关主库守护 ./dmwatcherd stop
  4. 关主库实例 ./dmserverd stop
  5. 关备库实例 ./dmserverd stop

启动顺序:主库守护 → 备库守护 → 确认监视器。

7.3 切换演练(业务允许时)

login
choose switchover GRP1
switchover GRP1.GRP1_RT_02      # 备库切为主库
show
switchover GRP1.GRP1_RT_01      # 切回

8. 常见报错与回退

下表是本次在 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();
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服