监视器

监视器(dmmonitor)是基于监视器接口(详见 9.2 监视器接口)实现的一个命令行工具,是 DM 数据守护系统的重要组成部分。

通过监视器,可以监控数据守护系统的运行情况,获取主备库状态、守护进程状态以及主备库数据同步情况等信息。同时,监视器(dmmonitor)还提供了一系列命令来管理数据守护系统。

监视器的基本作用如下:

  • 监控数据守护系统

接收守护进程发送的消息,显示主、备数据库状态变化,以及故障切换过程中,数据库模式、状态变化的完整过程。

  • 管理数据守护系统

用户可以在监视器上输入命令,启动、停止守护进程的监控功能,执行主备库切换、备库故障接管等操作。

  • 确认状态信息

用于故障自动切换的数据守护系统中,主、备库进行故障处理之前,需要通过监视器进行信息确认,确保对应的备库或者主库是真的产生异常了,避免主备库之间网络故障引发脑裂。

  • 发起故障自动接管命令

用于故障自动切换的数据守护系统中,主库发生故障时,挑选符合接管条件的备库,并通知备库执行接管操作。

注意

对于实时主备和读写分离集群,监视器只允许配置一个守护进程组;MPP主备允许配置多组,并且要求这些组的主库必须是同一套MPP系统;

4.1 监视器类型

监视器分为两种类型:普通监视器和确认监视器。监视器类型由配置文件(dmmonitor.ini)的 MON_DW_CONFIRM 参数来确定。MON_DW_CONFIRM 参数的默认值是 0,表示普通监视器;MON_DW_CONFIRM 参数值为 1 时,表示确认监视器。

一个数据守护系统中,最多允许同时启动 10 个监视器。如果 10 个监视器都为普通监视器,则允许再启动一个确认监视器,当确认监视器启动时,会自动踢掉其中一个已建立连接的普通监视器,总的监视器个数仍然最多为 10 个。

用户可根据实际需要,选择是否配置监视器或配置多少个监视器。普通监视器和确认监视器可以在系统中同时存在,也可以只配置其中一种。故障自动切换模式下,必须配置确认监视器。

为了防止单实例确认监视器出现故障,建议用户将确认监视器配置多实例形式。

4.1.1 普通监视器

多个普通监视器之间的关系为相互独立,互不干扰。

所有普通监视器都可以接收守护进程消息,获取守护系统状态,也可以执行各种监控命令。所有监视器都可以发起 Switchover 等命令,但守护进程一次只能接收一个监视器的命令,在一个监视器命令执行完成之前,守护进程收到其他监视器发起的请求,会直接报错返回。

4.1.2 确认监视器

确认监视器和普通监视器的区别在于,除了具备普通监视器所有功能之外,确认监视器还具有状态确认和自动接管两个功能。在数据守护系统的故障自动切换模式下,必须部署一个确认监视器,否则在出现数据库故障时,会导致数据库服务中断。DM 提供了两种确认监视器的配置形式,分别为单实例和多实例。

一个数据守护集群中,最多只能配置一个确认监视器。

当单实例确认监视器故障时,无法继续进行集群的故障自动接管和备库故障确认,影响正常使用,故 DM 提供了多实例确认监控器来进一步提高集群的高可用性。

4.1.2.1 单实例

除了具备普通监视器的所有功能之外,单实例确认监视器具有状态确认和自动接管两个功能。相比于多实例确认监视器,单实例确认监视器出现故障就无法正常提供服务。

4.1.2.2 多实例

多实例确认监控器提供的功能与单实例确认监控器相同。

多实例确认监视器采用 RAFT 协议实现。在多实例确认监视器中,只有一个实例作为确认监视器提供服务,其它实例作为备库存在而不提供服务。当确认监视器出现故障时,系统会从它的备库中选举一位作为新的确认监视器继续提供服务。

下文将从 RAFT 协议、多实例确认监视器中的各角色状态的作用和特点、多实例确认监视器中选举主监视器三个角度对多实例确认监视器进行详细的介绍。

4.1.2.2.1 RAFT 协议简介

RAFT 协议是一种分布式数据一致性算法,通常应用在分布式系统中,用于保证多个服务器之间数据和状态的一致以及故障容错。

一个 RAFT 集群包含多个节点,在任意时刻,每一个服务器节点都处于以下的几种状态之一:Leader、Follower 或 Candidate。通常情况下,系统中有且只有一个 Leader,其它节点都是 Follower。Follower 被动地响应来自 Leader 或 Candidate 的请求;Leader 由选举产生,并负责处理所有来自外部的请求;而 Candidate 则是在选举产生 Leader 的过程中由 Follower 临时切换而来的。

RAFT 协议把从开始选举 Leader,到被选举出的 Leader 失效为止的一段时间称为任期(Term)。我们用连续且递增的整数来标记 Raft 集群中先后产生的每一个任期,这些整数被称为任期号。每一个节点存储一个当前任期号,这一编号随时间单调递增。当服务器之间通信的时候会交换当前任期号;如果一个服务器的当前任期号比其他节点小,那么他会更新自己的编号到较大的编号值。如果一个 Candidate 或者 Leader 发现自己的任期号过期了,那么他会立即恢复成 Follower 状态。如果一个节点接收到一个包含过期的任期号的请求,那么他会直接拒绝这个请求。

4.1.2.2.2 角色状态说明

由于多实例确认监视器是基于 RAFT 协议实现的监视器集群,故在任意时刻,多实例确认监视器中的每一个实例节点也处于 Leader、Follower 或 Candidate 的状态之一。

以下是各角色在多实例监视器中的作用和特点的说明:

