• DM8数据守护集群安装部署_手动切换


    一.安装前准备

    1.1 硬件环境建议

    数据守护集群安装部署前需要额外注意网络环境和磁盘 IO 配置情况,其他环境配置项建议请参考安装前准备工作

    1.1.1 网络环境

    心跳网络对 mal 通讯系统的影响非常大,如果网络丢包或者延迟较大,则会严重影响 mal 系统的处理能力,从而导致整个集群出现响应服务请求慢的情况。为确保集群的稳定性,网络配置如下:

    1. 使用千兆或千兆以上网络;
    2. 集群间的心跳网络需同步数据,建议尽量使用两个交换机构建内网,以实现冗余和负载均衡;
    3. 建议服务器采用两个网卡绑定为一个逻辑网卡来使用(比如 bond 方式)。

    1.1.2 磁盘 IO

    磁盘 IO 的读写速率会极大影响系统性能和用户体验。因此在进行集群安装部署前,应测试 IO 性能能否满足系统功能和性能需求。
    IO 性能指标与系统的并发数、热点数据等因素往往密切相关。在数据守护集群,尤其生产系统中,推荐使用高性能 SSD 磁盘,以获得更佳性能,保证集群数据的实时同步。

    1.2 集群规划

    A 机器B 机器
    业务 IP192.168.40.150192.168.40.160
    心跳 IP192.168.183.100192.168.183.120
    实例名top01top02
    实例端口52365236
    MAL 端口53365336
    MAL 守护进程端口54365436
    守护进程端口55365536
    OGUID4533145331
    守护组grp1grp1
    安装目录/dmdb8/dmdbms/dmdb8/dmdbms
    实例目录/dmdb8/dmdata//dmdb8/dmdata/
    归档上限5120051200

    确认监视器 IP 为 10.10.10.10。
    说明:具体规划及部署方式以现场环境为准。

    1.3 集群架构

    搭建的主备集群架构如下图:
    image.png

    1.4 切换模式说明

    故障切换方式dmarchdmwatcherdmmonitor监视器要求
    故障手动切换ARCH_WAIT_APP
    LY=0DW_MODE=
    MANUALMON_DW_CON
    FIRM=01、手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。
    故障自动切换ARCH_WAIT_APP
    LY= 1DW_MODE=
    AUTOMON_DW_CON
    FIRM=11、手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。
    2、自动切换:在确认监视器上(非集群节点),存放确认监视器配置文件,并注册后台自启服务。
    • ARCH_WAIT_APPLY 参数,设置为 0:高性能模式;设置为 1:事务一致模式。
    • 故障手动切换情境下 ARCH_WAIT_APPLY 只能为 0。故障自动切换情境下 ARCH_WAIT_APPLY 可以为 0,也可以为 1。
    • ARCH_WAIT_APPLY 参数设置的判断依据为业务是否要查询备机最新数据。如果需要,则配置为 1(较大性能衰减);如果不需要,则配置为 0。

    二.集群搭建

    前提2个节点都已安装数据库软件

    2.1 配置 A 机器

    2.1.1 初始化实例并备份数据

    • 初始化实例
    [dmdba@localhost ~]$ /dmdb8/dmdbms/bin/dminit PATH=/dmdb8/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 CASE_SENSITIVE=0 CHARSET=1 LENGTH_IN_CHAR=0  INSTANCE_NAME=top01 PORT_NUM=5236
    
    参数解释
    PAGE_SIZE:
    EXTENT_SIZE:
    LOG_SIZE:日志文件大小
    CASE_SENSITIVE:建议从 MYSQL 和 SQLSERVER 迁移过来的系统,使用大小写不敏感,ORACLE 迁移过来的系统,使用大小写敏感,默认为区分。取值:Y、y、1 表示敏感;N、n、0 表示不敏感。默认值为 Y 。
    CHARSET/UNICODE_FLAG:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。默认为 0
    DB_NAME:初始化数据库名称,默认为 DAMENG
    INSTANCE_NAME:初始化数据库实例名称,默认为 DMSERVER
    PORT_NUM:数据库端口号,默认5236
    LENGTH_IN_CHAR:VARCHAR 类型对象的长度是否以字符为单位。取值为 1 或者 Y 表示是,取值为 0 或 N 表示否。默认值为 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    特此说明:达梦的字段一般都是大写的,但是程序中写的sql都是小写。大小写是否敏感需要和开发确认,本案例中都是不敏感

    • 启动服务
    [dmdba@~]$ /dmdb8/dmdbms/bin/dmserver /dmdb8/dmdata/DAMENG/dm.ini
    
    • 1
    • 开启归档
    [dmdba@~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.150:5236
    
    SQL> ALTER DATABASE MOUNT;
    SQL> ALTER DATABASE ARCHIVELOG;
    SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmdb8/dmarch/DAMENG, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
    SQL> ALTER DATABASE OPEN;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 备份数据
    SQL> BACKUP DATABASE BACKUPSET '/dmdb8/dmbak/BACKUP_FILE';
    
    • 1
    • 修改 dm.ini
    SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
    SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60); --接收守护进程消息超时时间
    SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);     --不允许手工方式修改实例模式/状态/OGUID
    SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);     --不允许备库OFFLINE表空间
    SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);               --打开MAL系统
    SQL> SP_SET_PARA_VALUE (2,'ARCH_INI',1);              --打开归档配置
    SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);  --统计最近64次的日志发送信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 关闭前台实例服务
    SQL> shutdown immediate;
    
    • 1

    2.1.2 修改 dmarch.ini

    [dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmarch.ini
    
    ARCH_WAIT_APPLY            = 0   #0:高性能 1:事务一致
    [ARCHIVE_LOCAL]
    ARCH_TYPE                = LOCAL  #本地归档类型
    ARCH_DEST                = /dmdb8/dmarch/DAMENG  #本地归档存放路径
    ARCH_FILE_SIZE           = 1024  #单个归档大小,单位 MB
    ARCH_SPACE_LIMIT         = 51200  #归档上限,单位 MB
    
    [ARCHIVE_REALTIME1]
    ARCH_TYPE                = REALTIME  #实时归档类型
    ARCH_DEST                = top02  #实时归档目标实例名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    读写分离集群和数据守护集群的配置区别:

    • 读写分离集群
    [ARCHIVE_TIMELY1]
    ARCH_TYPE                = TIMELY  #即时归档类型
    ARCH_DEST                = top02  #即时归档目标实例名
    
    • 1
    • 2
    • 3
    • 数据守护集群
    [ARCHIVE_REALTIME1]
    ARCH_TYPE                = REALTIME  #实时归档类型
    ARCH_DEST                = top02  #实时归档目标实例名
    
    • 1
    • 2
    • 3
    补充
    即时归档

    即时归档(Timely)在主库将 Redo 日志写入联机日志文件后,通过 MAL 系统将 Redo 日志发送到备库。即时归档与实时归档的主要区别是 Redo 日志的发送时机不同。一个主库可以配置 1~8 个即时备库。
    根据备库重演 Redo 日志和响应主库时机的不同,即时归档分为两种模式:事务一致模式和高性能模式。即时归档模式可以通过 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来设置。其中,ARCH_WAIT_APPLY 配置项默认值为 1,表示事务一致模式。

    • 事务一致模式 主库事务提交触发 Redo 日志刷盘和即时归档,备库收到主库发送的 Redo 日志,并重演完成后再响应主库。主库收到备库响应消息后,再响应用户的提交请求。事务一致模式下,同一个事务的 SELECT 语句无论是在主库执行,还是在备库执行,查询结果都满足 READ COMMIT 隔离级要求。
    • 高性能模式 与实时归档一样,备库收到主库发送的 Redo 日志后,马上响应主库,再启动日志重演。高性能模式下,备库与主库的数据同步存在一定延时(一般情况下延迟时间非常短暂,用户几乎感觉不到),不能严格保证事务一致性。
    实时归档

    与本地归档写入保存在磁盘中的日志文件不同,实时归档(Realtime)将主库产生的 Redo 日志通过 MAL 系统传递到备库,实时归档是实时主备和 MPP 主备的实现基础。实时归档只在主库生效,一个主库可以配置 1~8 个实时备库。
    实时归档的执行流程是,主库在 Redo 日志(RLOG_PKG)写入联机日志文件前,将 Redo 日志发送到备库,备库收到 Redo 日志(RLOG_PKG)后标记为 KEEP_RLOG_PKG,将原 KEEP_RLOG_PKG 加入日志重演任务系统,并马上响应主库,不需要等待 Redo 日志重演结束后再响应主库。主库收到备库的响应消息,确认备库已经收到 Redo 日志后,再将 Redo 日志写入联机日志文件中。
    另外,实时归档也可以支持读写分离集群,实时归档也分为两种模式:事务一致模式和高性能模式,可以通过 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来设置实时归档的模式。实时归档和即时归档这两种模式的具体含义的说明完全相同,区别仅在于配置为实时归档时,dmarch.ini 中的 ARCH_WAIT_APPLY 配置项默认值为 0,即采用高性能模式。

    • 事务一致模式 主库事务提交触发 Redo 日志刷盘和即时归档,备库收到主库发送的 Redo 日志,并重演完成后再响应主库。主库收到备库响应消息后,再响应用户的提交请求。事务一致模式下,同一个事务的 SELECT 语句无论是在主库执行,还是在备库执行,查询结果都满足 READ COMMIT 隔离级要求。
    • 高性能模式 与实时归档一样,备库收到主库发送的 Redo 日志后,马上响应主库,再启动日志重演。高性能模式下,备库与主库的数据同步存在一定延时(一般情况下延迟时间非常短暂,用户几乎感觉不到),不能严格保证事务一致性。

    事务一致模式下,主备库之间严格维护事务一致性,但主库要等备库 Redo 日志重演完成后,再响应用户的提交请求,事务提交时间会变长,存在一定的性能损失。高性能模式则通过牺牲事务一致性获得更高的性能和提升系统的吞吐量。用户应该根据实际情况,选择合适的即时归档模式。

    2.1.3 创建 dmmal.ini

    [dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmmal.ini
    
    MAL_CHECK_INTERVAL         = 10  #MAL 链路检测时间间隔
    MAL_CONN_FAIL_INTERVAL     = 10  #判定 MAL 链路断开的时间
    MAL_TEMP_PATH              = /dmdb8/dmdata/malpath/  #临时文件目录
    MAL_BUF_SIZE               = 512  #单个 MAL 缓存大小,单位 MB
    MAL_SYS_BUF_SIZE           = 2048  #MAL 总大小限制,单位 MB
    MAL_COMPRESS_LEVEL         = 0  #MAL 消息压缩等级,0 表示不压缩
    
    [MAL_INST1]
    MAL_INST_NAME            = top01  #实例名,和 dm.ini 的 INSTANCE_NAME 一致
    MAL_HOST                 = 192.168.183.100  #MAL 系统监听 TCP 连接的 IP 地址
    MAL_PORT                 = 5336  #MAL 系统监听 TCP 连接的端口
    MAL_INST_HOST            = 192.168.40.150  #实例的对外服务 IP 地址
    MAL_INST_PORT            = 5236  #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
    MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
    MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口
    
    [MAL_INST2]
    MAL_INST_NAME            = top02 #实例名,和 dm.ini 的 INSTANCE_NAME 一致
    MAL_HOST                 = 192.168.183.120  #MAL 系统监听 TCP 连接的 IP 地址
    MAL_PORT                 = 5336  #MAL 系统监听 TCP 连接的端口
    MAL_INST_HOST            = 192.168.40.160 #实例的对外服务 IP 地址
    MAL_INST_PORT            = 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
    MAL_DW_PORT              = 5436 #实例对应的守护进程监听 TCP 连接的端口
    MAL_INST_DW_PORT         = 5536 #实例监听守护进程 TCP 连接的端口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2.1.4 创建 dmwatcher.ini

    [dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmwatcher.ini
    
    [GRP1]
    DW_TYPE                  = GLOBAL  #全局守护类型
    DW_MODE                  = MANUAL  #MANUAL:故障手切 AUTO:故障自切
    DW_ERROR_TIME            = 20  #远程守护进程故障认定时间
    INST_ERROR_TIME          = 20  #本地实例故障认定时间
    INST_RECOVER_TIME        = 60  #主库守护进程启动恢复的间隔时间
    INST_OGUID               = 45331  #守护系统唯一 OGUID 值
    INST_INI                 = /dmdb8/dmdata/DAMENG/dm.ini  #dm.ini 文件路径
    INST_AUTO_RESTART        = 1  #打开实例的自动启动功能
    INST_STARTUP_CMD         = /dmdb8/dmdbms/bin/dmserver  #命令行方式启动
    RLOG_SEND_THRESHOLD      = 0  #指定主库发送日志到备库的时间阈值,默认关闭
    RLOG_APPLY_THRESHOLD     = 0  #指定备库重演日志的时间阈值,默认关闭
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.1.5 拷贝备份文件

    ##拷贝备份文件到 B 机器
    [dmdba@~]$ scp -r /dmdb8/dmbak/BACKUP_FILE dmdba@192.168.40.160:/dmdb8/dmbak
    
    • 1
    • 2

    2.1.6 注册服务

    [root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p top01 -dm_ini /dmdb8/dmdata/DAMENG/dm.ini -m mount
    
    [root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdb8/dmdata/DAMENG/dmwatcher.ini
    
    • 1
    • 2
    • 3

    若要删除自启,可利用如下方式:

    [root@~]# /dmdb8/dmdbms/script/root/dm_service_uninstaller.sh -n DmServicetop01
    
    [root@~]# /dmdb8/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
    
    • 1
    • 2
    • 3

    注册过程:

    [root@localhost BACKUP_FILE]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p top01 -dm_ini /dmdb8/dmdata/DAMENG/dm.ini -m mount
    Created symlink from /etc/systemd/system/multi-user.target.wants/DmServicetop01.service to /usr/lib/systemd/system/DmServicetop01.service.
    Finished to create the service (DmServicetop01)
    
    [root@localhost BACKUP_FILE]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdb8/dmdata/DAMENG/dmwatcher.ini
    Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceWatcher.service to /usr/lib/systemd/system/DmWatcherServiceWatcher.service.
    Finished to create the service (DmWatcherServiceWatcher)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2 配置 B 机器

    2.2.1 初始化实例

    [dmdba@localhost ~]$ /dmdb8/dmdbms/bin/dminit PATH=/dmdb8/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 CASE_SENSITIVE=0 CHARSET=1 LENGTH_IN_CHAR=0  INSTANCE_NAME=top02 PORT_NUM=5236
    
    参数解释
    PAGE_SIZE:
    EXTENT_SIZE:
    LOG_SIZE:日志文件大小
    CASE_SENSITIVE:建议从 MYSQL 和 SQLSERVER 迁移过来的系统,使用大小写不敏感,ORACLE 迁移过来的系统,使用大小写敏感,默认为区分。取值:Y、y、1 表示敏感;N、n、0 表示不敏感。默认值为 Y 。
    CHARSET/UNICODE_FLAG:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。默认为 0
    DB_NAME:初始化数据库名称,默认为 DAMENG
    INSTANCE_NAME:初始化数据库实例名称,默认为 DMSERVER
    PORT_NUM:数据库端口号,默认5236
    LENGTH_IN_CHAR:VARCHAR 类型对象的长度是否以字符为单位。取值为 1 或者 Y 表示是,取值为 0 或 N 表示否。默认值为 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    特此说明:达梦的字段一般都是大写的,但是程序中写的sql都是小写。大小写是否敏感需要和开发确认,本案例中都是不敏感

    2.2.2 恢复数据

    [dmdba@~]$ /dmdb8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdb8/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmdb8/dmbak/BACKUP_FILE'"
    
    [dmdba@~]$ /dmdb8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdb8/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmdb8/dmbak/BACKUP_FILE'"
    
    [dmdba@~]$ /dmdb8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdb8/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2.3 替换 dmarch.ini

    [dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmarch.ini
    
    ARCH_WAIT_APPLY            = 0  #0:高性能  1:事务一致
    
    [ARCHIVE_LOCAL]
    ARCH_TYPE                = LOCAL  #本地归档类型
    ARCH_DEST                = /dmdb8/dmarch/DAMENG  #本地归档存放路径
    ARCH_FILE_SIZE           = 1024  #单个归档大小,单位 MB
    ARCH_SPACE_LIMIT         = 51200  #归档上限,单位 MB
    
    [ARCHIVE_REALTIME1]
    ARCH_TYPE                = REALTIME  #实时归档类型
    ARCH_DEST                = top01  #实时归档目标实例名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.2.4 配置 dm.ini、dmmal.ini 和 dmwatcher.ini

    配置 dm.ini

    在 B 机器上配置备库的实例名为 top02,dm.ini 参数修改如下:

    vi /dmdb8/dmdata/DAMENG/dm.ini
    INSTANCE_NAME  = top02
    PORT_NUM = 5236                               #数据库实例监听端口
    DW_INACTIVE_INTERVAL = 60              #接收守护进程消息超时时间
    ALTER_MODE_STATUS = 0                     #不允许手工方式修改实例模式/状态/OGUID
    ENABLE_OFFLINE_TS  = 2                      #不允许备库 OFFLINE 表空间
    MAL_INI = 1                                           #打开 MAL 系统
    ARCH_INI = 1                                         #打开归档配置
    RLOG_SEND_APPLY_MON = 64             #统计最近 64 次的日志重演信息
    或
    SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
    SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);  --接收守护进程消息超时时间
    SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);      --不允许手工方式修改实例模式/状态/OGUID
    SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);      --不允许备库OFFLINE表空间
    SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);                --打开MAL系统
    SQL> SP_SET_PARA_VALUE (2,'ARCH_INI',1);                --打开归档配置
    SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);   --统计最近64次的日志发送信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    配置 dmmal.ini 和 dmwatcher.ini

    B 机器里 dmmal.ini、dmwatcher.ini 与 A 机器 top01 的 dmmal.ini、dmwatcher.ini 相同,参照 A 机器 dmmal.ini、dmwatcher.ini 文件进行配置。
    补充:
    主备库的dmmal.ini配置是一致的;dmwatcher.ini里主备的配置文件路径、命令行方式启动的路径一致的话,dmwatcher.ini一致,建议相关路径一致;特殊情况备库RLOG_APPLY_THRESHOLD 如指定备库重演日志的时间阈值,如果有需要开启的话,需在备库配置。

    2.2.5 注册服务

    [root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p top02 -dm_ini /dmdb8/dmdata/DAMENG/dm.ini -m mount
    
    [root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdb8/dmdata/DAMENG/dmwatcher.ini
    
    • 1
    • 2
    • 3

    若要删除自启,可利用如下方式:

    [root@~]# /dmdb8/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceGRP1_RT_02
    
    [root@~]# /dmdb8/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
    
    • 1
    • 2
    • 3

    注册服务过程:

    [root@localhost dmarch]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p top02 -dm_ini /dmdb8/dmdata/DAMENG/dm.ini -m mount
    Created symlink from /etc/systemd/system/multi-user.target.wants/DmServicetop02.service to /usr/lib/systemd/system/DmServicetop02.service.
    Finished to create the service (DmServicetop02)
    [root@localhost bin]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdb8/dmdata/DAMENG/dmwatcher.ini
    Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceWatcher.service to /usr/lib/systemd/system/DmWatcherServiceWatcher.service.
    Finished to create the service (DmWatcherServiceWatcher)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3 配置监视器

    • 手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。
    • 自动切换:在确认监视器上(非集群节点),存放确认监视器配置文件,并注册后台自启服务。

    2.3.1 创建 dmmonitor.ini

    [dmdba@~]$ vi /dmdb8/dmdbms/bin/dmmonitor.ini
    
    MON_DW_CONFIRM             = 0  #0:非确认(故障手切) 1:确认(故障自切)
    MON_LOG_PATH               = ../log  #监视器日志文件存放路径
    MON_LOG_INTERVAL           = 60  #每隔 60s 定时记录系统信息到日志文件
    MON_LOG_FILE_SIZE          = 512  #单个日志大小,单位 MB
    MON_LOG_SPACE_LIMIT        = 2048  #日志上限,单位 MB
    
    [GRP1]
    MON_INST_OGUID           = 45331  #组 GRP1 的唯一 OGUID 值
    MON_DW_IP                = 192.168.183.100:5436  #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
    MON_DW_IP                = 192.168.183.120:5436
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    同步传输 dmmonitor.ini至192.168.40.160备节点

    scp /dmdb8/dmdbms/bin/dmmonitor.ini dmdba@192.168.40.160:/dmdb8/dmdbms/bin/dmmonitor.ini
    
    • 1

    2.3.2 注册服务(选做)

    [root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /dmdb8/dmdbms/bin/dmmonitor.ini
    
    • 1

    若要删除自启,可利用如下方式:

    [root@~]# /dmdb8/dmdbms/script/root/dm_service_uninstaller.sh -n DmMonitorServiceMonitor
    
    • 1

    脚本注册过程:

    [root@localhost bin]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /dmdb8/dmdbms/bin/dmmonitor.ini
    Created symlink from /etc/systemd/system/multi-user.target.wants/DmMonitorServiceMonitor.service to /usr/lib/systemd/system/DmMonitorServiceMonitor.service.
    Finished to create the service (DmMonitorServiceMonitor)
    
    • 1
    • 2
    • 3

    2.3.3 监视器使用

    进入监视器。
    安装目录的bin目录下 ./dmmonitor 加上dmmonitor.ini路径
    若ini也在bin目录,可直接执行 ./dmmonitor dmmonitor.ini

    cd /dmdb8/dmdbms/bin
    ./dmmonitor /dmdb8/dmdbms/bin/dmmonitor.ini
    
    • 1
    • 2

    可视情况执行如下命令:

    命令含义
    list查看守护进程的配置信息
    show global info查看所有实例组的信息
    tip查看系统当前运行状态
    login登录监视器
    logout退出登录
    choose switchoverGRP1主机正常:查看可切换为主机的实例列表
    switchoverGRP1.实例名主机正常:使用指定组的指定实例,切换为主机
    choose takeoverGRP1主机故障:查看可切换为主机的实例列表
    takeoverGRP1.实例名主机故障:使用指定组的指定实例,切换为主机
    choose takeover force GRP1强制切换:查看可切换为主机的实例列表
    takeover force GRP1.实例名强制切换:使用指定组的指定实例,切换为主机

    主机故障后,在备机执行 SELECT SF_DW_CHECK_TAKEOVER(); 【1:可接管;0:不可接管】。

    2.4 启动服务及查看信息

    2.4.1 启动数据库并修改参数

    ##A 机器
    [dmdba@~]$ /dmdb8/dmdbms/bin/DmServicetop01 start
    [dmdba@~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.150:5236
    SQL> SP_SET_OGUID(45331);
    SQL> ALTER DATABASE PRIMARY;
    
    ##B 机器
    [dmdba@~]$ /dmdb8/dmdbms/bin/DmServicetop02 start
    [dmdba@~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.160:5236
    SQL> SP_SET_OGUID(45331);
    SQL> ALTER DATABASE STANDBY;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.4.2 启动守护进程

    ##A/B机器
    [dmdba@~]$ /dmdb8/dmdbms/bin/DmWatcherServiceWatcher start
    
    • 1
    • 2

    2.4.3 启动监视器

    ##后台启动
    [dmdba@~]$ /dmdb8/dmdbms/bin/DmMonitorServiceMonitor start
    
    ##前台启动
    [dmdba@~]$ /dmdb8/dmdbms/bin/dmmonitor /dmdb8/dmdbms/bin/dmmonitor.ini
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.5 启停集群

    ##启动
    ##A/B 机器
    [dmdba@~]$ /dmdb8/dmdbms/bin/DmWatcherServiceWatcher start
    
    ##停止
    ##A/B机器
    [dmdba@~]$ /dmdb8/dmdbms/bin/DmWatcherServiceWatcher stop
    ##A 机器
    [dmdba@~]$ /dmdb8/dmdbms/bin/DmServicetop01 stop
    ##B机器
    [dmdba@~]$ /dmdb8/dmdbms/bin/DmServicetop02 stop
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.6.构建数据同步

    读写分离和数据守护集群备库均是只读库

    --主库创建
    /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.150:5236
    create table test2(id int);
    insert into test2 values(10);
    commit;
    
    --备库查看
    select * from test2;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    三.dm_svc.conf 配置

    3.1 简介

    dm_svc.conf 是使用达梦数据库时非常重要的配置文件,它包含了达梦各接口和客户端工具所需要配置的一些参数。通过它可以实现达梦各种集群的读写分离和均衡负载,且必须和接口/客户端工具位于同一台机器上才能生效。
    初始 dm_svc.conf 文件由达梦安装时自动生成。不同的平台生成目录有所不同,注意相应访问用户需要对该文件有读取权限。

    • 32 位的 DM 安装在 Win32 操作平台下,此文件位于 %SystemRoot%\system32 目录;
    • 64 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\system32 目录;
    • 32 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\SysWOW64 目录;
    • 在 Linux 平台下,此文件位于 /etc 目录。

    但在某些情况下,所使用的用户没有读取和修改 /etc 目录下文件的权限,这时就需要将 dm_svc.conf 文件放到有权限的目录下,并修改 url 连接串的内容。以 Linux 平台,文件放在 /home/dmdba 目录下为例:

    • 在 /home/dmdba 目录下,编辑 dm_svc.conf 文件:
    TIME_ZONE=(480)
    LANGUAGE=(cn)
    dm=(ip:端口)
    [dm]
    KEYWORDS=(需要排除的关键字)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 修改连接串
    jdbc:dm://dm?dmsvcconf=/home/dmdba/dm_svc.conf
    
    • 1

    dm_svc.conf 配置文件的内容分为全局配置区和服务配置区。全局配置区在前,可配置所有的配置项,服务配置区在后,以“[服务名]”开头,可配置除了服务名外的所有配置项。服务配置区中的配置优先级高于全局配置区(服务配置区的相同配置项会覆盖全局配置区对应的配置项)。

    3.2 常用配置项介绍

    • 服务名

    用于连接数据库的服务名,参数值格式为:
    服务名=(IP[:PORT],IP[:PORT],…)。

    • TIME_ZONE

    指明客户端的默认时区设置范围为:-779~840M,如 60 对应 +1:00 时区,+480 对于东八区,如果不做配置默认是操作系统的时区。

    • KEYWORDS

    该参数可以用于屏蔽数据库关键字,如果数据库关键字在 SQL 语句中以单词的形式存在,无法识别需要加上双引号或者可以通过该参数来屏蔽关键字,建议大小写都写入参数中。
    例如:KEYWORDS=(versions,VERSIONS,type,TYPE)

    • LOGIN_MODE

    指定优先登录的服务器模式。0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
    注意
    在 2021 年版本之后,此参数的默认值由 0 变更为 4。该参数详细介绍及使用办法请参考《DM 数据守护与读写分离集群》-5.8 章节。手册位于数据库安装路径 /dmdbms/doc 文件夹。

    • SWITCH_TIMES

    表示以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。有效值范围 1~9223372036854775807,默认值为 1,可以设置至少 3 次用来避免由于网卡的波动,造成数据库连接测频繁切换。

    • SWITCH_INTERVAL

    表示在服务器之间切换的时间间隔,单位为毫秒,有效值范围 1~9223372036854775807。与参数 SWITCH_TIMES、EP_SELECTOR 配合使用,EP_SELECTOR 设置为 0,等待 SWITCH_INTERVAL 后会切换尝试连接下一个服务器,EP_SELECTOR 设置为 1,等待 SWITCH_INTERVAL 后会继续尝试连接该服务器,直到 SWITCH_TIMES 次再切换下一个服务器。

    • EP_SELECTOR

    表示连接数据库时采用何种模型建立连接,0:依次选取列表中的不同节点建立连接,使得所有连接均匀地分布在各个节点上;1:选择列表中最前面的节点建立连接,只有当前节点无法建立连接时才会选择下一个节点进行连接。缺省值0

    • AUTO_RECONNECT

    表示连接发生异常或一些特殊场景下连接处理策略。0:关闭连接,1:当连接发生异常时自动切换到其他库,无论切换成功还是失败都会抛一个 SQLEXCEPTION,用于通知上层应用进行事务执行失败时的相关处理;2 配合 EP_SELECTOR=1 使用,如果服务名列表前面的节点恢复了,将当前连接切换到前面的节点上,可以根据应用的实际要求设定。缺省值0

    3.3 常用配置

    3.3.1 单机配置

    配置示例

    ##以#开头的行表示是注释
    ##全局配置区
    TIME_ZONE=(480)
    LANGUAGE=(cn)
    DM=(192.168.40.160:5236)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    连接示例:

    • Disql 连接:
    [dmdba@localhost~]$/dmsoft/dmdbms/disql SYSDBA/SYSDBA@DM
    
    • 1
    • 通过管理工具连接:

    image.png

    3.3.2 主备集群配置

    • 备库配置示例
    cat /etc/dm_svc.conf
    ##以#开头的行表示是注释#
    ##全局配置区
    TIME_ZONE=(480)
    LANGUAGE=(cn)
    DMHA=(192.168.40.150:5236,192.168.40.160:5236)
    ##服务配置
    [DMHA]
    LOGIN_MODE=(1)  #0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
    SWITCH_TIMES=(60) #以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。
    SWITCH_INTERVAL=(1000) #在服务器之间切换的时间间隔,单位为毫秒
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.客户端配置
    win64:C:\Windows\System32\dm_svc.conf

    ##以#开头的行表示是注释
    ##全局配置区
    TIME_ZONE=(480)  #指明客户端的默认时区 +480东八区
    LANGUAGE=(en)
    DMRW=(192.168.40.130:5236,192.168.40.140:5236)
    ##服务配置
    [DMRW]
    LOGIN_MODE=(1)  #0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
    RW_SEPARATE=(1) #是否启用读写分离。0:不启用;1:启用;2:启用,备库由客户端进行选择,且只会选择服务名中配置的节点。
    RW_PERCENT=(30) #读写分离分发比例,有效值范围 0~100,主库占所有事物数的比例
    SWITCH_TIMES=(60) #以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。
    SWITCH_INTERVAL=(1000) #在服务器之间切换的时间间隔,单位为毫秒
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.manager连接工具连接
    image.png

    • jdbc 连接串
    jdbc:dm://DMHA
    
    • 1

    四.补充:读写分离和数据守护的配置差异

    dm_svc.conf配置

    同步逻辑是几乎一样,区别主要在于事务分发即读写分离分发比例
    读写分离集群可通过配置dm_svc.conf实现事务分发,数据守护没有。

    读写分离集群

    cat /etc/dm_svc.conf
    ##以#开头的行表示是注释
    ##全局配置区
    TIME_ZONE=(480)  #指明客户端的默认时区 +480东八区
    LANGUAGE=(en)
    DMRW=(192.168.40.130:5236,192.168.40.140:5236)
    ##服务配置
    [DMRW]
    LOGIN_MODE=(1)  #0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
    RW_SEPARATE=(1) #是否启用读写分离。0:不启用;1:启用;2:启用,备库由客户端进行选择,且只会选择服务名中配置的节点。
    RW_PERCENT=(30) #读写分离分发比例,有效值范围 0~100,主库占所有事物数的比例
    SWITCH_TIMES=(60) #以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。
    SWITCH_INTERVAL=(1000) #在服务器之间切换的时间间隔,单位为毫秒
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    数据守护集群

    cat /etc/dm_svc.conf
    ##以#开头的行表示是注释#
    ##全局配置区
    TIME_ZONE=(480)
    LANGUAGE=(cn)
    DMHA=(192.168.40.150:5236,192.168.40.160:5236)
    ##服务配置
    [DMHA]
    LOGIN_MODE=(1)  #0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
    SWITCH_TIMES=(60) #以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。
    SWITCH_INTERVAL=(1000) #在服务器之间切换的时间间隔,单位为毫秒
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    dmarch.ini

    读写分离集群

    即时归档

    [dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmarch.ini
    
    ARCH_WAIT_APPLY            = 0  #0:高性能   1:事务一致 
    [ARCHIVE_LOCAL]
    ARCH_TYPE                = LOCAL  #本地归档类型
    ARCH_DEST                = /dmdb8/dmarch/DAMENG   #本地归档存放路径
    ARCH_FILE_SIZE           = 1024  #单个归档大小,单位 MB
    ARCH_SPACE_LIMIT         = 51200  #归档上限,单位 MB
    
    [ARCHIVE_TIMELY1]
    ARCH_TYPE                = TIMELY  #即时归档类型
    ARCH_DEST                = top02   #即时归档目标实例名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    数据守护集群

    [dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmarch.ini
    
    ARCH_WAIT_APPLY            = 0   #0:高性能 1:事务一致
    [ARCHIVE_LOCAL]
    ARCH_TYPE                = LOCAL  #本地归档类型
    ARCH_DEST                = /dmdb8/dmarch/DAMENG  #本地归档存放路径
    ARCH_FILE_SIZE           = 1024  #单个归档大小,单位 MB
    ARCH_SPACE_LIMIT         = 51200  #归档上限,单位 MB
    
    [ARCHIVE_REALTIME1]
    ARCH_TYPE                = REALTIME  #实时归档类型
    ARCH_DEST                = top02  #实时归档目标实例名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    五.问题处理

    问题1.初始化报错

    问题描述

    [root@localhost dmdata]# /dmdb8/dmdbms/bin/dminit PATH=/dmdb8/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 CASE_SENSITIVE=0 CHARSET=1 LENGTH_IN_CHAR=0  INSTANCE_NAME=top01 PORT_NUM=5236
    /dmdb8/dmdbms/bin/dminit: error while loading shared libraries: libdmnsort.so: cannot open shared object file: No such file or directory
    
    • 1
    • 2

    解决办法

    切换到dmdba用户下执行

    问题2

    问题描述

    备节点RSTAT 字段为INVALID

    --注册创建测试表登录备库查看没有,查看所有实例组的信息
    <>
    DW_IP               MAL_DW_PORT  WTIME                WTYPE     WCTLSTAT  WSTATUS        INAME            INST_OK   N_EP  N_OK  ISTATUS     IMODE     DSC_STATUS     RTYPE     RSTAT    
    192.168.183.100     5436         2023-11-15 15:16:26  GLOBAL    VALID     OPEN           TOP01            OK        1     1     OPEN        PRIMARY   DSC_OPEN       REALTIME  VALID    
    
    DW_IP               MAL_DW_PORT  WTIME                WTYPE     WCTLSTAT  WSTATUS        INAME            INST_OK   N_EP  N_OK  ISTATUS     IMODE     DSC_STATUS     RTYPE     RSTAT    
    192.168.183.120     5436         2023-11-15 15:16:26  GLOBAL    VALID     OPEN           TOP02            OK        1     1     OPEN        STANDBY   DSC_OPEN       REALTIME  INVALID 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    问题分析

    解决办法

    问题3:主库启库失败:Dmwatcher is active, or current configuration(ALTER_MODE_STATUS) not allowed

    SQL> alter database open;
    alter database open;
    [-720]:Error in line: 1
    Dmwatcher is active, or current configuration(ALTER_MODE_STATUS) not allowed to alter database.
    used time: 0.487(ms). Execute id is 0.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    问题描述

    SQL> alter database open;
    alter database open;
    [-720]:Error in line: 1
    Dmwatcher is active, or current configuration(ALTER_MODE_STATUS) not allowed to alter database.
    used time: 0.487(ms). Execute id is 0.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    问题分析

    --登录数据库
    /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.150:5236
    
    --查询主库状态
    select * from v$instance;
    或
    SQL> select instance_name,host_name,STATUS$,MODE$,oguid from v$instance;
    
    LINEID     instance_name host_name             STATUS$ MODE$   oguid      
    ---------- ------------- --------------------- ------- ------- -----------
    1          TOP01         localhost.localdomain MOUNT   PRIMARY 45331
    
    used time: 2.351(ms). Execute id is 100.
    
    
    --在主库上启动守护进程
    [dmdba@localhost DAMENG]$ /dmdb8/dmdbms/bin/dmwatcher /dmdb8/dmdata/DAMENG/dmwatcher.ini 
    DMWATCHER[4.0] V8
    DMWATCHER[4.0] IS READY
    
    --再次查看主库的状态,主库仍然处于mount状态
    SQL> select instance_name,host_name,STATUS$,MODE$,oguid from v$instance;
    
    LINEID     instance_name host_name             STATUS$ MODE$   oguid      
    ---------- ------------- --------------------- ------- ------- -----------
    1          TOP01         localhost.localdomain MOUNT   PRIMARY 45331
    
    used time: 2.351(ms). Execute id is 100.
    
    --查看主库的dmwatcher日志
    cd /dmdb8/dmdbms/log/
    tail -300f dm_dmwatcher_TOP01_202311.log
    2023-11-15 16:50:08.382 [INFO] dmwatcher P0000015451 T0000000000000015451  DMWATCHER[4.0] IS READY
    2023-11-15 16:50:08.382 [INFO] dmwatcher P0000015451 T0000000000000015451  [for dem]SYSTEM IS READY.
    2023-11-15 16:50:09.387 [ERROR] dmwatcher P0000015451 T0000000000000015456  Can't connect to DM server on '192.168.183.120' port(5436) errno(111)
    2023-11-15 16:50:09.387 [INFO] dmwatcher P0000015451 T0000000000000015455  dw2_send_port_set to dmserver vio(5) set, mid(-1), to name:TOP01, ip:127.0.0.1
    2023-11-15 16:50:10.390 [INFO] dmwatcher P0000015451 T0000000000000015465  dw2_group_process_svr_info_low, receive ep(seqno:0, master:0, n_ok:0) message, change ep(TOP01) status from ERROR to OK.
    2023-11-15 16:50:10.390 [INFO] dmwatcher P0000015451 T0000000000000015465  Local db apply info changed, old info[p_db_magic:0, n_apply_ep:0], new info to set[p_db_magic:516106148, n_apply_ep:0]!
    2023-11-15 16:50:10.391 [INFO] dmwatcher P0000015451 T0000000000000015465  dw2_process_ohis_info, n_ohis changed from 0 to 4, from_ep:TOP01, ep_seqno:0, hpc_master:0
    2023-11-15 16:50:10.391 [INFO] dmwatcher P0000015451 T0000000000000015465  dw2_process_ohis_info local apply info, p_db_magic:516106148, n_apply_ep:0, n_fill_ep:1 pkg_seq_arr:[4779, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], apply_lsn_arr:[39068, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]!
    2023-11-15 16:50:10.391 [INFO] dmwatcher P0000015451 T0000000000000015465  Server(TOP01) public key changed, broadcast new value to monitor
    2023-11-15 16:51:45.091 [INFO] dmwatcher P0000015451 T0000000000000015463  DMWATCHER[4.0] SHUTDOWN START...
    2023-11-15 16:51:45.091 [INFO] dmwatcher P0000015451 T0000000000000015463  DMWATCHER[4.0] SHUTDOWN.
    2023-11-15 16:51:45.091 [INFO] dmwatcher P0000015451 T0000000000000015463  DMWATCHER[4.0] group(GRP1) shutdown SUCCEED.
    
    2023-11-15 16:51:45.091 [INFO] dmwatcher P0000015451 T0000000000000015463  [for dem]SYSTEM SHUTDOWN SUCCESS.
    2023-11-15 16:51:45.091 [INFO] dmwatcher P0000015451 T0000000000000015463  dw2_tcp_port_close_low, reset report_err to TRUE, ip:192.168.183.120, port:5436!
    2023-11-15 16:51:45.605 [WARNING] dmwatcher P0000015451 T0000000000000015465  Tcp port from dmserver vio(5) close, ip:127.0.0.1, port:5536, mid(-1), is confirm(FALSE), from name:TOP01
    2023-11-15 16:51:45.605 [INFO] dmwatcher P0000015451 T0000000000000015465  dw2_tcp_port_close_low, reset report_err to TRUE, ip:127.0.0.1, port:5536!
    2023-11-15 16:51:45.643 [ERROR] dmwatcher P0000015451 T0000000000000015456  Can't connect to DM server on '192.168.183.120' port(5436) errno(111)
    
    
    --主库上检查ip port
    [dmdba@localhost log]$ telnet 192.168.183.120 5436
    Trying 192.168.183.120...
    telnet: connect to address 192.168.183.120: Connection refused
    
    --检查主备库上端口是否开启  发现主备库均未有该端口
    lsof -i:5436
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    192.168.183.120’ port(5436) 可以分析心跳网络不通,MAL 守护进程端口5436是由dmwatcher进程开启,于是想到备库的dmwatcher进程未启动,在备库上启动dmwatcher进程。

    解决办法

    --启动主库、备库dmwatcher
    [dmdba@localhost log]$ /dmdb8/dmdbms/bin/DmWatcherServiceWatcher start
    Starting DmWatcherServiceWatcher:                          [ OK ]
    [dmdba@localhost log]$ lsof -i:5436
    COMMAND     PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    dmwatcher 16157 dmdba    4u  IPv6 111776      0t0  TCP *:5436 (LISTEN)
    
    --再次查看主库状态
    [dmdba@localhost ~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.150:5236
    
    Server[192.168.40.150:5236]:mode is primary, state is mount
    login used time : 4.204(ms)
    disql V8
    SQL> select instance_name,host_name,STATUS$,MODE$,oguid from v$instance;
    
    LINEID     instance_name host_name             STATUS$ MODE$   oguid      
    ---------- ------------- --------------------- ------- ------- -----------
    1          TOP01         localhost.localdomain OPEN    PRIMARY 45331
    
    used time: 0.313(ms). Execute id is 101.
    
    
    --查看备库状态
    [dmdba@localhost log]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.160:5236
    
    Server[192.168.40.160:5236]:mode is standby, state is open
    login used time : 4.269(ms)
    disql V8
    SQL> select instance_name,host_name,STATUS$,MODE$,oguid from v$instance;
    
    LINEID     instance_name host_name             STATUS$ MODE$   oguid      
    ---------- ------------- --------------------- ------- ------- -----------
    1          TOP02         localhost.localdomain OPEN    STANDBY 45331
    
    used time: 3.240(ms). Execute id is 0.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    问题4:备库不同步主库数据

    问题描述

    主库创建测试数据,备库查不到。

    --主库
    构建测试数据
    [dmdba@localhost DAMENG]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.150:5236
    SQL> create table test2(id int);
    executed successfully
    used time: 14.481(ms). Execute id is 1000.
    
    --备库
    [dmdba@localhost log]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.160:5236
    SQL> select * from test1;
    select * from test1;
    [-2106]:Error in line: 1
    Invalid table or view name [test1].
    used time: 0.208(ms). Execute id is 0.
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    问题分析

    主库向备库实时同步归档日志报错

    [dmdba@localhost log]$ cd /dmdb8/dmdbms/log  #达梦的日志都在安装目录log下
    [dmdba@localhost log]$ ls -lhtr   #按时间倒序排
    total 1.0M
    -rw-r--r--. 1 dmdba dinstall 347K Nov 15 13:45 install_ant.log
    -rwxr-xr-x. 1 dmdba dinstall  504 Nov 15 13:45 install.log
    -rw-r--r--. 1 dmdba dinstall    0 Nov 15 13:45 DmAPService.log
    -rw-r--r--. 1 dmdba dinstall  616 Nov 15 13:57 dm_dmap_202311.log
    -rw-r--r--. 1 dmdba dinstall  395 Nov 15 13:57 dm_dmap_br_202311.log
    -rw-r--r--. 1 dmdba dinstall 6.1K Nov 15 13:57 dm_BAKRES_202311.log
    -rw-r--r--. 1 dmdba dinstall    0 Nov 15 16:07 DmServicetop01.log
    -rw-r--r--. 1 dmdba dinstall    0 Nov 15 16:22 DmWatcherServiceWatcher.log
    -rw-r--r--. 1 dmdba dinstall    0 Nov 15 16:23 DmMonitorServiceMonitor.log
    -rw-r--r--. 1 dmdba dinstall 228K Nov 15 16:23 dmmonitor_20231115150030.log
    -rwxr-xr-x. 1 dmdba dinstall 5.1K Nov 15 16:32 dm_unknown_202311.log
    -rw-r--r--. 1 dmdba dinstall 3.0K Nov 15 17:02 dmsvc_sh.log
    -rw-r--r--. 1 dmdba dinstall 124K Nov 15 17:35 dm_dmwatcher_TOP01_202311.log
    -rw-r--r--. 1 dmdba dinstall 292K Nov 15 17:41 dm_TOP01_202311.log
    
    --查看数据库实例日志
    [dmdba@localhost log]$ tail -300f dm_TOP01_202311.log
    ...
    2023-11-15 17:04:50.977 [INFO] database P0000014507 T0000000000000014557  utsk_cmd_exec, cmd:210, sys_status:OPEN, dseq:1700037153
    2023-11-15 17:04:50.979 [INFO] database P0000014507 T0000000000000014557  rarch_sync_process from mal_site(1): n_apply_ep=1, apply_seq_arr[0]=4725, apply_lsn_arr[0]=38121
    2023-11-15 17:04:50.979 [ERROR] database P0000014507 T0000000000000014557  rafil_collect_by_dsc_seqno failed, rfil(/dmdb8/dmarch/DAMENG/ARCHIVE_LOCAL1_0x1EC327A4_EP0_2023-11-15_17-04-40.log)->arch_seq(4780) > apply_seq_arr[0](4725) + 1, return -718.
    2023-11-15 17:04:50.979 [ERROR] database P0000014507 T0000000000000014557  rarch_sync_process, rafil_collect_by_dsc_seqno failed, code=-718
    ...
    
    --查看归档目录  发现更改时间均是今天的时间,推测是更改过归档目录
    [dmdba@localhost dmdb8]$ cd dmarch/
    [dmdba@localhost dmarch]$ ls -l
    total 44
    -rw-r--r--. 1 dmdba dinstall 44032 Nov 15 14:00 ARCHIVE_LOCAL1_0x1EC327A4_EP0_2023-11-15_13-56-35.log
    drwxr-xr-x. 2 dmdba dinstall    67 Nov 15 17:04 DAMENG
    drwxr-xr-x. 2 dmdba dinstall   128 Nov 15 16:08 top01
    
    [dmdba@localhost dmarch]$ cd top01/
    [dmdba@localhost top01]$ ls -l
    total 124
    -rw-r--r--. 1 dmdba dinstall 89600 Nov 15 16:07 ARCHIVE_LOCAL1_0x1EC327A4_EP0_2023-11-15_14-59-59.log
    -rw-r--r--. 1 dmdba dinstall 35328 Nov 15 16:27 ARCHIVE_LOCAL1_0x1EC327A4_EP0_2023-11-15_16-08-23.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    问题处理

    将/dmdb8/dmarch/top01目录下归档文件移动到/dmdb8/dmarch/DAMENG目录下,主库上手动切日志,查看备库数据已同步。

    --移动今天的归档文件至/dmdb8/dmarch/DAMENG目录下
    [dmdba@localhost dmarch]$ mv ARCHIVE_LOCAL1_0x1EC327A4_EP0_2023-11-15_13-56-35.log DAMENG/
    [dmdba@localhost dmarch]$ cd top01/
    [dmdba@localhost top01]$ ls -l
    total 124
    -rw-r--r--. 1 dmdba dinstall 89600 Nov 15 16:07 ARCHIVE_LOCAL1_0x1EC327A4_EP0_2023-11-15_14-59-59.log
    -rw-r--r--. 1 dmdba dinstall 35328 Nov 15 16:27 ARCHIVE_LOCAL1_0x1EC327A4_EP0_2023-11-15_16-08-23.log
    [dmdba@localhost top01]$ mv *.log ../DAMENG/
    
    --再次查看数据库实例日志  已实时归档同步已成功reset all async send info success
    [dmdba@localhost log]$ tail -300f dm_TOP01_202311.log
    ...
    2023-11-15 17:34:18.211 [INFO] database P0000014507 T0000000000000014536  rafil_close_with_trunc file[/dmdb8/dmarch/DAMENG/ARCHIVE_LOCAL1_0x1EC327A4_EP0_2023-11-15_17-04-40.log] to 43008 len, g_next_seq:4798, ret = 1!
    2023-11-15 17:34:18.211 [INFO] database P0000014507 T0000000000000014536  rfil_close_low set arch rfil[/dmdb8/dmarch/DAMENG/ARCHIVE_LOCAL1_0x1EC327A4_EP0_2023-11-15_17-04-40.log]'s sta to inactive, l_next_seq = 4798, g_next_seq = 4798, clsn = 39309, handle = 52, free=43008, len=43008
    2023-11-15 17:34:50.654 [INFO] database P0000014507 T0000000000000016172  utsk_cmd_add, cmd info: cmd=217, dseq=1700037155, name_in=, begin_lsn=-1!
    2023-11-15 17:34:50.654 [INFO] database P0000014507 T0000000000000016172  utsk_set_global_dw_stat, begin, msg_dseq:1700037155
    2023-11-15 17:34:50.654 [INFO] database P0000014507 T0000000000000016172  set g_dw_stat from NONE to DW_RECOVERY success, g_dw_recover_stop is 0
    2023-11-15 17:34:50.654 [INFO] database P0000014507 T0000000000000016172  rarch_set_async_send_info, reset total_rpkg and total_time_used.
    2023-11-15 17:34:50.655 [INFO] database P0000014507 T0000000000000016172  utsk_set_global_dw_stat, reset all async send info success.
    2023-11-15 17:34:50.655 [INFO] database P0000014507 T0000000000000016172  utsk_set_global_dw_stat, finished, msg_dseq:1700037155, set code:0
    2023-11-15 17:34:51.657 [INFO] database P0000014507 T0000000000000016172  utsk_cmd_add, cmd info: cmd=217, dseq=1700037156, name_in=, begin_lsn=-1!
    ...
    
    --备库中查数据,发现先前创建的表都已经同步到备库
    SQL> select * from test2;
    no rows
    
    used time: 1.853(ms). Execute id is 1.
    SQL> select * from test1;
    no rows
    
    used time: 0.557(ms). Execute id is 2.
    SQL> select * from test;
    no rows
    
    used time: 1.108(ms). Execute id is 3.
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    问题5.读写分离架构下数据库连接工具连接失败

    问题描述

    主备、客户端/etc/dm_svc.conf 文件配置如下:
    [dmdba@localhost ~]$ cat /etc/dm_svc.conf 
    ##全局配置区
    TIME_ZONE=(480)  #指明客户端的默认时区 +480东八区
    LANGUAGE=(en)
    DMRW=(192.168.40.130:5236,192.168.40.140:5236)
    ##服务配置
    [DMRW]
    LOGIN_MODE=(1)  #0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
    RW_SEPARATE=(1) #是否启用读写分离。0:不启用;1:启用;2:启用,备库由客户端进行选择,且只会选择服务名中配置的节点。
    RW_PERCENT=(30) #读写分离分发比例,有效值范围 0~100,主库占所有事物数的比例
    SWITCH_TIMES=(60) #以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。
    SWITCH_INTERVAL=(1000) #在服务器之间切换的时间间隔,单位为毫秒
    
    --服务器上访问正常
    [dmdba@localhost ~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@DMRW
    
    Server[192.168.40.130:5236]:mode is primary, state is open
    login used time : 10.786(ms)
    disql V8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    解决办法

    客户端需配置
    win64:C:\Windows\System32\dm_svc.conf
    配置后manager连接工具需重启
    补充说明:需要连接的服务器都需要dm_svc.conf,例如数据库在1、2服务器上,应用在3,在4机器上使用manager,那么1234都需要放,否则没法通过集群方式连接

    参考链接:https://blog.csdn.net/chenlinlong/article/details/120747315

  • 相关阅读:
    [C++基础]-继承
    开源软件的国际化和本地化
    【C++】继承 ⑫ ( 继承的二义性 | virtual 虚继承 )
    数据治理-数据仓库和商务智能
    【数据结构】二叉树--堆排序
    H3C WX2510h无线控制器如何网关式部署无线网络
    C++模板与STL(一):模板基础与STL仿真复现
    图神经网络 图像处理,为什么用图神经网络
    计算机视觉五大核心研究任务全解:分类识别、检测分割、人体分析、三维视觉、视频分析
    YOLO V1学习笔记
  • 原文地址:https://blog.csdn.net/qq961573863/article/details/134428311