监视器(dmmonitor)是基于监视器接口(详见 9.2 监视器接口)实现的一个命令行工具,是 DM 数据守护系统的重要组成部分。
通过监视器,可以监控数据守护系统的运行情况,获取主备库状态、守护进程状态以及主备库数据同步情况等信息。同时,监视器(dmmonitor)还提供了一系列命令来管理数据守护系统。
监视器的基本作用如下:
- 监控数据守护系统
接收守护进程发送的消息,显示主、备数据库状态变化,以及故障切换过程中,数据库模式、状态变化的完整过程。
- 管理数据守护系统
用户可以在监视器上输入命令,启动、停止守护进程的监控功能,执行主备库切换、备库故障接管等操作。
- 确认状态信息
用于故障自动切换的数据守护系统中,主、备库进行故障处理之前,需要通过监视器进行信息确认,确保对应的备库或者主库是真的产生异常了,避免主备库之间网络故障引发脑裂。
- 发起故障自动接管命令
用于故障自动切换的数据守护系统中,主库发生故障时,挑选符合接管条件的备库,并通知备库执行接管操作。
注意对于实时主备和读写分离集群,监视器只允许配置一个守护进程组;MPP主备允许配置多组,并且要求这些组的主库必须是同一套MPP系统;
监视器分为两种类型:普通监视器和确认监视器。监视器类型由配置文件(dmmonitor.ini)的 MON_DW_CONFIRM 参数来确定。MON_DW_CONFIRM 参数的默认值是 0,表示普通监视器;MON_DW_CONFIRM 参数值为 1 时,表示确认监视器。
用户可根据实际需要选择是否配置监视器或配置多少个监视器。普通监视器和确认监视器可以在系统中同时存在,也可以只配置其中一种。故障自动切换模式下,必须配置确认监视器。
为了防止单实例确认监视器出现故障,建议用户将确认监视器配置多实例形式。
1. 普通监视器
一个数据守护系统中,最多允许同时启动 10 个普通监视器。多个普通监视器之间的关系为相互独立,互不干扰。
所有普通监视器都可以接收守护进程消息,获取守护系统状态,也可以执行各种监控命令。所有监视器都可以发起 Switchover 等命令,但守护进程一次只能接收一个监视器的命令,在一个监视器命令执行完成之前,守护进程收到其他监视器发起的请求,会直接报错返回。
2. 确认监视器
确认监视器和普通监视器的区别在于,除了具备普通监视器所有功能之外,确认监视器还具有状态确认和自动接管两个功能。故障自动切换模式的数据守护系统,必须部署一个确认监视器,否则在出现数据库故障时,会导致数据库服务中断。
一个数据守护系统中,最多只能配置 1 个确认监视器。确认监视器可配置成单实例或多实例两种形式。
多实例确认监视器是采用 RAFT 协议实现的。在多实例确认监视器中,只有一个实例作为确认监视器提供服务,其它实例作为备库存在而不提供服务。当确认监视器出现故障时,系统会从它的备库中选举一位作为新的确认监视器继续提供服务。多实例确认监视器不支持动态扩展节点。
4.2 配置和启动监视器
4.2.1 普通监视器
如果配置多个普通监视器,则每一个监视器需单独配置自己的 dmmonitor.ini。
首先,通过 dmmonitor.ini 文件配置普通监视器。
配置 dmmonitor.ini,位于/dm/data 文件夹下。其中 MON_DW_IP 中的 IP 和 PORT 和 dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致。
MON_DW_CONFIRM = 0 #普通监视器
MON_LOG_PATH = /dm/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453332 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 192.168.0.141:52141
MON_DW_IP = 192.168.0.142:52142
MON_DW_IP = 192.168.0.143:52143
其次,启动监视器。
./dmmonitor /dm/data/dmmonitor.ini
至此,监视器可以正常使用了。
4.2.2 确认监视器
确认监视器可配置为单实例监视器或多实例监视器。
除了 dmmonitor.ini 内容不同以外,单实例确认监视器的配置和启动步骤均与普通监视器一样。更多配置和启动步骤请参考 4.2.1 普通监视器。
下面详细介绍确认监视器 dmmonitor.ini 文件配置。
4.2.2.1 单实例
需设置 dmmonitor.ini 中 MON_DW_CONFIRM=1,表示配置为确认监视器。其它内容和普通监视器的 dmmonitor.ini 用法一样。
4.2.2.2 多实例
多实例确认监视器系统中,每个实例配置一个 dmmonitor.ini。多个 dmmonitor.ini 中,除 MON_ID 参数不同以外,其他参数应完全一致。多实例确认监视器配置具体示例请参考 7 数据守护搭建。
与配置单实例确认监视器相比,配置多实例监视器时组的配置信息不做更改,监视器实例的配置信息需要新增确认监视器特有的配置参数,通过组和实例的配置信息内容的不同来区分组和实例,如果用户将组和实例的配置信息混淆,则以配置信息中更加靠前的参数为准来决定当前配置属于组还是实例,不属于组或实例的配置项将会被忽略。
监视器实例的配置信息包括实例 IP 地址、监听端口号以及实例在系统中的唯一编号, 实例的 IP 地址和监听端口号不应出现冲突,否则该监视器实例可能无法正常使用。监视器实例监听的 IP 及端口号的正确性由用户保证。
与配置单实例确认监视器相比,配置多实例确认监视器时需要增加多个确认监视器参数。首先,dmmonitor.ini 中需要添加整个监视器系统中的实例总数 MON_INST_NUM、各实例通信的心跳校验间隔 MON_HB_INTERVAL、各实例通信的心跳间隔 MON_BRO_INTERVAL 和各实例通信的基础投票间隔 MON_VOTE_INTERVAL。各实例通信的心跳间隔以及基础投票间隔会在真正使用时进行调整,各实例通信心跳间隔需要比基础投票间隔小(若配置中各实例通信心跳间隔比基础投票间隔大,内部会将实例通信心跳间隔调整为与基础投票间隔相同,再进行其他的调整处理)。其次,还需要增加确认监视器 ID 号 MON_ID 和监视器系统唯一标识 MON_MID。MON_ID 用于区别所有监视器中的不同实例,同一个监视器系统中的不同监视器实例,若配置相同的 MON_ID 将导致通信无法正常建立。各实例的 MON_ID 与 MON_INST_ID 相同。多实例确认监视器系统中的所有实例需配置相同的 MON_MID,代表它们属于同一个数据守护系统。
4.3 状态确认
故障自动切换模式数据守护系统中,主库守护进程监测到备库故障时,需要向确认监视器求证,确认备库是真的故障了,再启动故障处理流程将归档失效,避免引发脑裂。比如,主库网络故障,主库直接将归档失效继续以 Primary 模式提供服务;同时,确认监视器认为主库故障,将备库切换为 Primary 模式,守护进程组中同时出现多个主库,引发脑裂。
状态确认只对故障自动切换数据守护系统有效,主库守护进程在满足一定条件时,会切换到 Confirm 状态,向确认监视器进行求证,具体的条件要求请参考[6.9 备库故障处理](#6.9 备库故障处理)小节。
主库守护进程切换到 Confirm 之后,根据不同的场景决定是否切换为 Failover 状态并启动故障处理流程,具体的判断条件请参考[6.9 备库故障处理](#6.9 备库故障处理)小节,这里列举出几种常见的场景处理(注意前提是主库的守护进程已经处于 Confirm 状态):
1.主库网络故障,主库到备库、主库到确认监视器的连接异常。这种情况下主库守护进程一直保持 Confirm 状态,不会启动故障处理流程。
2.备库故障或者备库网络故障,主库守护进程会切换为 Failover 状态,启动故障处理流程。
3.主备库之间网络故障,但与确认监视器之间的网络正常,确认监视器确认主库满足 Failover 执行条件,主库守护进程会切换为 Failover 状态,启动故障处理流程,否则主库守护进程一直保持在 Confirm 状态。
4.4 自动接管
故障自动切换模式下,确认监视器检测到主库故障后,根据收到的主备库 LSN、归档状态、MAL 链路状态等信息,确定一个接管备库,并将其切换为主库。确认监视器启动自动接管流程的主要场景有三种,任何一种都会导致备库自动接管。场景如下:
1.主库数据库实例异常终止,主库守护进程正常。
2.主库硬件故障、或者数据库实例和守护进程同时故障。
3.主库网络故障,主备库之间、主库与监视器之间连接异常。
若想实现备库自动接管,主库、归档状态、备库都必须符合一定条件才行。条件如下:
- 主库
- 主库是 Primary 模式、Open 状态时,产生故障。(如图 4.2 左、中)
- 主库守护进程故障,故障前是 Open/Recovery 状态。(如图 4.2 中)
- 故障主库与接管备库和确认监视器之间的 MAL 链路断开。(如图 4.2 右)
- 归档状态
故障主库到接管备库的归档状态为 Valid。
- 备库
接管备库是 Standby 模式、Open 状态。
注意如果需要在主库正常退出时备库进行自动接管,需要配置MON_TAKEOVER_SHUTDOWN参数。
如果主库故障前正在执行Switchover/Takeover等命令,则备库不会自动接管,需要人工干预。
确认监视器要求一开始就启动,保证出现故障情况时,确认监视器已经收到了故障主库或备库的历史消息,否则会因为条件不足无法自动处理,需要通过命令方式人工干预。
当由于一些原因导致自动接管失败时,系统可能不会再次尝试自动接管,需要人工干预。
确认监视器不要和主库部署在一台机器上,避免主库网络故障时,备库无法自动切换为主库。
确认监视器不要和备库部署在一台机器上,避免主备库之间网络异常时,确认监视器误认为主库故障,将备库切换为主库,引发双主问题。
4.5 监视器命令
数据守护 V4.0 对之前版本监视器的部分命令做了调整,新增、删除以及变更了一批监视器命令。
数据守护 V4.0 中监视器提供以下命令来管理守护系统:
命令 | 含义 |
系统全局命令 | |
help | 显示帮助信息 |
exit | 退出监视器 |
show version | 显示监视器自身版本信息 |
show global info | 显示所有组的全局信息 |
show database [group_name.]db_name | 显示指定库的详细信息 |
show [group_name] | 显示指定组的实例信息,如果未指定组名,则显示所有组信息 |
show i[nterval] n | 每隔n秒自动显示所有组的实例信息 |
q | 取消自动显示 |
list [[group_name.]db_name] | 列出指定组的库对应的守护进程配置信息,如果都未指定,则列出所有守护进程配置信息 |
show open info [group_name.]db_name | 显示指定库的Open历史信息 |
show arch send info [group_name.]db_name | 查看源库到指定组的指定库的归档同步信息(包含恢复间隔信息) |
show apply stat [group_name.]db_name | 查看指定组的指定库的日志重演信息 |
show monitor [group_name[.]] [db_name] | 列出连接到指定守护进程的所有监视器信息 |
tip | 查看系统当前运行状态 |
login[/@service_name] | 登录监视器。若指定了/@service_name,则会使用wallet方式登录监视器;若没有指定,则为默认的交互式登录 |
logout | 退出登录 |
get takeover time | 获取备库开始自动接管需要延迟等待的时间 |
show state | 显示当前监视器所在监视器配置组的所有监视器的状态信息 |
以组为单位执行的命令 | |
startup dmwatcher [group_name] | 启动指定组的守护进程监控功能 |
stop dmwatcher [group_name] | 关闭指定组的守护进程监控功能 |
startup group [group_name] | 启动指定组的库 |
stop group [group_name] | 关闭指定组的库 |
kill group [group_name] | 强制杀掉指定组中的活动库 |
choose switchover [group_name] | 选择可切换为Primary库的备库列表 |
choose takeover [group_name] | 选择可接管故障Primary库的备库列表 |
choose takeover force [group_name] | 选择可强制接管故障Primary库的备库列表 |
set group [group_name] auto restart on | 打开指定组中所有节点的自动拉起功能 |
set group [group_name] auto restart off | 关闭指定组中所有节点的自动拉起功能 |
set group [group_name] para_name para_value | 修改指定组的所有守护进程的指定配置参数(同时修改ini文件和内存值),如果未指定组名,则通知所有组执行。 |
para_name指定参数名称,para_value指定参数值 | |
支持修改参数: DW_ERROR_TIME/INST_RECOVER_TIME/ | |
INST_ERROR_TIME/INST_AUTO_RESTART/ | |
INST_SERVICE_IP_CHECK/RLOG_SEND_THRESHOLD/RLOG_APPLY_THRESHOLD | |
set group [group_name] recover time time_value | 修改指定组中所有备库的恢复间隔为time_value指定的整数值(time_value取值范围:3~86400,单位为秒)(只修改守护进程内存值),如果未指定组名,则通知所有组执行 |
set group [group_name] arch invalid | 修改指定组中所有备库的归档为无效状态,如果未指定组名,则通知所有组执行 |
clear group [group_name] arch send info | 清理指定组中源库到所有备库(包括异步备库)的最近N次归档发送信息(通知源库执行),没有指定组名则通知所有组执行,其中N值取源库dm.ini中配置的RLOG_SEND_APPLY_MON值和实际归档发送次数中的较小值。 |
clear group [group_name] apply stat | 清理指定组中所有备库的最近N次重演信息(通知组中所有备库执行),没有指定组名则通知所有组执行,其中N值取备库dm.ini中配置的RLOG_SEND_APPLY_MON值和实际重演次数中的较小值。 |
以库为单位执行的命令 | |
check recover [group_name.]db_name | 检查指定组的指定库是否满足自动恢复条件 |
check open [group_name.]db_name | 检查指定组的指定库是否满足自动Open条件 |
open database [group_name.] db_name | 强制Open指定组的指定库 |
switchover [group_name[.]] [db_name] | 切换指定组的指定库为Primary库 |
takeover [group_name[.]] [db_name] | 使用指定组的指定库接管故障Primary库 |
takeover force [group_name[.]] [db_name] | 使用指定组的指定库强制接管故障Primary库 |
set database [group_name.]db_name recover time time_value | 修改指定组的指定库的恢复间隔为time_value指定的整数值(time_value取值范围:3~86400,单位为秒)(只修改守护进程内存值) |
set database [group_name.]db_name arch invalid | 修改指定组的指定库的归档为无效状态 |
detach database [group_name.]db_name | 将指定的备库分离出守护进程组 |
attach database [group_name.]db_name | 将分离出去的备库重新加回到守护进程组 |
startup dmwatcher database [group_name.]db_name | 打开指定库的守护进程监控功能 |
stop dmwatcher database[group_name.]db_name | 关闭指定库的守护进程监控功能 |
startup database [group_name.]db_name | 启动指定组的指定库 |
stop database [group_name.]db_name | 关闭指定组的指定库 |
kill database [group_name.]db_name | 强杀指定组的指定库 |
clear database [group_name.]db_name arch send info | 清理指定组中主库到指定备库实例的最近N次归档发送信息(通知主库执行),其中N值取主库dm.ini中配置的RLOG_SEND_APPLY_MON值和实际归档发送次数中的较小值。 |
clear database [group_name.]db_name apply stat | 清理指定备库的最近N次重演信息(通知备库执行),其中N值取备库dm.ini中配置的RLOG_SEND_APPLY_MON值和实际重演次数中的较小值。 |
set database [group_name.]db_name until time time_value | 设置指定组的指定异步备库重演到的时间点为time_value指定的时间点 |
cancel database [group_name.]db_name until time | 取消指定组的指定异步备库重演到的时间点 |
只允许在MPP主备环境下使用的命令 | |
show mpp | 显示MPP节点信息 |
startup dmwatcher all | 启动所有组的守护进程监控功能 |
stop dmwatcher all | 关闭所有组的守护进程监控功能 |
startup group all | 启动所有组的库 |
stop group all | 关闭所有组的库 |
kill group all | 强制杀掉所有组中的活动库 |
check mppctl | 检查MPP控制文件是否处于一致状态 |
recover mppctl | 恢复MPP控制文件到一致状态 |
下面对监视器命令进行详细的介绍:
注意命令中参数GROUP_NAME和DB_NAME的使用说明:
于读写分离集群和实时主备,因为监视器只允许配置一组,所以命令中的组名[group_name]都可以不指定;对于 MPP 主备,因为有多个组,所以需要指定组名。但是 set group 相关的命令不受此限制,如果不指定[group_name],则所有组全部执行。
[db_name]在有多个库时需要指定库名。
组名和库名均不唯一的情况下,需要全部指定。组名和库名用符号“.”分隔。
1. Help
显示帮助信息。
2. exit
退出监视器。
3. show version
显示监视器自身版本信息。
监视器版本格式为“DMMONITOR[数据守护版本号]全局版本号”,例如:
“DMMONITOR[4.0] V8”
同一套数据守护系统中,服务器、守护进程和监视器要求中括号内的数据守护版本号必须一致,否则不能建立连接,各自的控制台工具上会打印版本不匹配信息。
4. show global info
数据守护系统中如果包含有多个 DMDSC 集群,通过监视器查看所有库的详细信息时,信息会过于庞杂,需要再逐个分割查找每个库的重点信息,比如状态是否 OK、是否发生分裂等信息。为了帮助用户更快捷地掌握整个守护系统的运行状态,此命令只打印出每个库的全局状态信息,不再详细打印每个节点实例信息,用户可借助 show database 命令查看指定库的详细状态信息。
此命令的显示结果中各字段含义说明如下:
1) 组全局字段信息
GROUP:守护进程组名。
OGUID:守护进程组配置的唯一 OGUID 值。
MON_CONFIRM:监视器是否配置为确认模式,值为 TRUE 或 FALSE。
MODE:当前配置的切换模式,AUTO 表示故障自动切换模式,MANUAL 表示故障手动切换模式。
MPP_FLAG:当前是否为 MPP 主备环境,值为 TRUE 或 FALSE。
2) 库全局字段信息
守护进程和监视器是以库为单位进行管理的,对有多个节点的 DMDSC 集群,看作是一个完整的库,以下信息属于库的全局信息,部分守护进程相关的信息直接取自控制守护进程。
IP:守护进程的 IP 地址,取自控制守护进程。
MAL_DW_PORT:守护进程的监听端口,取自控制守护进程。
WTIME:守护进程本地的当前时间,取自控制守护进程。
WTYPE:守护进程配置的守护类型,包括 LOCAL/GLOBAL 两种类型,取自控制守护进程。
WCTLSTAT:守护进程控制文件状态,包括 Valid/Split/Invalid 三种状态,对于配置为本地守护类型的实例,由于不需要有守护进程控制文件,该字段值为 NULL。
WSTATUS:守护进程状态,取自控制守护进程。
INAME:库名称,取自控制节点实例名。
N_EP:库的节点个数。
N_OK:此字段对 DMDSC 集群内的节点有效,表示 DMDSC 集群内 OK 节点个数。
ISTATUS:数据库状态,包括 Startup/After Redo/Mount/Open/Suspend/
Shutdown 这几种状态,由控制守护进程综合当前所有节点实例的状态得出。
IMODE:数据库模式,包括 Unknown/Normal/Primary/Standby 这四种模式,由控制守护进程综合当前所有节点实例的模式得出。
RTYPE:数据库配置的归档类型,只统计 REALTIME/TIMELY 这两种归档类型,如果这两种归档都没有配置,则显示为 NONE。
RSTAT:此字段对备库有效,表示主库到备库的归档状态,可能为 Valid/Invalid/Unknown,对于本地守护类型的备库,此字段为 NULL,对于主库本身,此字段值为 Valid。该字段值要从备库对应的主库实例上取,如果当前没有活动主库或者备库无法确认对应的主库,则该字段显示为 Unknown。
5. show database [group_name.]db_name
此命令用于详细显示指定库的相关状态信息。
各字段含义说明如下:
1) 库全局字段信息
和 show global info 命令中的库全局字段含义相同。
2) 各节点实例字段信息
INST_PORT:节点实例的监听端口。
INST_OK:控制守护进程认定的节点实例状态,OK 或 ERROR。
INAME:节点实例名称。
ISTATUS:节点实例状态,包括 Startup/After Redo/Mount/Open/Suspend/Shutdown 这几种状态。
IMODE:节点实例模式,包括 Normal/Primary/Standby 这三种模式。
DSC_STATUS:此字段对单节点可忽略,只对 DMDSC 集群内的节点有意义,表示节点当前的 DMDSC 集群状态。
DSC_SEQNO:此字段对单节点可忽略,只对 DMDSC 集群内的节点有意义,表示节点在 DMDSC 集群内的序号。
DSC_CONTROL_NODE:此字段对单节点可忽略,只对 DMDSC 集群内的节点有意义,表示 DMDSC 集群内控制节点的序号。
RTYPE:节点实例配置的归档类型,只统计 REALTIME/TIMELY 这两种归档类型,如果这两种归档都没有配置,则显示为 NONE。
RSTAT:此字段对备库控制节点有效,表示主库到备库控制节点的归档状态,可能为 Valid/Invalid/Unknown,对于本地守护类型的备库,此字段为 NULL,对于主库本身,此字段值为 Valid。该字段值要从备库对应的主库实例上取,如果当前没有活动主库或者备库无法确认对应的主库,则该字段显示为 Unknown。
FSEQ:节点实例已经写入联机日志的 RLOG_PKG 包序号。
FLSN:节点实例的文件 LSN,指已经写入联机日志文件的最大 LSN 值。
CSEQ:节点实例的系统当前 PKG_SEQNO,指当前数据库最新产生的 RLOG_PKG 包的序号。
CLSN:节点实例的系统当前 LSN,指当前数据库最新产生的 LSN 值。
DW_STAT_FLAG:节点当前的执行标记。
如果是备库模式,show 命令还会显示备库控制节点当前的重演信息,重演信息的行数和产生日志的主库节点个数一致,可以查看备库对主库不同节点日志的重演情况。
EDOS_PARALLEL_NUM: 备库并行重演线程数。
DSC_SEQNO:主库节点序号。
SSEQ:备库可重演到的最大日志包序号。
SLSN:备库可重演到的最大 LSN,对应日志包序号为 STDBY_PKG_SEQNO。
KSEQ:非自动切换模式下,备库保持不重演的日志包序号。
KLSN:非自动切换模式下,备库保持不重演最大 LSN,对应的日志包序号为 KSEQ。
RSEQ:备库针对主库此节点已经重演到的日志包序号。
RLSN:备库针对主库此节点已经重演到的 LSN 值,对应的日志包序号为 RSEQ。
N_TSK:备库针对主库此节点的待重演任务个数。
TSK_MEM_USE:备库当前针对主库此节点的日志重演已经占用的内存大小(单位:字节)。
REDO_LSN_ARR: 备库各路并行重演线程已重演到的 LSN 值,数组中每个元素对应一路重演 LSN。
ARCH_SEND_UNTIL_TIME:备库针对主库此节点重演到的截止时间。
6. show [group_name]
如果指定 group_name,则显示指定组中所有库的详细状态信息,如果没有指定,则显示所有组中所有库的详细状态信息。
show 命令由下面几种信息组成:
- 组全局字段信息
- 库全局字段信息
- 各节点实例字段信息
也就是 show global info 和 show database 命令的整合,各字段含义可参考这两个命令中的含义说明。
7. show i[nterval] n
在 dmmonitor 工具界面上定时每隔 n 秒自动显示所有组中所有库的详细状态信息,相当于每隔 n 秒自动执行一次 show 命令,n 取值范围为 5~3600(s),相关字段含义可参考 show [group_name] 命令说明。
如果在工具界面上手动执行其他命令,则会自动取消定时显示功能。
8. q
取消 show i[nterval] n 命令设置的自动显示功能。
9. list [[group_name.]db_name]
此命令列出指定组中指定实例的守护进程配置信息,只有一组时允许不指定 group_name,如果组名和库名都没有指定,则显示所有守护进程的配置信息。
list 命令显示的字段和 dmwatcher.ini 的配置内容完全一致,可参考 5.4dmwatcher.ini 配置表格的各个字段说明。
如果守护进程守护的是 DMDSC 集群,list 命令会额外显示 dmdcr.ini 中配置的 CSS_ASM_RESTART_INTERVAL 和 CSS_DB_RESTART_INTERVAL 参数值,方便用户查看 dmcss 的自动拉起配置情况。
10. show open info [group_name.]db_name
此命令显示指定库的 INST_NAME、N_ITEM、CTL_STATUS 以及 DESC。只有一组时,此命令允许不指定 group_name。
INST_NAME:守护的数据库名称。
N_ITEM:Open 历史信息记录数。Open 历史信息记录最多只记录 128 项,写满 128 项后从第一项记录覆盖起,循环写入。Open 历史信息只有 Primary 和 Normal 模式的库 Open 时才主动写入。
CTL_STATUS:控制文件状态,包括 Valid/Split/Invalid 三种状态。
DESC:本地分裂库的描述信息,如果是有效状态,描述信息为空。
Open 历史信息包括 TGUID、ROWID、OPEN_TIME、SYS_MODE、PRI_INST_NAME、CUR_INST_NAME、PRI_DB_MAGIC、CUR_DB_MAGIC、N_EP、PKG_SEQNO_ARR 以及 APPLY_LSN_ARR,具体含义如下:
TGUID:Open 记录唯一标识。
ROWID:对应 SYSOPENHISTORY 中记录的 rowid。
OPEN_TIME:Open 的时间。
SYS_MODE:系统 Open 时所处的模式。
PRI_INST_NAME:对应主库的实例名。
CUR_INST_NAME:当前主库的实例名。
N_EP:数据库节点实例个数。非 DSC 环境,实例个数为 1。
PKG_SEQNO_ARR:已经写入联机日志的日志包序号,数组长度为 N_EP。
APPLY_LSN_ARR:已经重演的日志包序号,数组长度为 N_EP。
11. show monitor [group_name[.]] [db_name]
列出连接到指定库控制守护进程的所有监视器信息。
对于 group_name,在配置有多组时需要指定,否则可以不指定。对于 db_name,如果指定,则显示指定实例守护进程上的连接信息,如果没有指定,则根据 dmmonitor.ini 对应组中的配置顺序,显示第一个活动的守护进程上的监视器连接信息。如果 group_name 和 db_name 同时指定,则需要用“.”符号分隔。
同一个守护系统中允许最多 10 个监视器同时连接,可通过此命令获取指定守护进程上监视器连接信息,包括连接时间、确认监视器配置、监视器 ID、监视器 IP 和版本信息。显示的第一行结果为本地监视器的连接信息。
命令显示结果的字段说明如下:
DW_CONN_TIME:守护进程和监视器建立连接的时间。
MON_CONFIRM:监视器是否配置为确认模式。
MID:唯一标识监视器的 ID 值。监视器从启动到退出,MID 值保持不变。每次执行操作,监视器会把 MID 设置到所有的守护进程上,操作执行完,会清理掉所有守护进程上的 MID 值。守护进程每隔 5s 会检查一次,如果监视器已经退出,会自行清理掉自己保存的 MID 值。
MON_IP:监视器所在机器的 IP 地址。
MON_VERSION:监视器版本信息,如果监视器和守护进程版本不一致,则不允许建立连接。
12. tip
打印当前守护系统的运行状态。
检查库状态、库的守护进程状态、库的分裂信息、库的可加入信息、是否存在多个主库以及 MPP 环境下 dmmpp.ctl 是否处于一致状态等系统信息,并打印检查结果。
13. login[/@service_name]
监视器优先选择主库校验登录口令,如果没有活动主库,则选择一个活动备库校验登录口令,部分监视器命令需要先登录才允许执行。
login 命令有如下两种登录方式:
1)交互式登录
直接输入 login。不指定/@service_name,并且 login 命令之后不能有除空格外的其它字符。按照此方式输入命令后,监视器会逐步提示用户输入用户名和口令。登录口令和服务器的用户登录口令一致,且该用户必须有 SYSDBA 权限,默认使用 SYSDBA/SYSDBA。
2)wallet 方式登录
输入 login/@service_name,其中”/@”为固定用法,service_name 为服务名。监视器会到 dmmonitor.ini 中配置的 MON_WALLET_LOCATION 路径下读取 wallet 文件,并根据 service_name 到 wallet 文件中寻找对应的用户名和口令登录监视器。 服务名最长为 128 字节,若输入长度超过限定长度,则登录失败并显示错误信息。
使用 wallet 方式登录之前,用户需要先使用 dmmkstore 工具创建好 wallet 文件,并完成配置对应的服务名、用户名和口令,然后将该文件拷贝到 MON_WALLET_LOCATION 路径下,才能使用该功能。service_name 指定的服务对应的用户需要有 SYSDBA 权限,并且登录口令也要与该用户在服务器上配置的口令一致,才能成功登录监视器。
14. logout
退出登录。
15. get takeover time
如果在主库正常退出时,配置了备库自动接管需要等待的时间(MON_TAKEOVER_SHUTDOWN),则可通过该命令打印备库自动接管仍需等待的剩余时间,若主备库状态正常,则打印无自动接管实例。
16. show state
显示当前监视器所在监视器配置组的所有监视器的状态(监视器角色)等信息。
相关字段含义如下:
MON_BRO_INTERVAL:监视器实际广播超时。
MON_VOTE_INTERVAL: 监视器实际选举超时。
MON_NAME: 监视器名。
MON_STATE: 监视器状态(相对于当前监视器)。
ID: 监视器在系统中的 ID。
MON_ROLE: 监视器当前角色(显示当前监视器所知的内容)。
MON_IP: 监视器 IP。
MON_PORT: 监视器 PORT。
17. startup dmwatcher database [group_name.]db_name
打开指定库的守护进程监控功能,只有一个组的情况下,可以不指定 group_name。
此命令是指在指定库的守护进程处于 Shutdown 状态时,将其切换至 Startup 状态,恢复守护进程的监控功能,而不是启动守护程序。如果守护进程不是处于 Shutdown 状态,则跳过不执行。
另外切换至 Startup 状态后,守护进程可能会根据本地或远程库状态信息自动做一些状态切换处理,不一定会一直保持在 Startup 状态。
18. startup dmwatcher [group_name]
启动指定组的所有守护进程监控功能,只有一组的情况下,可以不指定 group_name。
此命令是指在守护进程处于 Shutdown 状态时,将其切换至 Startup 状态,恢复守护进程的监控功能,而不是启动守护程序。如果守护进程不是处于 Shutdown 状态,则跳过不执行。
另外切换至 Startup 状态后,守护进程可能会根据本地或远程库状态信息自动做一些状态切换处理,不一定会一直保持在 Startup 状态。
19. stop dmwatcher database[group_name.]db_name
关闭指定库的守护进程监控功能,只有一组的情况下,可以不指定 group_name。执行此命令需要先登录监视器。
此命令只是将指定库的守护进程切换为 Shutdown 状态,并不会退出守护进程,守护进程切换至 Shutdown 状态后,不会再自动处理故障,也不会自动启动实例,但仍然能够正常接收、发送消息,监视器仍然能够监控到最新的实例状态。
如果本地守护的是 DMDSC 集群,此命令只会将控制守护进程切换为 Shutdown 状态,不会修改普通守护进程状态。
20. stop dmwatcher [group_name]
关闭指定组的所有守护进程监控功能,只有一组的情况下,可以不指定 group_name。执行此命令需要先登录监视器。
此命令只是将守护进程切换为 Shutdown 状态,并不会退出守护进程,守护进程切换至 Shutdown 状态后,不会再自动处理故障,也不会自动启动实例,但仍然能够正常接收、发送消息,监视器仍然能够监控到最新的实例状态。
如果本地守护的是 DMDSC 集群,此命令只会将控制守护进程切换为 Shutdown 状态,不会修改普通守护进程状态。
21. startup group [group_name]
启动指定组中的所有节点实例,只有一组的情况下,可以不指定 group_name。
如果守护进程的监控功能被关闭,处于 Shutdown 状态,在通知实例启动之前,会先打开守护进程的监控功能,再通知守护进程启动实例。对 DMDSC 集群,如果组内 dmcss 的自动拉起功能是关闭的,在各节点实例拉起成功后,会将其打开。
注意如果守护进程dmwatcher.ini中INST_AUTO_RESTART配置为1,则对应实例不允许通过命令方式启动,需要等待守护进程自动拉起实例。 另外,如果守护进程守护的是DMDSC集群,控制守护进程收到命令后,会转发给每个dmcss执行,由dmcss拉起本地的节点实例,dmcss执行完成后,再由控制守护进程将执行结果返回给守护监视器。
同样的,如果dmcss的自动拉起标记为TRUE,也不允许通过此命令拉起dmcss本地的节点实例,需要等待dmcss自动拉起实例。
22. stop group [group_name]
退出指定组的所有节点实例,只有一组的情况下,可以不指定 group_name。执行此命令需要先登录监视器。
为了避免守护进程将实例再次启动,退出时会先通知关闭所有守护进程的监控、重启等功能,切换守护进程为 Shutdown 状态。如果已经是 Shutdown 状态,则跳过不通知。
退出时,如果组中存在 Open 状态的主库,则先通知主库退出,再依次通知其他备库退出,否则就按照 dmmonitor.ini 中的配置顺序,依次通知每个处于活动状态的实例退出。
如果守护进程守护的是 DMDSC 集群,监视器会通知控制守护进程切换为 Shutdown 状态。控制守护进程收到退出命令后,首先通知组内所有 dmcss 关闭自动拉起功能,然后再转发退出命令给 dmcss 控制节点,由 dmcss 控制节点通知所有节点实例执行正常退出,再将 dmcss 控制节点的执行结果返回给守护监视器。
执行完此命令后,守护进程会一直保持在 Shutdown 状态,如果是通过手动方式将所有库重启,则需要先通过 startup dmwatcher 命令将守护进程监控功能打开,整个守护系统才可以正常 Open。
23. open database [group_name.] db_name
强制 Open 指定组的指定库,只有一组的情况下,可以不指定 group_name,但数据库名 db_name 必须指定。如果指定有组名 group_name,则组名和实例名需要用“.”分隔。执行此命令需要先登录监视器。
正常情况下,守护进程会自动 Open 实例,不需要手动执行此命令,如果发现某个库一直无法自动 Open,可尝试使用此命令。
命令执行时,首先会检查守护进程是否可以执行自动 Open,如果不符合执行条件,则命令会报错返回,需要等待守护进程自动处理;否则允许命令执行,将指定库强制 Open。
24. choose switchover [group_name]
选出指定组中允许执行 Switchover 的备库列表,只有一组的情况下,可以不指定 group_name。
25. switchover [group_name[.]] [db_name]
将指定组中的指定备库切换为新的主库,将当前的主库切换为新的备库,此命令要求执行切换的主备库都是正常 Open 状态。执行此命令需要先登录监视器。
只有一组的情况下,可以不指定 group_name,组中只有一个备库的情况下,可以不指定 db_name,如果 group_name 和 db_name 同时指定,则需要用“.”符合分隔。
26. choose takeover [group_name]
指定组中主库出现故障时,可以通过此命令选出组中可以执行正常接管的备库列表,只有一组的情况下,可以不指定 group_name。
如果指定组中存在有活动主库,则不再选择可接管的备库列表。
27. takeover [group_name[.]] [db_name]
使用指定组中的指定备库接管组中的故障主库。执行此命令需要先登录监视器。
只有一组的情况下,可以不指定 group_name,组中只有一个备库的情况下,可以不指定 db_name,如果 group_name 和 db_name 同时指定,则需要用“.”符合分隔。
该命令要求监视器曾经收到过故障主库的历史信息,并且主库的历史信息必须满足被接管条件,可以先通过 choose takeover [group_name]选出符合正常接管条件的备库列表,选择其中一个备库执行接管操作即可。
28. choose takeover force [group_name]
指定组中主库出现故障时,可以通过此命令选出组中可以执行强制接管的备库列表,只有一组的情况下,可以不指定 group_name。
如果指定组中存在有活动主库,则不再选择可强制接管的备库列表。
注意出现主库故障时,需要优先使用choose takeover [group_name] 选出可接管主库,并使用 takeover [group_name[.]] [db_name]来执行正常接管。
如果不存在可以正常接管的备库,但又需要主库对外提供服务,可再考虑使用choose takeover force [group_name]选出可强制接管的备库,并使用takeover force [group_name[.]] [db_name]进行强制接管。但是强制接管可能会导致出现分裂情况。
29. takeover force [group_name[.]] [db_name]
使用指定组中的指定备库强制接管组中的故障主库。执行此命令需要先登录监视器。
只有一组的情况下,可以不指定 group_name,组中只有一个备库的情况下,可以不指定 db_name,如果 group_name 和 db_name 同时指定,则需要用“.”符合分隔。
30. set group [group_name] auto restart on
打开指定组内所有 DMDSC 集群节点实例的自动拉起标记。
DMDSC 集群的自动拉起是靠 dmcss 执行的,dmcss 只负责拉起和自己的 dcr_seqno 相同的 db 节点。
同一个守护系统内,可能有多个 DMDSC 集群,这些 DMDSC 集群有各自的 dmcssm 监视器,可以通过 dmcssm 命令分别控制每个集群内 dmcss 的自动拉起标记,但是操作起来比较麻烦,通过此命令,在守护监视器 dmmonitor 上,可以一次性打开所有 DMDSC 集群上 dmcss 的自动拉起标记,不需要再逐个去操作每个 dmcssm。
此命令执行时,有可能所有节点实例都还未启动,因此不要求校验登录口令。
此命令只修改 dmcss 内存中的自动拉起标记值,不会修改 dmdcr.ini 中的配置值,如果 dmcss 重启,此修改会丢失。
如果 dmcss 未配置自动拉起参数(DMDCR_DB_RESTART_INTERVAL/DMDCR_DB_STARTUP_CMD),此命令会执行失败。
31. set group [group_name] auto restart off
关闭指定组内所有 DMDSC 集群节点实例的自动拉起标记。
和 set group [group_name] auto restart on 命令相对应,可以一次性关闭守护系统内所有 DMDSC 集群上 dmcss 的自动拉起标记。
此命令执行时,需要校验登录口令。
此命令只修改 dmcss 内存中的自动拉起标记值,如果 dmcss 重启,此修改会丢失。
32. set database [group_name.]db_name recover time time_value
设置主库到指定备库的 Recovery 时间间隔,取值范围 3~86400s。执行此命令需要先登录监视器。
只有一组时可以不指定 group_name,db_name 必须是备库实例名。命令执行时会查找 db_name 对应的主库,并通知主库的守护进程修改到备库的 recovery 间隔时间为指定的 value 值,注意此命令只修改主库守护进程的内存值(INST_RECOVER_TIME),并且只对指定备库起作用,不会写入到 dmwatcher.ini 文件,如果主库是 DMDSC 集群,则会同时修改主库所有守护进程中的内存值。
命令执行时要求主库和主库的守护进程必须是活动的,否则无法查找 db_name 对应的主库信息,会导致命令执行失败。
设置成功后,在指定备库发生故障重启时,主库的守护进程要等待距离指定备库上次的恢复时间超过指定的时间间隔后,才再次启动 Recovery 检查,若满足 3.1.9 故障恢复处理中列出的 Recovery 条件则进行 Recovery 流程,否则不能进行 Recovery。
对指定备库执行 Recovery 完成后,主库守护进程会根据执行结果重置内存中对指定备库的恢复间隔,本次命令设置的恢复间隔不再有效,具体请参考 3.1.9 故障恢复处理。
33. set database [group_name.]db_name arch invalid
设置主库到指定备库的归档状态无效。执行此命令需要先登录监视器。
只有一组时可以不指定 group_name,db_name 必须是备库实例名。
命令执行时会查找 db_name 对应的主库,并通知主库修改到备库的归档状态无效。
命令执行时要求主库和主库的守护进程必须是活动的,否则无法查找 db_name 对应的主库信息,会导致命令执行失败。
在主备库正常运行时,用户如果想人为退出备库(例如,需要修改备库配置),并且不想触发主库的 Failover 流程(避免影响应用执行),可先使用 set recover time 命令,将备库的 Recovery 间隔修改到一个较大的值(3~86400s),然后使用此命令通知主库修改备库的归档状态无效,即可达到目的。
之所以先使用 set recover time 命令设置恢复间隔,是为了防止先设置归档无效后,在备库退出前,主库的守护进程立马启动 Recovery 流程,又重新将备库归档恢复到有效状态,避免出现备库退出后还会触发主库执行 Failover 的情况。
34. set group [group_name] para_name para_value
修改指定组的所有守护进程的指定参数值,此命令同时修改守护进程内存值和配置文件 dmwatcher.ini 中的参数值。执行此命令需要先登录监视器。
如果守护进程守护的是 DMDSC 集群,此命令会同时修改所有守护进程的内存值和配置文件值。
如果组中某个守护进程故障,则跳过不修改,如果要重启故障的守护进程,需要在重启前修改守护进程 dmwatcher.ini 中的 DW_ERROR_TIME 和远程一致,否则 dmmonitor 执行命令时会报错处理。
group_name 指定组名,如果没有指定,在 MPP 主备多组的环境下,会通知所有组全部执行。目前可修改的参数包括:DW_ERROR_TIME、INST_RECOVER_TIME、INST_ERROR_TIME、INST_AUTO_RESTART、INST_SERVICE_IP_CHECK、RLOG_SEND_THRESHOLD、RLOG_APPLY_THRESHOLD。
如果指定的参数是 INST_RECOVER_TIME,待主库对某个备库执行过恢复操作后,会根据恢复结果重置主库守护进程内存中对此备库的恢复间隔值(不会影响 dmwatcher.ini 中的值),具体请参考 3.1.9 故障恢复处理。
35. set group [group_name] recover time time_value
设置指定组中主库到所有备库的 Recovery 时间间隔,取值范围 3~86400s。执行此命令需要先登录监视器。
如果没有指定 group_name,在 MPP 主备多组的环境下,会通知所有组全部执行。
命令执行时,要求主库和主库的守护进程必须是活动的,监视器通知主库依次修改到每个备库的恢复间隔为指定的 value 值(不包括守护进程控制文件已经处于 Invalid 或者 Split 状态的备库)。
注意此命令只修改主库守护进程的内存值(INST_RECOVER_TIME),不会写入到 dmwatcher.ini 文件,如果主库是 DMDSC 集群,此命令会同时修改主库所有守护进程中的内存值。
设置成功后,在备库发生故障重启时,主库的守护进程要等待距离备库上次的恢复时间超过指定的时间间隔后,才再次启动 Recovery 检查,若满足 3.1.9 故障恢复处理中列出的 Recovery 条件则进行 Recovery 流程,否则不能进行 Recovery。
对指定备库执行 Recovery 完成后,主库守护进程会根据执行结果重置内存中对指定备库的恢复间隔,本次命令设置的恢复间隔不再有效,具体请参考 3.1.9 故障恢复处理。
36. set group [group_name] arch invalid
设置指定组中主库到所有备库的归档状态无效。执行此命令需要先登录监视器。
如果没有指定 group_name,在 MPP 主备多组的环境下,会通知所有组全部执行。
命令执行时要求主库和主库的守护进程必须是活动的,监视器通知主库依次修改到所有备库的归档状态无效(不包括守护进程控制文件已经处于 Invalid 或者 Split 状态的备库)。
在主库有大量操作产生大量 Redo 日志的情况下,为避免备库产生日志堆积影响主库性能,可结合 set group 的几个命令,设置备库为异步方式同步数据,待主库空闲后,再通知主库同步数据到备库,以避免备库拖慢主库性能。
设置步骤如下:
- 通过 set group [group_name] recover time time_value 将所有备库的恢复间隔设置到一个比较大的值(3~86400s)。
- 再通过 set group [group_name] arch invalid 将备库归档失效,主库就不会再发送联机日志到备库重做。
- 待主库空闲时,可再通过 set group [group_name] recover time time_value 将备库的恢复间隔设置到一个比较小的值(3~86400s),启动备库的恢复流程,以达到备库数据的异步同步。
步骤 1 在步骤 2 之前做,是为了避免设置归档无效后,主库的守护进程立马启动 Recovery 流程,又重新将备库归档恢复到有效状态。
37. clear database [group_name.]db_name arch send info
清理指定组中主库到指定备库实例的最近 N 次归档发送信息(通知主库执行),N 值取主库 dm.ini 中配置的 RLOG_SEND_APPLY_MON 值和实际归档发送次数中的较小值。可通过查询 V$ARCH_SEND_INFO 查询实际发送次数。
如果主库是 DMDSC 集群,会清理主库所有节点到备库的最近 N 次归档发送信息。
主库守护进程判断备库归档发送是否异常,是根据(最近 N 次的总的发送耗时)/ N 得到的平均值来判断的,如果平均值大于主库守护进程配置的 RLOG_SEND_THRESHOLD 值,则认为到备库的归档发送出现异常,主库守护进程会启动对应的异常处理。
在异常处理完成后,异常备库归档处于无效状态,主库守护进程在达到恢复间隔后会启动到异常备库的 Recovery 恢复处理,在主备数据同步完成之后,主库 Suspend 之前,也会根据同样的方法判断归档发送是否异常,如果判断异常,则不允许恢复异常备库的归档为有效状态。
因此,在需要尽快恢复备库有效的场景下,可借助此命令清理掉最近 N 次的归档发送信息来达到目的,但这只是步骤之一,还需要清理备库的最近 N 次重演信息,具体请参考命令 clear database [group_name.]db_name apply stat 和 clear group [group_name] apply stat 的使用说明。
38. clear group [group_name] arch send info
清理指定组中源库到所有备库(包括异步备库)的最近 N 次归档发送信息,N 值取源库 dm.ini 中配置的 RLOG_SEND_APPLY_MON 值和实际归档发送次数中的较小值。源库可能是主库,也可能是异步备库(级联配置方式中作为源库),可通过查询 V$ARCH_SEND_INFO 查询实际发送次数。
如果没有指定组名则通知所有组执行。
如果主库是 DMDSC 集群,此命令会通知主库所有节点清理最近 N 次的归档发送信息。
此命令的使用场景可参考 clear database [group_name.]db_name arch send
info 命令说明。
39. clear database [group_name.]db_name apply stat
清理指定备库的最近 N 次重演信息(通知指定备库执行),N 值取备库 dm.ini 中配置的 RLOG_SEND_APPLY_MON 值和实际重演次数中的较小值,可通过查询 V$RAPPLY_STAT 查询实际备库重演次数。
如果主库是 DMDSC 集群,备库会清理对主库所有节点的最近 N 次重演信息。主库守护进程判断备库重演日志是否正常,是根据(最近 N 次的等待时间 + 最近 N 次的重演时间)/ N 得到的平均值来判断的,如果平均值大于主库守护进程配置的 RLOG_APPLY_THRESHOLD 值,则认为备库重演异常。
在对异常备库执行 Recovery 恢复时,在主备数据同步完成之后,主库 Suspend 之前,会根据此方法判断备库重演是否异常,如果判断异常,则不允许恢复异常备库的归档为有效状态。
因此,在需要尽快恢复备库有效的场景下,可借助此命令清理掉指定备库最近 N 次的日志重演信息来达到目的,但这只是步骤之一,还需要清理主库到备库的最近 N 次归档发送信息,具体请参考命令 clear database [group_name.]db_name arch send info 和 clear group [group_name] arch send info 的使用说明。
40. clear group [group_name] apply stat
清理指定组中所有实时或即时备库实例的最近 N 次重演信息(通知所有备库执行),N 值取备库 dm.ini 中配置的 RLOG_SEND_APPLY_MON 值和实际重演次数中的较小值,可通过查询 V$RAPPLY_STAT 查询实际备库重演次数。
如果没有指定组名则通知所有组执行。
如果主库是 DMDSC 集群,备库会清理对主库所有节点的最近 N 次重演信息。
此命令的使用场景可参考 clear database [group_name.]db_name apply stat 命令说明。
41. show arch send info [group_name.]db_name
显示源库到指定备库的日志发送信息,以及源库的控制守护进程本地到指定备库的 Recovery 间隔信息。也支持异步备库的查询,其中 Recovery 间隔信息对异步备库无效。
查询结果中的字段说明如下:
- 主库的控制守护进程字段信息
下面这些信息只对 Global 守护类型的备库有效。
LAST RECOVER TIME:主库守护进程上次启动对指定备库的 Recovery 时间,NONE 表示未执行过恢复操作。
LAST_RECOVER CODE:主库守护进程上次对指定备库执行 Recovery 的结果,Code 小于 0 表示执行失败,等于 0 表示执行成功,等于 100 表示实际未执行。
INST_RECOVER_TIME(IN DMWATCHER.INI):主库的 dmwatcher.ini 中配置的 INST_RECOVER_TIME 值,对所有备库有效。
INST_RECOVER_TIME(IN DMWATCHER MEMORY):主库的守护进程内存中的 INST_RECOVER_TIME 值,只对指定备库有效,可通过 SET RECOVER TIME 命令动态修改。
注意如果主库是DMDSC集群,则会按照以下格式显示主库的每个节点到备库控制节点的归档发送相关信息。
- 主库到指定备库的当前状态信息
MPP_FLAG:是否为 MPP 主备环境,值为 TRUE 或 FALSE。
ARCH TYPE:主库到指定备库的归档类型,包括 REALTIME/TIMELY 两种类型。
MAL STATUS:主库到指定备库的 MAL 链路状态,包括 CONNECTED/ DISCONNECTED 两种状态。
ARCH STATUS:主库到指定备库的归档状态,包括 VALID/INVALID 两种状态。
- 主库最近一次向备库发送日志的历史信息
SEND TYPE:主库到指定备库的日志发送类型。FOR REALTIME SEND/FOR TIMELY SEND 表示主库向备库正常的联机日志发送,FOR RECOVER SEND 表示主库的守护进程发起的 Recovery 流程中的归档日志发送,FOR ASYNC SEND 表示定时器定时触发的异步归档日志发送。
SEND START TIME:主库到指定备库的日志发送起始时间,NONE 表示未执行过发送操作。
SEND END TIME:主库到指定备库的日志发送结束时间,该字段为 NONE 时,如果 SEND START TIME 也是 NONE,则表示未执行过发送操作,如果 SEND START TIME 是具体的时间,则表示发送尚未结束。
SEND TIME USED:主库到指定备库最近一次的日志发送耗时(微秒)。
SEND START LSN:主库到指定备库的日志发送起始 LSN。
SEND END LSN:主库到指定备库的日志发送结束 LSN。
SEND LOG LEN:主库到指定备库最近一次发送的日志长度(字节)。
SEND PTX COUNT:主库到指定备库最近一次发送的 PTX 个数。
SEND CODE:主库到指定备库的日志发送结果,Code 小于 0 表示发送失败,等于 0 表示发送成功,等于 100 表示实际未发送。
SEND DESC INFO:主库到指定备库的日志发送结果描述信息。
- 主库最近 N 次向备库发送日志的历史信息
N 值取主库 dm.ini 中配置的 RLOG_SEND_APPLY_MON 值和实际归档发送总次数中的较小值。
SEND LOG LEN:主库最近 N 次累计发送到指定备库的日志长度(字节)。
SEND PTX COUNT:主库最近 N 次累计发送到指定备库的 PTX 个数。
SEND TIME USED:主库最近 N 次累计发送日志耗时(微秒)。
主库守护进程判断到备库的日志发送是否出现异常,就是判断 SEND TIME USED/N 得出的平均值是否大于主库 dmwatcher.ini 中配置的 RLOG_SEND_THRESHOLD 值,如果大于,则认为备库异常,主库守护进程就会启动异常处理,具体请参考 3.1.7 备库异常处理小节。
- 主库向备库发送日志的历史信息中的最大值
MAX SEND TIME USED:主库向备库发送日志的最大耗时记录(微秒)。
MAX END TIME:主库向备库发送日志最大耗时的结束时间。
MAX PTX COUNT:主库向备库发送日志的最大的 PTX 个数记录。
MAX SEND LOG LEN:主库向备库发送日志的最大长度记录(字节)。
MAX END LSN:主库向备库发送日志的最大结束 LSN。
其中 MAX SEND TIME USED/ MAX END TIME 记录的是同一组信息,其余的记录信息都是相互独立没有关联的。
- 主库向备库发送日志的全部累计信息
TOTAL SEND COUNT:主库向备库发送日志总次数
TOTAL SEND LOG LEN:主库向备库发送的总日志长度(字节)
TOTAL SEND PTX COUNT:主库向备库发送的总 PTX 个数
TOTAL SEND TIME USED:主库向备库发送日志总耗时(微秒)
42. show apply stat [group_name.]db_name
显示指定备库的日志重演信息,也支持异步备库的查询。
注意如果主库是DMDSC集群,则会按照以下格式依次显示备库对主库每个节点的重演信息。
- 备库最近一次的日志重演信息
RECEIVED LOG LEN:备库最近一次收到的日志长度(字节)。
RESPONSE TIME USED:备库最近一次响应主库耗时(微秒)。
WAIT TIME USED:备库最近一次重演日志的等待时间(微秒)。
APPLY LOG LEN:备库最近一次重演日志长度(字节)。
APPLY TIME USED:备库最近一次重演日志耗时(微秒)。
- 备库最近 N 次的日志重演信息
N 值取备库 dm.ini 中配置的 RLOG_SEND_APPLY_MON 值和实际重演总次数中的较小值。
RECEIVED LOG LEN:备库最近 N 次收到的日志长度(字节)。
RESPONSE TIME USED:备库最近 N 次响应主库耗时(微秒)。
WAIT TIME USED:备库最近 N 次重演等待时间(微秒)。
APPLY LOG LEN:备库最近 N 次重演日志长度(字节)。
APPLY TIME USED:备库最近 N 次重演日志耗时(微秒)。
主库守护进程判断备库的日志重演是否出现异常,就是判断(WAIT TIME USED + APPLY TIME USED)/N 得出的平均值是否大于主库 dmwatcher.ini 中配置的 RLOG_APPLY_THRESHOLD 值,如果大于,则认为备库重演日志异常,主库守护进程不会恢复备库归档为有效状态,具体请参考 3.1.9 故障恢复处理小节。
- 备库日志重演历史信息中的最大记录值
MAX RESPONSE TIME:备库响应主库的最大耗时记录(微秒)。
MAX WAIT TIME:备库重演日志时的最大等待时间(微秒)。
MAX APPLY TIME:备库的历史最大重演耗时(微秒)。
MAX APPLY LOG LEN:备库最大重演耗时对应的日志长度(字节)。
其中 MAX APPLY TIME/ MAX APPLY LOG LEN 是同一组信息,其余的记录信息都是相互独立没有关联的。
- 备库日志重演的全部累计信息
TOTAL RECEIVED NUM:备库收到的总的日志缓存个数。
TOTAL RECEIVED LOG LEN:备库收到的总的日志缓存长度(字节)。
TOTAL APPLY NUM:备库已经重演的总的日志缓存个数。
TOTAL APPLY LOG LEN:备库已经重演的总的日志长度(字节)。
TOTAL RESPONSE TIME:备库响应主库的总耗时(微秒)。
TOTAL WAIT TIME:备库上重演日志总的等待时间(微秒)。
TOTAL APPLY TIME:备库上总的重演耗时(微秒)。
43. detach database [group_name.]db_name
此命令允许将全局守护类型的备库分离出守护进程组,执行此命令需要先登录监视器。
使用此命令不会触发主库的 Failover 故障处理流程。该操作不会修改相关的配置信息,只是为了需要主动退出维护备库时使用。
该命令包括下面两个操作步骤:
- 通知主库设置到指定备库的恢复间隔内存值为 86400(s)。
- 通知主库修改到指定备库的归档状态无效。
从上面步骤可以看出,此命令是前面几个命令的结合,步骤 1 相当于执行 set recover
time 命令,步骤 2 相当于执行 set arch invalid 命令,使用此命令可简化手工操作步骤,一次完成将指定实例分离出守护进程组的所有操作。
使用此命令的前提是备库的守护进程控制文件状态必须是有效的。
如果需要将备库退出,可借助 stop database 命令完成此功能。
注意执行此命令需要先登录监视器,命令执行成功后,在分离出的备库维护工作完成之后,可通过下面方式将实例重加入守护进程组。
如果备库在维护时手动退出了,可先通过 startup database 命令或者手工方式将备库重启。
在备库处于活动状态并自动 Open 后,主库内存中对备库的恢复间隔时间仍然是 86400(s),如果想尽快启动备库的恢复流程,可以使用 attach database [group_name.]db_name 命令将备库重加入,或者使用 set recover time 命令将备库的恢复间隔改小。
需要注意的是,此命令中的两个操作步骤都是通知当前主库执行的,如果主库在分离出去的备库重新加回之前发生故障,其他备库接管成为新主库,则之前的分离操作会失效,需要重新对此备库执行 detach 命令,通知当前的新主库执行以上操作。
44. attach database [group_name.]db_name
此命令和 detach database [group_name.]db_name 相对应,待 detach 分离出去的备库维护完成后,可通过此命令将其重加入守护进程组,执行此命令需要先登录监视器。
此命令的操作就是通知主库修改到指定备库的恢复间隔为 3s,如果主库是 DMDSC 集群,则会通知主库所有守护进程修改到指定备库的恢复间隔内存值为 3s。
可以将此命令等同于 set database [group_name.]db_name recover time time_value 命令来使用。
45. kill group [group_name]
强制杀掉指定组中的活动实例。
守护进程收到监视器的 kill group 命令请求时,会先切换为 Shutdown 状态(如果已经处于 Shutdown 状态则不再切换),同时强制杀掉所守护的实例进程(如果实例已经故障处于 Error 状态,则跳过不执行)。
执行此命令时,实例当前可能正在执行守护进程发起的命令,无法校验监视器的登录口令,因此不要求用户先登录监视器。
如果守护进程守护的是 DMDSC 集群,监视器会通知控制守护进程切换为 Shutdown 状态。控制守护进程收到 kill 命令后,首先通知组内所有 dmcss 关闭自动拉起功能,然后再转发 kill 命令给 dmcss 控制节点,由 dmcss 控制节点通知各节点实例强制退出,再将 dmcss 控制节点的执行结果返回给守护监视器。
注意执执行完此命令后,守护进程会一直保持在Shutdown状态,如果是通过手动方式将所有库重启,则需要先通过startup dmwatcher命令将守护进程监控功能打开,整个守护系统才可以正常Open。
46. check recover [group_name.]db_name
检查指定组的指定备库是否满足自动恢复条件。
主库和守护进程都处于正常 Open 状态时,如果有备库发生故障重启,主库守护进程会自动检测备库是否满足自动恢复条件,如果满足,主库守护进程会发起 Recovery 流程执行故障恢复。
如果备库没有被自动恢复,可通过此命令获取备库不满足条件的原因。
47. check open [group_name.]db_name
检查指定组的指定库是否满足自动 Open 条件。
正常情况下,在库中所有 ok 节点启动到 Mount 状态后,守护进程会根据本地和远程守护进程发送的实例状态信息进行一系列条件判断,如果满足条件,守护进程会通知本地所有 ok 节点执行 ALTER DATABASE OPEN FORCE 语句,将实例启动到 Open 状态,守护进程也会切换到 Open 状态,这一过程不需要人工干预。
如果守护进程判定本地库不符合自动 Open 条件,则不会通知其执行 OPEN FORCE 语句,此时可以借助此命令来获取不满足条件的原因。
48. startup database [group_name.]db_name
启动指定组的指定库实例。
支持单机和 DMDSC 集群的拉起。
如果指定的库是单机,则由守护进程执行拉起动作;如果指定的库是 DMDSC 集群,则由守护进程再去通知组内所有 dmcss 各自执行拉起动作。
此命令执行前,如果守护进程处于 Shutdown 状态,会将其切换为 Startup 状态。对 DMDSC 集群,如果组内 dmcss 的自动拉起功能是关闭的,在各节点实例拉起成功后,会将其打开。
注意如果守护进程dmwatcher.ini中INST_AUTO_RESTART配置为1,则对应实例不允许通过命令方式启动,需要等待守护进程自动拉起实例。
同样的,如果守护进程守护的是 DMDSC 集群,dmcss 的自动拉起标记为 TRUE,也不允许通过此命令拉起 dmcss 本地的节点实例,需要等待 dmcss 自动拉起实例。
49. stop database [group_name.]db_name
正常退出指定组的指定库实例。
支持单机和 DMDSC 集群的正常退出。
如果指定的库是单机,则由守护进程通知单机库正常退出;如果指定的库是 DMDSC 集群,则由守护进程再去通知 dmcss 控制节点依次退出每个节点实例。
注意此命令执行完成后,会将守护进程切换为Shutdown状态。对DMDSC集群,会将每个dmcss的自动拉起功能关闭。
如果要退出的是全局守护类型的备库,为了避免触发主库的 Failover 动作,要求此备库已经被 detach 分离出去,也就是备库归档要处于无效状态,才允许将其正常退出。
如果要退出的是主库,在自动切换模式下,为了避免触发备库的自动接管,要求所有备库都已经被 detach 分离出去,也就是所有备库归档都处于无效状态,才允许退出主库,手动切换模式下没有此要求。
50. kill database [group_name.]db_name
强杀指定组的指定库实例。
支持单机和 DMDSC 集群的强杀。
如果指定的库是单机,则由守护进程强制杀掉指定库的进程;如果指定的库是 DMDSC 集群,则由守护进程再去通知 dmcss 控制节点强杀所有节点实例。
此命令执行完成后,会将守护进程切换为 Shutdown 状态。对于 DMDSC 集群,会将所有 dmcss 的自动拉起功能关闭。
51. set database [group_name.]db_name until time time_value
设置指定组的指定异步备库重演到的时间点,指定的库必须为异步备库。
支持指定的时间值 time_value 精确到微秒。
命令执行时,首先找到异步备库对应的源库,监视器向守护进程发起重演到指定时间点的请求,守护进程根据请求修改源库的内存值,然后通知源库立即发送归档。其中,归档的发送是异步进行的,不会阻塞监视器命令窗口。
注意此命令只会通知当前有效的源库进行设置,如果源库是实时主库或即时主库,且在设置成功后出现故障,则用户需要对由备库接管后的新主库重新进行设置。
用户也可以在主备库上分别执行系统函数 SP_SET_ARCH_SEND_UNTIL_TIME 进行设置,详细请参考《DM8_SQL 语言使用手册》。
52. cancel database [group_name.]db_name until time
取消指定组的指定异步备库重演到的时间点,指定的库必须为异步备库。
命令执行时,首先找到异步备库对应的源库,监视器向守护进程发起取消重演到指定时间点的请求,守护进程根据请求修改源库的内存值。
注意此命令只会通知当前有效的源库进行设置,如果源库是实时主库或即时主库,且在设置成功后出现故障,则用户需要对由备库接管后的新主库重新进行设置。
如果用户通过系统函数 SP_SET_ARCH_SEND_UNTIL_TIME 在所有主备库上都设置了重演到的时间点,则需要在主备库上分别执行 SP_SET_ARCH_SEND_UNTIL_TIME 来取消设置,详细请参考《DM8_SQL 语言使用手册》。
53. show mpp
显示 MPP 站点信息,该命令仅支持 MPP 主备环境下使用。显示的信息和 dmmpp.ctl 中记录的节点信息一致。
相关字段含义如下:
INST_NAME:配置的 MPP 节点实例名。
EP_SEQNO:配置的 MPP 节点号。
EP_IP:MPP 节点 IP 地址,此信息不包含在 dmmpp.ctl 文件中,用户可在需要连接 MPP 节点时使用。
EP_PORT:MPP 节点端口号,此信息不包含在 dmmpp.ctl 文件中,用户可在需要连接 MPP 节点时使用。
54. startup dmwatcher all
启动所有组的守护进程监控功能,该命令仅支持 MPP 主备环境下使用。
此命令是指在守护进程处于 Shutdown 状态时,将其切换至 Startup 状态,恢复守护进程的监控功能,并不是启动守护程序,如果守护进程不是处于 Shutdown 状态,则跳过不再处理。
另外,切换至 Startup 状态后,守护进程可能会根据本地或远程实例状态信息自动做一些状态切换处理,不一定会一直保持在 Startup 状态。
55. stop dmwatcher all
关闭所有组的守护进程监控功能,该命令仅支持 MPP 主备环境下使用。执行此命令需要先登录监视器。
此命令只是将守护进程切换为 Shutdown 状态,并不会退出守护进程,守护进程切换到 Shutdown 状态后,不会再自动处理故障,也不会自动启动实例,但仍然能够正常接收、发送消息,监视器仍然能够监控到最新的实例状态。
56. startup group all
启动所有组的所有实例,该命令仅支持 MPP 主备环境下使用。
如果守护进程的监控功能被关闭,处于 Shutdown 状态,在通知实例启动之前,会先打开守护进程的监控功能,再通知守护进程启动实例。
注意如果守护进程dmwatcher.ini中INST_AUTO_RESTART配置为1,则对应实例不允许通过命令方式启动,需要等待守护进程自动拉起实例。
57. stop group all
退出所有组的所有实例,该命令仅支持 MPP 主备环境下使用。执行此命令需要先登录监视器。
退出时会先通知关闭所有守护进程的监控功能,切换守护进程为 Shutdown 状态,避免守护进程将实例再次启动,如果已经是 Shutdown 状态,则跳过不再通知。
退出时,如果组中存在 Open 状态的主库,则先通知主库退出,再依次通知其他备库退出,否则就按照 dmmonitor.ini 中的配置顺序,依次通知每个处于活动状态的实例退出。
58. kill group all
强制杀掉所有组中的活动实例,该命令仅支持 MPP 主备环境下使用。
守护进程收到监视器的 kill 命令请求时,会先切换为 Shutdown 状态,同时强制杀掉所守护的实例进程(如果实例已经故障处于 Error 状态,则跳过不再执行)。
执行此命令时,实例当前可能正在执行守护进程发起的其他命令,无法校验监视器的登录口令,因此不要求用户先登录监视器。
59. check mppctl
检查当前所有活动主库的 dmmpp.ctl 文件内容是否一致,仅支持 MPP 主备环境下使用,如果某个组的主库出现故障,则跳过不检查。
60. recover mppctl
恢复当前所有活动主库的 dmmpp.ctl 到一致状态,仅支持 MPP 主备环境下使用。执行此命令需要先登录监视器。
如果某个组的主库故障,则跳过不恢复,待主库恢复正常后,可再通过 check mppctl 命令校验,如果不一致,可再尝试使用 recover mppctl 恢复到一致状态。
例如,MPP 系统中,主备库切换,备库接管等过程中,主备信息发生变更,新主库的信息将更新到 dmmpp.ctl 中。如果此时,另外一个主库发生故障,因为还未来得及同步最新的 dmmpp.ctl,重启后,可能造成主库的 dmmpp.ctl 不一致的情况,导致 MPP 系统不能正常工作。这种情况下,可通过 dmmonitor 的检查(check mppctl)和修复(recover mppctl)命令进行同步该控制文件。
4.6 监视器 LOG 日志
监视器 LOG 日志记录监视器自己的信息和守护进程的本地信息,在 LOG 日志中分别以[monitor]和[守护进程本地的实例名]开头。监视器 LOG 日志的命名格式为“dmmonitor_年月日时分秒.log”,例如“dmmonitor_20160418230523.log”。LOG 日志的路径通过 dmmonitor.ini 文件中 MON_LOG_PATH 来设置,如果没有设置则和 dmmonitor.ini 在同一个目录下。