Leader:主监视器。作为确认监视器向主备集群提供状态确认、自动接管等服务。正常情况下,一个多实例确认监视器集群中最多只存在一个 Leader。在多实例确认监视器的任意节点上执行 show state 命令,可以查看到当前作为 Leader 的节点。

Follower:备监视器。作为 Leader 的备机而存在,不向主备集群提供服务,不允许执行除 show state 之外的监视器命令。

Candidate:候选监视器。Leader 还未选出或者 Leader 异常时,Follower 会主动发起选举选出新 Leader,在发起选举时会切换为此角色。当任一 Candidate 收到监视器集群内大多数节点的选票后,则会切换为 Leader;当任一 Candidate 落选(即其他 Candidate 节点被选为新 Leader)则会切换为 Follower。

Not leader:非主监视器。此状态不属于 RAFT 协议的内容,仅用于 show state 命令中打印显示使用。在无法识别对方是 Follower 还是 Candidate,但可以确定对方不是 Leader 的情况下会将其状态显示为 Not leader。由于在 RAFT 算法之中非 Leader 节点之间的通信较少,大部分情况下两个节点之间只能互相确定对方是否为 Leader;而当对方不是 Leader 时,不能确定对方是 Follower 还是 Candidate。因此,当使用监视器的 show state 命令查看所有节点的状态时,通常会将除 Leader 和自身之外的节点都显示为 Not leader 状态。

4.1.2.2.3 选举规则

多实例确认监视器的选举过程完全遵守 RAFT 算法的要求。Leader 会周期性地向其它节点发送心跳信号来维持自己的地位。当某节点超过一定时间没有收到来自 Leader 的消息时,该节点就会发起选举。

每次发起选举时,节点会切换为 Candidate,并将自己的任期号加 1,从而废黜旧 Leader,然后向其余节点发送投票请求。选举过程通过投票完成,每个任期中每个节点有且仅有一张选票,每个节点只会投给与自己相比符合选举要求的节点(有效日志比自己多);发起选举的节点会直接将票投给自己,其余节点先收到的投票请求先处理,符合要求就会直接投出选票,不会考虑后续收到的投票请求。当发起选举的节点收到超过整个监视器集群节点数一半(包括自己)的选票,就会成为这个新任期的 Leader。

需要注意的是,上述的任期号和日志信息由多实例确认监视器内部进行维护,对于用户是不可见的。因此,对于用户来说,主监视器的选举具有随机性。另外,由于上述规则的限制,需要确保多实例确认监视器中始终有超过半数的节点存活且有效,这样才能正常选举出主监视器作为确认监视器。

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 确认监视器

确认确认监视器可配置为单实例确认监视器或多实例确认监视器两种形式。

4.2.2.1 单实例

需设置 dmmonitor.ini 中 MON_DW_CONFIRM=1,表示配置为确认监视器。除了该参数的设置不同外,单实例确认监视器的配置和启动步骤均与普通监视器一样。更多配置和启动步骤请参考 4.2.1 普通监视器

4.2.2.2 多实例

4.2.2.2.1 多实例监视器配置文件

多实例确认监视器系统中,每个实例配置一个 dmmonitor.ini。多个 dmmonitor.ini 中,除 MON_ID 和 MON_NAME 参数不同以外,其他参数应完全一致。

与配置单实例确认监视器相比,配置多实例监视器时组的配置信息不做更改,监视器实例的配置信息需要新增确认监视器特有的配置参数,通过组和实例的配置信息内容的不同来区分组和实例,如果用户将组和实例的配置信息混淆,则以配置信息中更加靠前的参数为准来决定当前配置属于组还是实例,不属于组或实例的配置项将会被忽略。

监视器实例的配置信息包括实例 IP 地址、监听端口号以及实例在系统中的唯一编号, 实例的 IP 地址和监听端口号不应出现冲突,否则该监视器实例可能无法正常使用。监视器实例监听的 IP 及端口号的正确性由用户保证。

与配置单实例确认监视器相比,配置多实例确认监视器时需要增加多个确认监视器参数。首先,dmmonitor.ini 中需要添加整个监视器系统中的实例总数 MON_INST_NUM、各实例通信链路的心跳校验间隔 MON_HB_INTERVAL、各实例之间的 RAFT 协议心跳间隔 MON_BRO_INTERVAL 和当前实例的 RAFT 协议基础投票间隔 MON_VOTE_INTERVAL。各实例的 RAFT 心跳间隔以及基础投票间隔会在真正使用时进行调整,各实例的 RAFT 心跳间隔需要比基础投票间隔小(若配置中各实例的 RAFT 心跳间隔比基础投票间隔大,内部会将 RAFT 心跳间隔调整为与基础投票间隔相同,再进行其他的调整处理)。

其次,还需要增加多实例监视器集群唯一标识 MON_MID 和监视器实例 ID 号 MON_ID。

MON_MID 是多实例监视器集群的唯一标识,同一个多实例确认监视器集群中的所有监视器实例需配置相同的 MON_MID,代表它们属于同一个数据守护系统。如果生产环境中需要配置多套多实例监视器集群,则需要将 MON_MID 配置成不同值以区分不同的多实例监视器集群。如果误将两套多实例监视器集群的 MON_MID 配置成相同值,则将其加入同一个守护进程组时守护进程会认为是同一集群,后续如果收到了新的节点连接请求,则会认为是 leader 发生了变化,因此会将旧连接踢掉,并允许新连接建立,进而可能出现第二套多实例监视器集群挤掉第一套集群来提供服务的情况。

MON_ID 用于区别同一个多实例监视器集群中的不同实例。MON_ID 需要与当前配置文件中的某一个监视器实例信息的 MON_INST_ID 相同,表示该实例为自身的信息。若同一个监视器系统中的不同监视器实例配置了相同的 MON_ID,则各监视器节点之间无法正常通信,多实例监视器集群无法正常运行。

下面展示了一个 3 节点多实例监视器集群中的 1 号监视器节点的配置文件,该节点预期将部署在 192.168.0.144 机器上,并且使用 8339 作为监听其它两个监视器节点连接请求的端口:

MON_DW_CONFIRM 			= 1  	#确认监视器
MON_LOG_PATH 				= /dm/data/log		#监视器日志文件存放路径
MON_LOG_INTERVAL			= 60	#每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE 			= 32		#每个日志文件最大32M
MON_LOG_SPACE_LIMIT 		= 0		#不限定日志文件总占用空间
MON_INST_NUM				= 3			#实例总个数
MON_HB_INTERVAL			= 60 		#通信心跳校验间隔
MON_BRO_INTERVAL			= 100 		#raft协议中实例通信心跳间隔
MON_VOTE_INTERVAL			= 100 		#raft协议中基础投票间隔
MON_MID					= 45614		#当前监视器系统的唯一标识
MON_ID					= 1	 		#当前监视器在监视器系统中的ID
MON_NAME					= MON1  	#监视器名

[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

[MON1] #监视器实例信息
MON_HOST              	= 192.168.0.144 		#MON1监视器所在IP 
MON_PORT              	= 8339 					#MON1监视器监听端口
MON_INST_ID				= 1 					#监视器实例在监视器系统中的ID
[MON2]
MON_HOST              	= 192.168.0.145 		#MON2监视器所在IP 
MON_PORT              	= 8340 					#MON2监视器监听端口
MON_INST_ID				= 2 					#监视器实例在监视器系统中的ID 
[MON3]
MON_HOST              	= 192.168.0.146 		#MON3监视器所在IP 
MON_PORT              	= 8341 					#MON3监视器监听端口
MON_INST_ID				= 3 					#监视器实例在监视器系统中的ID

对于 2、3 号节点,只需要将此配置文件分别拷贝到 192.168.0.145 和 192.168.0.146 机器上,并分别修改 MON_ID 和 MON_NAME 字段,就能使用此配置文件进行启动。

更多的多实例确认监视器配置具体示例请参考 7 数据守护搭建。多实例确认监视器不支持动态扩展节点。

4.2.2.2.2 初始化联机日志文件

多实例监视器相比于其他的监视器增加了联机日志文件,用于存储多实例监视器节点运行过程中产生或收到的日志包。因此,在使用配置文件启动多实例监视器实例之前,需要先初始化联机日志文件。命令格式如下:

dmmonitor RAFT_FILE_PATH=<file_path> RAFT_FILE_SIZE=<file_size> MON_MAGIC=<mon_magic> MON_NAME=<mon_name>

参数说明:

RAFT_FILE_PATH:监视器联机日志路径,需要与 dmmonitor.ini 中 MON_LOG_PATH 保持一致;

RAFT_FILE_SIZE:监视器联机日志文件大小,取值范围 512~10240,单位 MB;

MON_MAGIC:监视器联机日志文件魔数,参数范围 0~4294967294;

MON_NAME:监视器实例名,需要与 dmmonitor.ini 中 MON_NAME 保持一致。

为防止用户误执行联机日志文件初始化命令,将已有的联机日志文件覆盖掉,在指定路径下已存在相同名称的联机日志文件的情况下,初始化命令会执行失败,并返回-4558 错误码,提示文件已存在。

4.2.2.2.3 启动多实例监视器

多实例监视器的启动方式与普通监视器相同。在正确配置了 dmmonitor.ini 文件,并成功初始化联机日志文件之后,分别启动各监视器节点实例即可。

多实例监视器暂不支持动态修改配置。多实例监视器节点成功启动之后,若需要调整配置信息,则需要将当前多实例监视器集群中的所有监视器节点都退出,分别修改配置文件之后再启动。若在此期间修改了配置文件中的组信息部分,则需要将老的联机日志文件删除,并重新初始化联机日志文件,否则可能会导致监视器启动失败,或者多实例监视器集群无法正常工作。

4.3 状态确认

故障自动切换模式数据守护系统中,主库守护进程监测到备库故障时,需要向确认监视器求证,确认备库是真的故障了,再启动故障处理流程将归档失效,避免引发脑裂。比如,主库网络故障,主库直接将归档失效继续以 Primary 模式提供服务;同时,确认监视器认为主库故障,将备库切换为 Primary 模式,守护进程组中同时出现多个主库,引发脑裂。

状态确认只对故障自动切换数据守护系统有效,主库守护进程在满足一定条件时,会切换到 Confirm 状态,向确认监视器进行求证,具体的条件要求请参考 6.9 备库故障处理小节。

主库守护进程切换到 Confirm 之后,根据不同的场景决定是否切换为 Failover 状态并启动故障处理流程,具体的判断条件请参考 6.9 备库故障处理小节,这里列举出几种常见的场景处理(注意前提是主库的守护进程已经处于 Confirm 状态):

1.主库网络故障,主库到备库、主库到确认监视器的连接异常。这种情况下主库守护进程一直保持 Confirm 状态,不会启动故障处理流程。

2.备库故障或者备库网络故障,主库守护进程会切换为 Failover 状态,启动故障处理流程。

3.主备库之间网络故障,但与确认监视器之间的网络正常,确认监视器确认主库满足 Failover 执行条件,主库守护进程会切换为 Failover 状态,启动故障处理流程,否则主库守护进程一直保持在 Confirm 状态。

图 4.1 状态确认.png

图4.1 状态确认

4.4 自动接管

故障自动切换模式下,确认监视器检测到主库故障后,根据收到的主备库 LSN、归档状态、MAL 链路状态等信息,确定一个接管备库,并将其切换为主库。确认监视器启动自动接管流程的主要场景有三种,任何一种都会导致备库自动接管。场景如下:

1.主库数据库实例异常终止,主库守护进程正常。

2.主库硬件故障、或者数据库实例和守护进程同时故障。

3.主库网络故障,主备库之间、主库与监视器之间连接异常。

自动接管

图4.2 自动接管

若想实现备库自动接管,主库、归档状态、备库都必须符合一定条件才行。条件如下:

  • 主库
  1. 主库是 Primary 模式、Open 状态时,产生故障。(如图 4.2 左、中)
  2. 主库守护进程故障,故障前是 Open/Recovery 状态。(如图 4.2 中)
  3. 故障主库与接管备库和确认监视器之间的 MAL 链路断开。(如图 4.2 右)
  • 归档状态

故障主库到接管备库的归档状态为 Valid。

  • 备库

接管备库是 Standby 模式、Open 状态。

注意

如果需要在主库正常退出时备库进行自动接管,需要配置MON_TAKEOVER_SHUTDOWN参数。
如果主库故障前正在执行Switchover/Takeover等命令,则备库不会自动接管,需要人工干预。
确认监视器要求一开始就启动,保证出现故障情况时,确认监视器已经收到了故障主库或备库的历史消息,否则会因为条件不足无法自动处理,需要通过命令方式人工干预。
当由于一些原因导致自动接管失败时,系统可能不会再次尝试自动接管,需要人工干预。
确认监视器不要和主库部署在一台机器上,避免主库网络故障时,备库无法自动切换为主库。
确认监视器不要和备库部署在一台机器上,避免主备库之间网络异常时,确认监视器误认为主库故障,将备库切换为主库,引发双主问题。

4.5 监视器命令

数据守护 V4.0 对之前版本监视器的部分命令做了调整,新增、删除以及变更了一批监视器命令。

数据守护 V4.0 中监视器提供以下命令来管理守护系统:

注意

针对监视器命令中的db_name,如果是单节点库,db_name可以指定为该库的实例名,即instance_name;如果是DMDSC集群,db_name可以指定为集群中控制节点的实例名。

表4.1 监视器命令
命令 含义
系统全局命令
help 显示帮助信息
exit 退出监视器
exit all 退出当前多实例监视器的所有节点,仅多实例监视器支持
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方式登录监视器;若没有指定,则为默认的交互式登录
login with key login_string 通过Key认证方式登录监视器
logout 退出登录
get takeover time [group_name] 获取备库开始自动接管需要延迟等待的时间
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,单位为秒)(只修改守护进程内存值),如果未指定组名,则通知所有组执行
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,单位为秒)(只修改守护进程内存值)
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控制文件到一致状态

下面对监视器命令进行详细的介绍:

注意

1. 命令中参数GROUP_NAME和DB_NAME的使用说明:
对于读写分离集群和实时主备,因为监视器只允许配置一组,所以命令中的group_name可以不指定;对于MPP主备,因为有多个组,所以需要指定组名。但是set group相关的命令不受此限制,如果不指定group_name,则所有组全部执行。
db_name对于单节点库,可以指定为该库的实例名,即instance_name;对于DMDSC集群,db_name可以指定为集群中控制节点的实例名。
如果需要指定多个group_name或db_name,则不同group_name和db_name之间需要使用符号“.”分隔。
2. 多实例监视器环境下的监视器命令使用说明:
Leader节点上可以执行所有的监视器命令,而Follower或Candidate节点上仅允许执行exit/exit all等少数几个命令。
部分监视器命令为非原子操作(包括自动接管),若在这些命令执行的过程中Leader发生故障,则由选举产生的新Leader不会继续执行该未完成的命令,并且因为系统可能已经变更到了某个中间状态,而无法再次执行该命令,需要用户手动进行干预。

1. Help

显示帮助信息。

2. exit

退出监视器。

3. exit all

退出当前多实例监视器的所有节点。仅多实例监视器支持。

但在一些场景下,不是所有实例节点都能成功退出。当前 exit all 命令可能不能退出所有实例节点的场景如下:

  1. 当前多实例监控器没有有效 Leader;
  2. 退出过程中有节点发送选举,或退出过程中监视器发生故障;
  3. 多实例监视器之间存在网络通信波动或出现异常;
  4. 退出过程中,有节点在执行其他命令或又收到退出信号量;
  5. 多实例监视器配置不正确。

4. show version

显示监视器自身版本信息。

监视器版本格式为“DMMONITOR[数据守护版本号]全局版本号”,例如:

“DMMONITOR[4.0] V8”

同一套数据守护系统中,服务器、守护进程和监视器要求中括号内的数据守护版本号必须一致,否则不能建立连接,各自的控制台工具上会打印版本不匹配信息。

5. 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 集群,看作是一个完整的库,以下信息属于库的全局信息,部分守护进程相关的信息直接取自控制守护进程。

DW_IP:守护进程的 IP 地址,取自控制守护进程。

MAL_DW_PORT:守护进程的监听端口,取自控制守护进程。

WTIME:守护进程本地的当前时间,取自控制守护进程。

WTYPE:守护进程配置的守护类型,包括 LOCAL/GLOBAL 两种类型,取自控制守护进程。

WCTLSTAT:守护进程控制文件状态,包括 Valid/Split/Invalid 三种状态,对于配置为本地守护类型的实例,由于不需要有守护进程控制文件,该字段值为 NULL。

WSTATUS:守护进程状态,取自控制守护进程。

INAME:库名称,取自控制节点实例名。

INST_OK:库的运行状态,包括 Ok/Error 两种状态。

N_EP:库的节点个数。

N_OK:此字段对 DMDSC 集群内的节点有效,表示 DMDSC 集群内 OK 节点个数。

ISTATUS:数据库状态,包括 Startup/After Redo/Mount/Open/Suspend/

Shutdown 这几种状态,由控制守护进程综合当前所有节点实例的状态得出。

IMODE:数据库模式,包括 Unknown/Normal/Primary/Standby 这四种模式,由控制守护进程综合当前所有节点实例的模式得出。

DSC_STATUS:DSC 集群的运行状态,该字段仅对 DMDSC 集群有效,包括 DSC_STARTUP/DSC_OPEN/DSC_CRASH_RECV/DSC_ERR_EP_ADD 四种状态。

RTYPE:数据库配置的归档类型,只统计 REALTIME/TIMELY/ASYNC/SYNC 这四种归档类型,如果这四种归档都没有配置,则显示为 NONE。

RSTAT:此字段对备库有效,表示主库到备库的归档状态,可能为 Valid/Invalid/Async_send/Unknown,其中 Async_send 为同步备库和异步备库特有的归档状态。对于除同步备库和异步备库之外的本地守护类型备库,此字段为 NULL,对于主库本身,此字段值为 Valid。该字段值要从备库对应的主库实例上取,如果当前没有活动主库或者备库无法确认对应的主库,则该字段显示为 Unknown。

DETACHED:此字段对 REALTIME/TIMELY 备库有效,表示当前备库是否已经被分离出集群。若是,则显示为 TRUE;否则显示为 FALSE。对于主库或者守护进程配置为 LOCAL 类型的库,此字段一律显示为 FALSE。

6. show database [group_name.]db_name

此命令用于详细显示指定库的相关状态信息。

各字段含义说明如下:

1) 库全局字段信息

和 show global info 命令中的库全局字段含义相同。

2) 各节点实例字段信息

INST_IP:该节点配置的 MAL_INST_HOST 或者 MAL_HOST 参数值。如果配置了 MAL_INST_HOST 参数,则一律显示 MAL_INST_HOST 参数值;如果没有配置,则显示 MAL_HOST 参数值。

INST_PORT:节点实例的监听端口。

INST_OK:控制守护进程认定的节点实例状态,OK 或 ERROR。

INAME:节点实例名称。

ISTATUS:节点实例状态,包括 Startup/After Redo/Mount/Open/Suspend/Shutdown 这几种状态。

IMODE:节点实例模式,包括 Normal/Primary/Standby 这三种模式。

DSC_SEQNO:此字段对单节点可忽略,只对 DMDSC 集群内的节点有意义,表示节点在 DMDSC 集群内的序号。

DSC_CTL_NODE:此字段对单节点可忽略,只对 DMDSC 集群内的节点有意义,表示 DMDSC 集群内控制节点的序号。

RTYPE:节点实例配置的归档类型,只统计 REALTIME/TIMELY/ASYNC/SYNC 这四种归档类型,如果这四种归档都没有配置,则显示为 NONE。

RSTAT:此字段对备库控制节点有效,表示主库到备库控制节点的归档状态,可能为 Valid/Invalid/Async_send/Unknown,其中 Async_send 为同步备库和异步备库特有的字段值。对于除同步备库和异步备库之外的本地守护类型备库,此字段为 NULL,对于主库本身,此字段值为 Valid。该字段值要从备库对应的主库实例上取,如果当前没有活动主库或者备库无法确认对应的主库,则该字段显示为 Unknown。

FSEQ:节点实例已经写入联机日志的 RLOG_PKG 包序号。

FLSN:节点实例的文件 LSN,指已经写入联机日志文件的最大 LSN 值。

CSEQ:节点实例的系统当前 PKG_SEQNO,指当前数据库最新产生的 RLOG_PKG 包的序号。

CLSN:节点实例的系统当前 LSN,指当前数据库最新产生的 LSN 值。

DW_STAT_FLAG:节点当前的执行标记。

如果是备库模式,show 命令还会显示备库控制节点当前的重演信息,重演信息的行数和产生日志的主库节点个数一致,可以查看备库对主库不同节点日志的重演情况。

REDOS_PARALLEL_NUM:备库并行重演线程数。

WAIT_APPLY:显示主库 dmarch.ini 中配置到该备库的参数值,表示该备库为高性能模式还是事务一致模式。只有在 REALTIME 或 TIMELY 备库上才会显示,其他类型的备库不显示该字段。

ARCH_SEND_UNTIL_TIME:备库针对主库此节点重演到的截止时间,仅在异步备库中显示该字段。

APPLY_UNTIL_TIME:此字段仅对异步备库有效,标识异步备库是否重演到设置的 UNTIL_TIME,当未指定 UNTIL_TIME 时,为 FALSE。仅在异步备库中显示该字段。

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。

7. show [group_name]

如果指定 group_name,则显示指定组中所有库的详细状态信息,如果没有指定,则显示所有组中所有库的详细状态信息。

show 命令由下面几种信息组成:

  1. 组全局字段信息
  2. 库全局字段信息
  3. 各节点实例字段信息

也就是 show global info 和 show database 命令的整合,各字段含义可参考这两个命令中的含义说明。

8. show i[nterval] n

在 dmmonitor 工具界面上定时每隔 n 秒自动显示所有组中所有库的详细状态信息,相当于每隔 n 秒自动执行一次 show 命令,n 取值范围为 5~3600(s),且 n 必须为整数,相关字段含义可参考 show [group_name] 命令说明。

如果在工具界面上手动执行其他命令,则会自动取消定时显示功能。

9. q

取消 show i[nterval] n 命令设置的自动显示功能。

10. list [[group_name.]db_name]

此命令列出指定组中指定实例的守护进程配置信息,只有一组时允许不指定 group_name,如果组名和库名都没有指定,则显示所有守护进程的配置信息。

list 命令显示的字段可参考 5.4dmwatcher.ini 配置表格的各个字段说明。

如果守护进程守护的是 DMDSC 集群,list 命令会额外显示 dmdcr.ini 中配置的 DMDCR_ASM_RESTART_INTERVAL 和 DMDCR_DB_RESTART_INTERVAL 参数值,在监视器中对应显示为 CSS_ASM_RESTART_INTERVAL 和 CSS_DB_RESTART_INTERVAL,方便用户查看 dmcss 的自动拉起配置情况。

11. show open info [group_name.]db_name

此命令执行后返回所指定库的 INST_NAME、N_ITEM、CTL_STATUS、DESC 及 Open 历史信息。只有一组时,此命令允许不指定 group_name。若用户指定的 db_name 为 DMDSC 集群中的节点,则此命令将打印该 DMDSC 集群控制节点上记录的 Open 历史信息。

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、RSEQ_ARR 以及 RLSN_ARR,具体含义如下:

TGUID:Open 记录唯一标识。

ROWID:对应 SYSOPENHISTORY 中记录的 rowid。

OPEN_TIME:Open 的时间。

SYS_MODE:系统 Open 时所处的模式。

PRI_INST_NAME:对应主库的实例名。若主库是 DMDSC 集群,则为控制实例名。

CUR_INST_NAME:当前主库的实例名。若主库是 DMDSC 集群,则为控制实例名。

N_EP:数据库节点实例个数。非 DSC 环境,实例个数为 1。

RSEQ_ARR:已经写入联机日志的日志包序号,数组长度为 N_EP。

RLSN_ARR:已经重演的日志包序号,数组长度为 N_EP。

上述 Open 历史信息是从 SYSOPENHISTORY 系统表中取出的,因此上述各字段都能够在该系统表中找到对应的内容。主库启动后第一次 Open,或者由 Standby 或 Normal 模式切换到 Primary 模式后的第一次 Open,都会产生一条 Open 记录插入到 SYSOPENHISTORY 表中。而 Standby 库 Open 时不会产生记录,备库是通过重演主库发过来的 REDO 日志来同步修改 SYSOPENHISTORY 表的。所以,在正常情况下备库上记录的 Open 历史信息与主库完全一致,通过此命令查询得到的备库 Open 历史信息也与主库完全一致。

12. 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:监视器版本信息,如果监视器和守护进程版本不一致,则不允许建立连接。

HP_FLAG:监视器日志堆积标记(FALSE:没有日志堆积;TRUE:存在日志堆积;NULL:未知是否有日志堆积)。

13. tip

打印当前守护系统的运行状态。

检查库状态、库的守护进程状态、库的分裂信息、库的可加入信息、是否存在多个主库以及 MPP 环境下 dmmpp.ctl 是否处于一致状态等系统信息,并打印检查结果。

14. login [/@service_name]

监视器优先选择主库校验登录口令,如果没有活动主库,则选择一个活动备库校验登录口令,部分监视器命令需要先登录才允许执行。

login 命令有如下两种登录方式:

1)交互式登录

直接输入 login。不指定/@service_name,并且 login 命令之后不能有除空格外的其它字符。按照此方式输入命令后,监视器会逐步提示用户输入用户名和口令。登录口令和服务器的用户登录口令一致,且该用户必须有 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 权限,并且登录口令也要与该用户在服务器上配置的口令一致,才能成功登录监视器。

15. login with key login_string

login with key 命令通过 Key 认证方式登录监视器。login_string 为登录连接串,连接串语法请参考《DM8_DIsql 使用手册》2.1.2.2 DIsql 登录方式章节中的<logon> 语法。例如:login with key SYSDBA/DMdba_123@192.168.1.141:5236。

16. logout

退出登录。

17. get takeover time [group_name]

如果在主库正常退出时,配置了备库自动接管需要等待的时间(MON_TAKEOVER_SHUTDOWN),则可通过该命令打印备库自动接管仍需等待的剩余时间,若主备库状态正常,则打印无自动接管实例。

18. show state

显示当前监视器所在监视器配置组的所有监视器的状态(监视器角色)等信息。

相关字段含义如下:

MON_BRO_INTERVAL:监视器实际广播超时。

MON_VOTE_INTERVAL:监视器实际选举超时。

HP_FLAG:监视器日志堆积标记(FALSE:没有日志堆积;TRUE:存在日志堆积;NULL:未知是否有日志堆积)。

MON:监视器名。对于单实例监视器或者执行此命令的多实例监视器节点自身,此字段为 MON_NAME 配置值(没有配置则为空);对于执行此命令的多实例监视器节点的远程节点,此字段为当前节点配置文件中远程节点对应的 raft 副本配置项的名称。

MON_STATE:多实例监视器各节点相对于当前节点的状态。取值范围:”INACTIVE”、”ACTIVE”、”ASYNC_SEND”,分别表示”状态无效”、”状态有效”、”正在进行异步恢复”。对于单实例监视器或者执行此命令的多实例监视器节点自身,此字段一定为”ACTIVE”。

ID:监视器在系统中的 ID。

MON_ROLE:多实例监视器各节点当前的 raft 角色。取值范围:”CANDIDATE”、”LEADER”、”FOLLOWER”、”NOT LEADER”、”UNKNOWN”。其中后两个状态不属于 raft 协议范围,”NOT LEADER”表示当前节点只能确定远程节点不是 leader,但不能更具体地确定该节点当前是哪种状态;而”UNKNOWN”仅用于单实例监视器输出显示用。

MON_IP:监视器 IP。

MON_PORT:监视器 PORT。

19. startup dmwatcher database [group_name.]db_name

打开指定库的守护进程监控功能,只有一个组的情况下,可以不指定 group_name。

此命令是指在指定库的守护进程处于 Shutdown 状态时,将其切换至 Startup 状态,恢复守护进程的监控功能,而不是启动守护程序。如果守护进程不是处于 Shutdown 状态,则跳过不执行。

另外切换至 Startup 状态后,守护进程可能会根据本地或远程库状态信息自动做一些状态切换处理,不一定会一直保持在 Startup 状态。

20. startup dmwatcher [group_name]

启动指定组的所有守护进程监控功能,只有一组的情况下,可以不指定 group_name。

此命令是指在守护进程处于 Shutdown 状态时,将其切换至 Startup 状态,恢复守护进程的监控功能,而不是启动守护程序。如果守护进程不是处于 Shutdown 状态,则跳过不执行。

另外切换至 Startup 状态后,守护进程可能会根据本地或远程库状态信息自动做一些状态切换处理,不一定会一直保持在 Startup 状态。

21. stop dmwatcher database[group_name.]db_name

关闭指定库的守护进程监控功能,只有一组的情况下,可以不指定 group_name。执行此命令需要先登录监视器。

此命令只是将指定库的守护进程切换为 Shutdown 状态,并不会退出守护进程,守护进程切换至 Shutdown 状态后,不会再自动处理故障,也不会自动启动实例,但仍然能够正常接收、发送消息,监视器仍然能够监控到最新的实例状态。

如果本地守护的是 DMDSC 集群,此命令只会将控制守护进程切换为 Shutdown 状态,不会修改普通守护进程状态。

22. stop dmwatcher [group_name]

关闭指定组的所有守护进程监控功能,只有一组的情况下,可以不指定 group_name。执行此命令需要先登录监视器。

此命令只是将守护进程切换为 Shutdown 状态,并不会退出守护进程,守护进程切换至 Shutdown 状态后,不会再自动处理故障,也不会自动启动实例,但仍然能够正常接收、发送消息,监视器仍然能够监控到最新的实例状态。

如果本地守护的是 DMDSC 集群,此命令只会将控制守护进程切换为 Shutdown 状态,不会修改普通守护进程状态。

23. startup group [group_name]

启动指定组中的所有节点实例,只有一组的情况下,可以不指定 group_name。

如果守护进程的监控功能被关闭,处于 Shutdown 状态,在通知实例启动之前,会先打开守护进程的监控功能,再通知守护进程启动实例。对 DMDSC 集群,如果组内 dmcss 的自动拉起功能是关闭的,在各节点实例拉起成功后,会将其打开。

注意

如果守护进程dmwatcher.ini中INST_AUTO_RESTART配置为1,则对应实例不允许通过命令方式启动,需要等待守护进程自动拉起实例。 另外,如果守护进程守护的是DMDSC集群,控制守护进程收到命令后,会转发给每个dmcss执行,由dmcss拉起本地的节点实例,dmcss执行完成后,再由控制守护进程将执行结果返回给守护监视器。
同样的,如果dmcss的自动拉起标记为TRUE,也不允许通过此命令拉起dmcss本地的节点实例,需要等待dmcss自动拉起实例。

24. stop group [group_name]

退出指定组的所有节点实例,只有一组的情况下,可以不指定 group_name。执行此命令需要先登录监视器。

为了避免守护进程将实例再次启动,退出时会先通知关闭所有守护进程的监控、重启等功能,切换守护进程为 Shutdown 状态。如果已经是 Shutdown 状态,则跳过不通知。

退出时,如果组中存在 Open 状态的主库,则先通知主库退出,再依次通知其他备库退出,否则就按照 dmmonitor.ini 中的配置顺序,依次通知每个处于活动状态的实例退出。

如果守护进程守护的是 DMDSC 集群,监视器会通知控制守护进程切换为 Shutdown 状态。控制守护进程收到退出命令后,首先通知组内所有 dmcss 关闭自动拉起功能,然后再转发退出命令给 dmcss 控制节点,由 dmcss 控制节点通知所有节点实例执行正常退出,再将 dmcss 控制节点的执行结果返回给守护监视器。

执行完此命令后,守护进程会一直保持在 Shutdown 状态,如果是通过手动方式将所有库重启,则需要先通过 startup dmwatcher 命令将守护进程监控功能打开,整个守护系统才可以正常 Open。

25. open database [group_name.] db_name

强制 Open 指定组的指定库,只有一组的情况下,可以不指定 group_name,但数据库名 db_name 必须指定。如果指定有组名 group_name,则组名和实例名需要用“.”分隔。执行此命令需要先登录监视器。

正常情况下,守护进程会自动 Open 实例,不需要手动执行此命令,如果发现某个库一直无法自动 Open,可尝试使用此命令。

命令执行时,首先会检查守护进程是否可以执行自动 Open,如果不符合执行条件,则命令会报错返回,需要等待守护进程自动处理;否则允许命令执行,将指定库强制 Open。

26. choose switchover [group_name]

选出指定组中允许执行 Switchover 的备库列表,只有一组的情况下,可以不指定 group_name。

该命令执行成功后,会将执行结果登记到监视器内存中,后续执行 switchover 命令时,支持指定该执行结果中备库对应的序号,此时会将相应备库切换为主库。

27. switchover [group_name[.]] [db_name]

将指定组中的指定备库切换为新的主库,将当前的主库切换为新的备库,此命令要求执行切换的主备库都是正常 Open 状态。执行此命令需要先登录监视器。

只有一组的情况下,可以不指定 group_name,组中只有一个备库的情况下,可以不指定 db_name,如果 group_name 和 db_name 同时指定,则需要用“.”符合分隔。

可以先执行 choose switchover 命令选出组中能够切换为主库的备库列表,选择其中一个备库切换为主库即可。可以指定 choose switchover 命令执行结果中备库对应的序号来选择备库。例如 switchover 1 表示将 choose switchover 命令执行结果中的第一个备库切换为主库。

28. choose takeover [group_name]

指定组中主库出现故障时,可以通过此命令选出组中可以执行正常接管的备库列表,只有一组的情况下,可以不指定 group_name。

如果指定组中存在有活动主库,则不再选择可接管的备库列表。

该命令执行成功后,会将执行结果登记到监视器内存中,后续执行 takeover 命令时,支持指定该执行结果中备库对应的序号,此时会选择相应备库进行接管。

29. takeover [group_name[.]] [db_name]

使用指定组中的指定备库接管组中的故障主库。执行此命令需要先登录监视器。

只有一组的情况下,可以不指定 group_name,组中只有一个备库的情况下,可以不指定 db_name,如果 group_name 和 db_name 同时指定,则需要用“.”符合分隔。

该命令要求监视器曾经收到过故障主库的历史信息,并且主库的历史信息必须满足被接管条件,可以先执行 choose takeover 命令选出符合正常接管条件的备库列表,选择其中一个备库执行接管操作即可。可以指定 choose takeover 命令执行结果中备库对应的序号来选择备库。例如 takeover 1 表示选择 choose takeover 命令执行结果中的第一个备库来接管主库。

30. choose takeover force [group_name]

指定组中主库出现故障时,可以通过此命令选出组中可以执行强制接管的备库列表(选择 KLSN 最大的备库),只有一组的情况下,可以不指定 group_name。

如果指定组中存在有活动主库,则不再选择可强制接管的备库列表。

该命令执行成功后,会将执行结果登记到监视器内存中,后续执行 takeover force 命令时,支持指定该执行结果中备库对应的序号,此时会选择相应备库进行接管。

注意

出现主库故障时,需要优先使用choose takeover [group_name] 选出可接管主库,并使用 takeover [group_name[.]] [db_name]来执行正常接管。
如果不存在可以正常接管的备库,但又需要主库对外提供服务,可再考虑使用choose takeover force [group_name]选出可强制接管的备库,并使用takeover force [group_name[.]] [db_name]进行强制接管。但是强制接管可能会导致出现分裂情况。

31. takeover force [group_name[.]] [db_name]

使用指定组中的指定备库强制接管组中的故障主库。执行此命令需要先登录监视器。

只有一组的情况下,可以不指定 group_name,组中只有一个备库的情况下,可以不指定 db_name,如果 group_name 和 db_name 同时指定,则需要用“.”符合分隔。

可以先执行 choose takeover force 命令选出符合强制接管条件的备库列表,选择其中一个备库进行强制接管。可以指定 choose takeover force 命令执行结果中备库对应的序号来选择备库。例如 takeover force 1 表示选择 choose takeover force 命令执行结果中的第一个备库来强制接管主库。

32. 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),此命令会执行失败。

33. set group [group_name] auto restart off

关闭指定组内所有 DMDSC 集群节点实例的自动拉起标记。

和 set group [group_name] auto restart on 命令相对应,可以一次性关闭守护系统内所有 DMDSC 集群上 dmcss 的自动拉起标记。

此命令执行时,需要校验登录口令。

此命令只修改 dmcss 内存中的自动拉起标记值,如果 dmcss 重启,此修改会丢失。

34. 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 故障恢复处理

35. 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 故障恢复处理

36. 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 故障恢复处理

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/ASYNC_SEND 三种状态。

  • 主库最近一次向备库发送日志的历史信息

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 故障处理流程。该操作不会修改相关的配置信息,只是为了需要主动退出维护备库时使用。

该命令包括下面两个操作步骤:

  1. 通知主库设置到指定备库的恢复间隔内存值为 86400(s)。
  2. 通知主库修改到指定备库的归档状态无效。

从上面步骤可以看出,此命令是前面几个命令的结合,步骤 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]开头,守护进程信息以[守护进程本地的实例名]开头。如下所示:

[monitor] 2025-01-04 09:57:02: </MON CHECK EP1>

[EP1] 2025-01-04 09:57:02.263 [INFO] dmwatcher P0000023948 T0000000000000003684 设置GRP1守护进程为STARTUP(SUB:STARTUP)状态

LOG 日志文件的路径通过 dmmonitor.ini 中的 MON_LOG_PATH 参数来设置,如果没有设置则默认和 dmmonitor.ini 在同一个目录下。

LOG 日志文件的名称由 dmmonitor.ini 参数 MON_LOG_FLAG 决定。

注意

当MON_LOG_FLAG=1时,LOG日志文件的名称带时间戳(年月日时分秒)。详细的命名规则如下:

普通监视器和单实例监视器的 LOG 日志文件的命名格式为 “dmmonitor_年月日时分秒.log”。例如“dmmonitor_20250108230523.log”。

多实例监视器的 LOG 日志文件命名格式为“dmmonitor*组名监视器名_*年月日时分秒.log”,其中组名为 dmmonitor.ini 中的守护进程组配置项名,监视器名为 dmmonitor.ini 中 MON_NAME 参数配置的值。以 4.2.2.2.1 多实例监视器配置文件中展示的配置文件为例,该监视器节点在 2025 年 1 月 8 日 23 点 05 分 23 秒生成的 LOG 日志文件路径为:/dm/data/log,文件名为:dmmonitor_GRP1_MON1_20250108230523.log。

注意

当MON_LOG_FLAG=0时,LOG日志文件的名称不带时间戳。但是在切换日志文件时会重命名为带时间戳的日志文件名。

微信扫码
分享文档
扫一扫
联系客服