首批通过分布式安全可靠测评,为关键业务系统打造
Switchover 或 Failover 相关问题
更新时间:2026-05-28 17:28:22
在执行 SWITCHOVER TO STANDBY VERIFY/SWITCHOVER TO STANDBY、SWITCHOVER TO PRIMARY VERIFY/SWITCHOVER TO PRIMARY 以及 ACTIVATE STANDBY VERIFY/ACTIVATE STANDBY 等命令进行主切备或备切主操作时,系统可能会提示报错信息,该报错信息展示了不能成功执行切换命令的原因。本节主要介绍出现这些报错信息后的问题排查及解决方法。
报错信息 1
ERROR HY000: log restore source is primary, switchover to primary is not allowedERROR HY000: log restore source is not in normal switchover status, switchover to primary is not allowedERROR HY000: log restore source is not in normal status, switchover to primary is not allowed
报错原因
执行 Switchover 将备租户切换为主租户时,要求该备租户的日志恢复源对应的租户满足以下条件:
租户角色
TENANT_ROLE为PRIMARY。租户状态
STATUS为NORMAL。租户的
SWITCHOVER_STATUS为NORMAL。
如果以上有一项条件不满足,基于网络的物理备库场景下就可能出现以上报错。
处理方法
说明
对于基于日志归档的物理备库场景,不会出现以上报错,需要您参考以下步骤自行检查归档源所在的租户是否已经切换为备租户,否则可能会出现双主租户或者本次 Switchover 操作一直无法完成日志同步的问题。
登录恢复源或归档源所在的集群,查询恢复源或归档源对应租户的状态。
系统租户用户租户系统租户下,通过以下 SQL 查看恢复源或归档源对应租户的状态。
obclient [oceanbase]> SELECT TENANT_NAME, TENANT_ID, TENANT_ROLE, STATUS, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'tenant_name';其中,
tenant_name需要替换为恢复源或归档源对应租户的租户名。MySQL 模式租户下,通过以下 SQL 查看当前租户(恢复源或归档源对应租户)的状态。
obclient [oceanbase]> SELECT TENANT_NAME, TENANT_ID, TENANT_ROLE, STATUS, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS;Oracle 模式租户下,通过以下 SQL 查看当前租户(恢复源或归档源对应租户)的状态。
obclient [SYS]> SELECT TENANT_NAME, TENANT_ID, TENANT_ROLE, STATUS, SWITCHOVER_STATUS FROM SYS.DBA_OB_TENANTS;根据查询结果,如果确认租户有状态不满足要求,登录日志恢复源或者归档源对应的租户执行主切备操作,然后再重新执行当前的备切主操作。
如果问题仍未解决,请联系技术支持人员协助处理。
报错信息 2
ERROR HY000: tenant status is not normal, switchover to primary is not allowedERROR HY000: tenant status is not normal, failover to primary is not allowedERROR HY000: tenant status is not normal, switchover to standby is not allowed
报错原因
执行租户角色切换操作时,要求租户的 STATUS 为 NORMAL 状态,如果不是该状态,就可能出现以上报错。
处理方法
执行以下 SQL,查询当前租户的状态。
系统租户用户租户系统租户下,通过以下 SQL 查看指定租户的状态。
obclient [oceanbase]> SELECT TENANT_NAME, STATUS FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'tenant_name';其中,
tenant_name需要替换为待执行角色切换命令的租户的租户名。MySQL 模式下,通过以下 SQL 查看当前租户的状态。
obclient [oceanbase]> SELECT TENANT_NAME, STATUS FROM oceanbase.DBA_OB_TENANTS;Oracle 模式下,通过以下 SQL 查看当前租户的状态。
obclient [SYS]> SELECT TENANT_NAME, STATUS FROM SYS.DBA_OB_TENANTS;根据查询结果,确认租户状态不是
NORMAL后,排查租户状态不是NORMAL的原因,租户可能还在创建中或恢复中,可以等待租户创建或恢复完成,或者联系技术支持人员协助处理。
报错信息 3
ERROR HY000: switchover status not match, switchover to primary is not allowedERROR HY000: switchover status not match, failover to primary is not allowedERROR HY000: switchover status not match, switchover to standby is not allowed
报错原因
执行租户角色切换操作时,要求当前租户不能处于不匹配的中间角色切换状态,否则将会导致 SWITCHOVER STATUS 状态不符合预期,就会出现以上报错。
例如,以下两种场景中,租户处于不匹配的中间角色切换状态:
当前租户需要执行主切备操作,但是租户之前还有一次不成功的备切主操作,导致其
SWITCHOVER STATUS为SWITCHING TO PRIMARY或者其他备切主的中间状态。当前租户需要执行备切主操作,但是租户之前还有一次不成功的主切备操作,导致其
SWITCHOVER STATUS为SWITCHING TO STANDBY或者其他主切备的中间状态。
处理方法
执行以下 SQL,查询当前租户
SWITCHOVER_STATUS的状态。系统租户用户租户系统租户下,通过以下 SQL 查看指定租户
SWITCHOVER_STATUS的状态。obclient [oceanbase]> SELECT TENANT_NAME, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'tenant_name';其中,
tenant_name需要替换为待执行角色切换命令的租户的租户名。MySQL 模式下,通过以下 SQL 查看当前租户
SWITCHOVER_STATUS的状态。obclient [oceanbase]> SELECT TENANT_NAME, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS;Oracle 模式下,通过以下 SQL 查看当前租户
SWITCHOVER_STATUS的状态。obclient [SYS]> SELECT TENANT_NAME, SWITCHOVER_STATUS FROM SYS.DBA_OB_TENANTS;有关
SWITCHOVER_STATUS字段中各状态的详细说明,请参见 DBA_OB_TENANTS。根据查询的租户
SWITCHOVER_STATUS状态,确认当前租户正在进行中的角色切换流程,再执行一次相应的角色切换命令。如果问题仍未解决,请联系技术支持人员协助处理。
报错信息 4
ERROR HY000: Incorrect arguments to tenant name, only support operating user tenant
报错原因
执行租户角色切换操作时,要求当前租户的租户类型必须是用户租户,如果不是用户租户,就会出现以上报错。
处理方法
执行以下 SQL,查询当前租户的租户类型。
系统租户用户租户系统租户下,通过以下 SQL 查看指定租户的租户类型。
obclient [oceanbase]> SELECT TENANT_NAME, TENANT_TYPE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'tenant_name';其中,
tenant_name需要替换为待执行角色切换命令的租户的租户名。MySQL 模式下,通过以下 SQL 查看当前租户的租户类型。
obclient [oceanbase]> SELECT TENANT_NAME, TENANT_TYPE FROM oceanbase.DBA_OB_TENANTS;Oracle 模式下,通过以下 SQL 查看当前租户的租户类型。
obclient [SYS]> SELECT TENANT_NAME, TENANT_TYPE FROM SYS.DBA_OB_TENANTS;在查询结果中,确认当前租户的
TENANT_TYPE,正确的TENANT_TYPE应为USER。如果确认当前租户的租户类型不是
USER,请选择符合条件的用户租户,并重新执行租户角色切换命令。
报错信息 5
ERROR HY000: Incorrect arguments to tenant name, please don't specify tenant name
报错原因
登录用户租户执行租户角色切换操作时,命令中不能指定租户名,只能默认为当前用户租户。如果命令中指定了租户名,就会出现以上报错。
处理方法
去掉命令中的 TENANT tenant_name,并重新执行切换命令。
报错信息 6
ERROR HY000: the tenant has LS replicas without leader, switchover to primary is not allowedERROR HY000: the tenant has LS replicas without leader, failover to primary is not allowed
报错原因
执行备切主操作时,要求当前租户不允许有日志流无主。如果当前租户有日志流无主,就会出现以上报错。
处理方法
登录当前租户所在集群的
sys租户,执行以下 SQL,获取没有 Leader 的日志流列表。obclient [oceanbase]> SELECT DISTINCT A.TENANT_ID, A.LS_ID FROM CDB_OB_LS A LEFT JOIN oceanbase.GV$OB_LOG_STAT B ON A.LS_ID = B.LS_ID AND A.TENANT_ID = B.TENANT_ID AND B.ROLE='LEADER' WHERE B.LS_ID IS NULL AND A.STATUS NOT IN ('CREATING', 'CREATED', 'TENANT_DROPPING', 'CREATE_ABORT', 'PRE_TENANT_DROPPING') AND A.TENANT_ID IN (user_tenant_id, user_tenant_id - 1);其中,
user_tenant_id需要替换为目标租户的TENANT_ID。如果查询结果不为空,则表示租户有日志流无主。
根据查询结果,确认租户有日志流无主后,请联系技术支持人员协助处理。
报错信息 7
ERROR HY000: the tenant has units on temporary offline servers, switchover to primary is not allowedERROR HY000: the tenant has units on temporary offline servers, failover to primary is not allowed
报错原因
执行备切主操作时,默认要求租户所在的机器都在线。如果有机器不在线,例如宕机或者网络故障,则要求机器处于永久下线状态,并且没有合法副本在该机器上。
上述报错说明,租户所在的机器部分处于临时下线状态,不允许执行 Switchover to Primary 或 Failover to Primary。
处理方法
登录备租户所在集群的
sys租户。查询有租户 Unit 的临时下线机器,并获取机器的
LAST_OFFLINE_TIME。obclient [oceanbase]> SELECT SVR_IP, SVR_PORT, LAST_OFFLINE_TIME, NOW() FROM oceanbase.DBA_OB_SERVERS WHERE LAST_OFFLINE_TIME IS NOT NULL AND (SVR_IP, SVR_PORT) IN ( SELECT DISTINCT SVR_IP, SVR_PORT FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = user_tenant_id);其中,
user_tenant_id需要替换为目标租户的TENANT_ID。查询结果的示例如下:
+----------------+----------+----------------------------+---------------------+ | SVR_IP | SVR_PORT | LAST_OFFLINE_TIME | NOW() | +----------------+----------+----------------------------+---------------------+ | xxx.xx.xxx.212 | 13326 | 2023-12-07 10:44:53.928742 | 2023-12-07 15:58:26 | +----------------+----------+----------------------------+---------------------+查询配置项
server_permanent_offline_time的值,再根据获取的LAST_OFFLINE_TIME与配置项的值,判断机器的永久下线时间。集群级配置项
server_permanent_offline_time用于设置节点心跳中断的时间阈值,即节点心跳中断多久后认为其被永久下线,永久下线的节点上的数据副本需要被自动补足。有关该配置项的更多详细信息,参见 server_permanent_offline_time。obclient [oceanbase]> SHOW PARAMETERS LIKE 'server_permanent_offline_time';根据查询结果,如果
LAST_OFFLINE_TIME + server_permanent_offline_time小于等于NOW(),则表示机器已经永久下线了,否则机器就是临时下线。对于机器临时下线的场景,可以参考以下操作进行处理。
检查该机器上的 observer 进程是否还在,如果不在,手动启动 observer 进程后,重新执行备切主操作。
如果仍然不成功,则需要执行下一步。
调小配置项
server_permanent_offline_time的值,使临时下线机器满足永久下线条件,然后重新执行备切主操作。修改配置项
server_permanent_offline_time的值时,不可设置过小,推荐至少要在 20s 以上,示例如下。obclient [oceanbase]> ALTER SYSTEM SET server_permanent_offline_time = '30s';重新执行备切主操作后,如果执行不成功并且提示有副本在永久下线的机器上,请参考本文的 报错信息8 进行进一步的处理。其他问题,请联系技术支持协助处理。
报错信息 8
ERROR HY000: the tenant has LS replicas on at least one of the permanent offline servers, switchover to primary is not allowedERROR HY000: the tenant has LS replicas on at least one of the permanent offline servers, failover to primary is not allowed
报错原因
执行备切主操作时,默认要求租户所在的机器都在线。如果有机器不在线,例如宕机或者网络故障,则要求机器处于永久下线状态,并且没有合法副本在该机器上。
上述报错说明,租户有副本在永久下线的机器上,不允许执行 Switchover to Primary 或 Failover to Primary。
处理方法
登录备租户所在集群的
sys租户。确认租户内永久下线的机器的信息。
查询下线机器的 IP 信息及
LAST_OFFLINE_TIME。obclient [oceanbase]> SELECT SVR_IP, SVR_PORT, LAST_OFFLINE_TIME, NOW() FROM oceanbase.DBA_OB_SERVERS WHERE LAST_OFFLINE_TIME IS NOT NULL AND (SVR_IP, SVR_PORT) IN ( SELECT DISTINCT SVR_IP, SVR_PORT FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = user_tenant_id);其中,
user_tenant_id需要替换为备租户的TENANT_ID。查询配置项
server_permanent_offline_time的值,再根据获取的LAST_OFFLINE_TIME与配置项的值,判断机器的永久下线时间。集群级配置项
server_permanent_offline_time用于设置节点心跳中断的时间阈值,即节点心跳中断多久后认为其被永久下线,永久下线的节点上的数据副本需要被自动补足。有关该配置项的更多详细信息,参见 server_permanent_offline_time。obclient [oceanbase]> SHOW PARAMETERS LIKE 'server_permanent_offline_time';根据两次的查询结果,如果
LAST_OFFLINE_TIME + server_permanent_offline_time小于等于NOW(),则表示机器已经永久下线了。
查询移除副本的时间间隔。
obclient [oceanbase]> SHOW PARAMETERS LIKE '%balancer_idle_time%';根据获取到的移除副本的时间间隔和上一步获取的
LAST_OFFLINE_TIME + server_permanent_offline_time,等待一段时间,直到当前时间比LAST_OFFLINE_TIME + server_permanent_offline_time大至少两倍的balancer_idle_time时间后,执行下一步。查询视图
CDB_OB_LS_LOCATIONS,观察每个日志流 Leader 副本的MEMBER_LIST信息,确认是否存在永久下线的机器。obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE TENANT_ID = user_tenant_id AND ROLE = 'LEADER' AND MEMBER_LIST LIKE "%permanent_offline_server_ip:permanent_offline_server_port%";其中:
user_tenant_id需要替换为目标租户的TENANT_ID。permanent_offline_server_ip需要替换为永久下线机器的 IP。permanent_offline_server_port需要替换为永久下线机器的 RPC 端口号。
根据查询结果,进行判断:
如果查询结果不为空,则需要执行以下操作,确认是否已经发起了将永久下线机器从日志流 Leader 副本的
MEMBER_LIST中移除的任务。obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_ROOTSERVICE_EVENT_HISTORY WHERE MODULE = 'disaster_recovery' AND EVENT LIKE "%remove_ls_paxos_replica%" ORDER BY TIMESTAMP DESC;根据查询结果,每一个查到的日志流都应该有对应的将永久下线机器从日志流 Leader 副本的
MEMBER_LIST中移除的任务,如果有日志流没有发起该任务或者任务一直没有完成,请联系技术支持人员协助处理。如果查询结果为空,则表示租户所有日志流 Leader 副本的
MEMBER_LIST信息中不存在永久下线的机器,需要进行下一步检查,观察每个日志流 Leader 副本的LEARNER_LIST信息。
查询视图
CDB_OB_LS_LOCATIONS,观察每个日志流 Leader 副本的LEARNER_LIST信息,确认是否存在永久下线的机器。obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE TENANT_ID = user_tenant_id AND ROLE = 'LEADER' AND LEARNER_LIST LIKE "%permanent_offline_server_ip:permanent_offline_server_port%";其中:
user_tenant_id需要替换为目标租户的TENANT_ID。permanent_offline_server_ip需要替换为永久下线机器的 IP。permanent_offline_server_port需要替换为永久下线机器的 RPC 端口号。
根据查询结果,进行判断:
如果查询结果不为空,则需要执行以下操作,确认是否已经发起了将永久下线机器从日志流 Leader 副本的
LEARNER_LIST中移除的任务。obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_ROOTSERVICE_EVENT_HISTORY WHERE MODULE = 'disaster_recovery' AND EVENT LIKE "%remove_ls_non_paxos_replica%" ORDER BY TIMESTAMP DESC;查询结果中,每一个查到的日志流都应该有对应的将永久下线机器从日志流 Leader 副本的
LEADER_LIST中移除的任务,如果有日志流没有发起该任务或者任务一直没有完成,请联系技术支持人员协助处理。如果查询结果仍然为空,则表示租户所有日志流 Leader 副本的
LEARNER_LIST信息中也不存在永久下线的机器,则需要执行下一步,确认租户是否还有多余的副本在永久下线的机器上。
如果租户所有日志流其 LEADER 副本的
MEMBER_LIST和LEARNER_LIST信息中都不存在永久下线的机器,则需要稍等片刻,执行以下命令,确认租户是否还有多余的副本在永久下线的机器上。obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE TENANT_ID = user_tenant_id AND SVR_IP = 'permanent_offline_server_ip' AND SVR_PORT = permanent_offline_server_port;其中:
user_tenant_id需要替换为目标租户的TENANT_ID。permanent_offline_server_ip需要替换为永久下线机器的 IP。permanent_offline_server_port需要替换为永久下线机器的 RPC 端口号。
如果查询结果为空,表示租户没有多余副本在永久下线的机器上,直接重试备切主操作即可。如果仍然不成功,请联系技术支持协助处理。
如果查询结果不为空,则表示租户有多余副本在永久下线的机器上,需要等待一段时间后,再次确认是否还有多余的副本在永久下线的机器上,如果没有副本在永久下线的机器上了,则可以重试备切主操作,如果租户仍然有副本在永久下线的机器上,请联系技术支持人员协助处理。
如果仍然有其他问题,请联系技术支持人员协助处理。
报错信息 9
ERROR HY000: wait tenant sync to latest failed(original error code: -4012), switchover to primary is not allowed
注意
报错信息 original error code: -4012 中的 -4012,仅代表其中一种可能出现的错误码,该报错还有可能显示为其它错误码。
报错原因
执行 Switchover 将备租户切换为主租户时,要求该备租户与恢复源的日志流保持同步,如果有日志流不同步,就会出现以上报错。
说明
执行 SWITCHOVER TO STANDBY VERIFY 命令时,系统仅检查备租户与恢复源的系统日志流是否同步;执行 SWITCHOVER TO STANDBY命令时,系统会检查备租户与恢复源的所有日志流是否同步。
处理方法
基于网络的物理备库
检查主备租户间网络的联通状态。
如果确认网络联通没有问题,继续执行下一步。
登录备租户所在集群的
sys租户,检查备租户的恢复状态。obclient [oceanbase]> SELECT LS_ID, SYNC_SCN, SYNC_STATUS, ERR_CODE, COMMENT FROM oceanbase.V$OB_LS_LOG_RESTORE_STATUS WHERE TENANT_ID = user_tenant_id;其中,
user_tenant_id需要替换为备租户的TENANT_ID。根据查询结果,如果
SYNC_STATUS为NORMAL,可以观察SYNC_SCN是否一直在增长,如果没有增长或者SYNC_STATUS为其他状态,请联系技术支持人员协助处理。
基于日志归档的物理备库
检查日志归档对应租户的租户角色是否是
STANDBY。系统租户用户租户系统租户下,通过以下 SQL 查看对应租户的状态。
obclient [oceanbase]> SELECT TENANT_NAME, TENANT_ID, TENANT_ROLE, STATUS, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'tenant_name';其中,
tenant_name需要替换为恢复源或归档源对应租户的租户名。MySQL 模式租户下,通过以下 SQL 查看当前租户的状态。
obclient [oceanbase]> SELECT TENANT_NAME, TENANT_ID, TENANT_ROLE, STATUS, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS;Oracle 模式租户下,通过以下 SQL 查看当前租户的状态。
obclient [SYS]> SELECT TENANT_NAME, TENANT_ID, TENANT_ROLE, STATUS, SWITCHOVER_STATUS FROM SYS.DBA_OB_TENANTS;根据查询结果,如果当前租户的
TENANT_ROLE不是STANDBY,则需要先将该租户切为备租户。如果查询结果为如下所示,则表示租户状态正常,可以继续执行下一步。
+-------------+--------+-------------------+ | TENANT_ROLE | STATUS | SWITCHOVER_STATUS | +-------------+--------+-------------------+ | STANDBY | NORMAL | NORMAL | +-------------+--------+-------------------+登录备租户所在集群的
sys租户,检查备租户的恢复状态。obclient [oceanbase]> SELECT LS_ID, SYNC_SCN, SYNC_STATUS, ERR_CODE, COMMENT FROM oceanbase.V$OB_LS_LOG_RESTORE_STATUS WHERE TENANT_ID = user_tenant_id;其中,
user_tenant_id需要替换为备租户的TENANT_ID。根据查询结果,如果
SYNC_STATUS为NORMAL,可以观察SYNC_SCN是否一直在增长,如果没有增长或者SYNC_STATUS为其他状态,请联系技术支持人员协助处理。
报错信息 10
ERROR HY000: log restore source LS state not match, switchover to primary not allowed
报错原因
基于网络的物理备库场景下,如果需要执行 Switchover 操作将备租户切换为主租户,要求日志恢复源对应租户的日志流的 ACCESS_MODE 均为 RAW_WRITE。如果不满足该条件,就可能会出现以上报错。
处理方法
登录日志恢复源对应租户所在集群的
sys租户。确认该租户下日志流的
ACCESS_MODE。obclient [oceanbase]> SELECT LS_ID, ACCESS_MODE FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = user_tenant_id AND ROLE = 'LEADER';其中,
user_tenant_id需要替换为日志恢复源对应租户的TENANT_ID。根据查询结果,如果有日志流的
ACCESS_MODE不为RAW_WRITE,可能是有些日志流正在等待被垃圾回收,待日志流被回收后,再重新执行 Switchover 操作将备租户切换为主租户。如果重新执行后仍然不成功,请联系技术支持人员协助处理。
报错信息 11
ERROR HY000: query primary failed(original error code: -2002), switchover to primary is not allowed
报错原因
基于网络的物理备库场景下,如果需要执行 Switchover 操作将备租户切换为主租户,要求当前备租户能够连接日志恢复源租户并且拥有该租户中一些必要的系统视图的查询权限。
上述报错说明,日志恢复源租户所在的 Server 宕机或者网络不通。
处理方法
获取日志恢复源租户的相关信息。
登录当前备租户或备租户所在集群的
sys租户。执行以下命令,获取日志恢复源租户的相关信息。
系统租户下查询
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE WHERE tenant_id = xxxx\G其中,
tenant_id需要替换为当前备租户的tenant_id。用户租户下查询
MySQL 模式Oracle 模式语句如下:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE\G语句如下:
obclient [oracle]> SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE\G
查询结果的示例如下:
*************************** 1. row *************************** TENANT_ID: 1004 ID: 1 TYPE: SERVICE VALUE: IP_LIST=100.xx.xx.xxx:13359;100.xx.xxx.xxx:13361,USER=mytest@backup_mysql_tenant,PASSWORD=*********************************************,TENANT_ID=1002,CLUSTER_ID=1,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true RECOVERY_UNTIL_SCN: 4611686018427387903 1 row in set查询结果中,
VALUE字段中的IP_LIST=xxxx属性展示了日志恢复源租户所在 Server 的 IP 地址及端口号。
检查日志恢复源租户所在 Server 的网络联通性或者手动启动 observer 进程后,重新执行 Switchover 操作将备租户切换为主租户。如果重新执行后仍然不成功,请联系技术支持人员协助处理。
报错信息 12
ERROR HY000: query primary failed(original error code: -1142), switchover to primary is not allowedERROR HY000: query primary failed(original error code: -1044), switchover to primary is not allowed
ERROR HY000: query primary failed(original error code: -942), switchover to primary is not allowed
报错原因
基于网络的物理备库场景下,如果需要执行 Switchover 操作将备租户切换为主租户,要求当前备租户能够连接日志恢复源租户并且拥有该租户中一些必要的系统视图的查询权限。
上述报错说明,连接日志恢复源的用户(即设置日志恢复源时指定的专用用户)没有系统视图的查询权限或者缺少部分系统视图的查询权限。
处理方法
获取日志恢复源租户的相关信息。
登录当前备租户或备租户所在集群的
sys租户。执行以下命令,获取日志恢复源租户的相关信息。
系统租户下查询
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE WHERE tenant_id = xxxx\G其中,
tenant_id需要替换为当前备租户的tenant_id。用户租户下查询
MySQL 模式Oracle 模式语句如下:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE\G语句如下:
obclient [oracle]> SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE\G
查询结果的示例如下:
*************************** 1. row *************************** TENANT_ID: 1004 ID: 1 TYPE: SERVICE VALUE: IP_LIST=100.xx.xx.xxx:13359;100.xx.xxx.xxx:13361,USER=mytest@backup_mysql_tenant,PASSWORD=*********************************************,TENANT_ID=1002,CLUSTER_ID=1,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true RECOVERY_UNTIL_SCN: 4611686018427387903 1 row in set查询结果中,
VALUE字段中USER=xxx属性对应的信息即为日志恢复源租户的相关信息。本示例中,mytest为设置日志恢复源时指定的专用用户名,即连接日志恢复源的用户;backup_mysql_tenant为日志恢复源租户对应的租户名。
使用设置恢复源时指定的专用用户登录当前备租户。
查看当前用户所拥有的权限,确认当前用户是否拥有日志恢复源租户中一些必要的系统视图的查询权限。
基于网络的物理备库场景下,访问视图的专用用户所需的用户权限,请参见 设置日志恢复源。根据查询结果,如果当前用户不具备文档中所要求的权限,请为当前用户授予相应权限。
完成授权后,重新执行 Switchover 操作将备租户切换为主租户。如果重新执行后仍然不成功,请联系技术支持人员协助处理。
报错信息 13
ERROR HY000: query primary failed(original error code: -1045), switchover to primary is not allowed
报错原因
基于网络的物理备库场景下,如果需要执行 Switchover 操作将备租户切换为主租户,要求当前备租户能够连接日志恢复源租户并且拥有该租户中一些必要的系统视图的查询权限。
上述报错说明,连接日志恢复源的用户(即设置日志恢复源时指定的专用用户)的用户名或密码错误。
处理方法
获取日志恢复源租户的相关信息。
登录当前备租户或备租户所在集群的
sys租户。执行以下命令,获取日志恢复源租户的相关信息。
系统租户下查询
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE WHERE tenant_id = xxxx\G其中,
tenant_id需要替换为当前备租户的tenant_id。用户租户下查询
MySQL 模式Oracle 模式语句如下:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE\G语句如下:
obclient [oracle]> SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE\G
查询结果的示例如下:
*************************** 1. row *************************** TENANT_ID: 1004 ID: 1 TYPE: SERVICE VALUE: IP_LIST=100.xx.xx.xxx:13359;100.xx.xxx.xxx:13361,USER=mytest@backup_mysql_tenant,PASSWORD=*********************************************,TENANT_ID=1002,CLUSTER_ID=1,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true RECOVERY_UNTIL_SCN: 4611686018427387903 1 row in set查询结果中,
VALUE字段中USER=xxx属性对应的信息即为日志恢复源租户的相关信息。本示例中,mytest为设置日志恢复源时指定的专用用户名,即连接日志恢复源的用户;backup_mysql_tenant为日志恢复源租户对应的租户名。
根据查询结果,请确认连接日志恢复源的用户其用户名和密码是否正确。
如果用户名和密码均正确,请联系技术支持人员协助处理。
报错信息 14
query primary failed(original error code: -xxxx), switchover to primary is not allowed
对于基于网络的物理备库场景,执行 Switchover 操作将备租户切换为主租户时,如果出现了如上所示的报错信息且错误码为本文中未介绍的其他错误码,请参考以下方法进行处理。
获取日志恢复源租户的相关信息。
登录当前备租户或备租户所在集群的
sys租户。执行以下命令,获取日志恢复源租户的相关信息。
系统租户下查询
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE WHERE tenant_id = xxxx\G其中,
tenant_id需要替换为当前备租户的tenant_id。用户租户下查询
MySQL 模式Oracle 模式语句如下:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE\G语句如下:
obclient [oracle]> SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE\G
查询结果的示例如下:
*************************** 1. row *************************** TENANT_ID: 1004 ID: 1 TYPE: SERVICE VALUE: IP_LIST=100.xx.xx.xxx:13359;100.xx.xxx.xxx:13361,USER=mytest@backup_mysql_tenant,PASSWORD=*********************************************,TENANT_ID=1002,CLUSTER_ID=1,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true RECOVERY_UNTIL_SCN: 4611686018427387903 1 row in set查询结果中,
VALUE字段中的IP_LIST=xxxx属性展示了日志恢复源租户所在 Server 的 IP 地址及端口号。
检查恢复源租户所在的 Server 是否均可以提供服务。
如果有 Server 不能提供服务,请等待一段时间后,直到 Server 能提供服务后,重新执行 Switchover 操作将备租户切换为主租户。如果重新执行后仍然不成功,请联系技术支持人员协助处理。
如果所有 Server 均能提供服务,请联系技术支持人员协助处理。
报错信息 15
ERROR HY000: primary tenant's user account is locked, switchover to primary is not allowed
报错原因
基于网络的物理备库场景下,如果需要执行 Switchover 操作将备租户切换为主租户,要求连接日志恢复源的用户(即设置日志恢复源时指定的专用用户)不能被锁定。如果连接日志恢复源的用户被锁定,就可能会出现以上报错。
处理方法
获取日志恢复源租户的相关信息。
登录当前备租户或备租户所在集群的
sys租户。执行以下命令,获取日志恢复源租户的相关信息。
系统租户下查询
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE WHERE tenant_id = xxxx\G其中,
tenant_id需要替换为当前备租户的tenant_id。用户租户下查询
MySQL 模式Oracle 模式语句如下:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE\G语句如下:
obclient [oracle]> SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE\G
查询结果的示例如下:
*************************** 1. row *************************** TENANT_ID: 1004 ID: 1 TYPE: SERVICE VALUE: IP_LIST=100.xx.xx.xxx:13359;100.xx.xxx.xxx:13361,USER=mytest@backup_mysql_tenant,PASSWORD=*********************************************,TENANT_ID=1002,CLUSTER_ID=1,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true RECOVERY_UNTIL_SCN: 4611686018427387903 1 row in set查询结果中,
VALUE字段中USER=xxx属性对应的信息即为日志恢复源租户的相关信息。本示例中,mytest为设置日志恢复源时指定的专用用户名,即连接日志恢复源的用户;backup_mysql_tenant为日志恢复源租户对应的租户名。
使用管理员用户登录日志恢复源租户。
执行以下命令,确认连接日志恢复源的用户是否为锁定状态。
MySQL 模式语句如下:
obclient [oceanbase]> SELECT user_name,is_locked FROM oceanbase.DBA_OB_USERS WHERE user_name='mysql_tenant';tab Oracle 模式
语句如下:
obclient [SYS]> SELECT user_name,is_locked FROM SYS.ALL_VIRTUAL_USER_REAL_AGENT WHERE user_name='oracle_tenant';:::
查询结果中,如果
is_locked的值为YES,则表示该用户为锁定状态。执行以下命令,解锁用户。
obclient> ALTER USER user_name ACCOUNT UNLOCK;其中,
user_name需要替换为连接日志恢复源的用户名。有关用户锁定和解锁的详细操作及说明,请参见 MySQL 模式下锁定和解锁用户 和 Oracle 模式下锁定和解锁用户。
完成用户解锁操作后,重新执行 Switchover 操作将备租户切换为主租户。如果重新执行后仍然不成功,请联系技术支持人员协助处理。
报错信息 16
ERROR HY000: primary tenant is locked, switchover to primary is not allowed
报错原因
基于网络的物理备库场景下,如果需要执行 Switchover 操作将备租户切换为主租户,要求日志恢复源租户不能被锁定。如果日志恢复源租户被锁定,就可能会出现以上报错。
处理方法
获取日志恢复源租户的相关信息。
登录当前备租户或备租户所在集群的
sys租户。执行以下命令,获取日志恢复源租户的相关信息。
系统租户下查询
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE WHERE tenant_id = xxxx\G其中,
tenant_id需要替换为当前备租户的tenant_id。用户租户下查询
MySQL 模式Oracle 模式语句如下:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE\G语句如下:
obclient [oracle]> SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE\G
查询结果的示例如下:
*************************** 1. row *************************** TENANT_ID: 1004 ID: 1 TYPE: SERVICE VALUE: IP_LIST=100.xx.xx.xxx:13359;100.xx.xxx.xxx:13361,USER=mytest@backup_mysql_tenant,PASSWORD=*********************************************,TENANT_ID=1002,CLUSTER_ID=1,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true RECOVERY_UNTIL_SCN: 4611686018427387903 1 row in set查询结果中,
VALUE字段中USER=xxx属性对应的信息即为日志恢复源租户的相关信息。本示例中,mytest为设置日志恢复源时指定的专用用户名,即连接日志恢复源的用户;backup_mysql_tenant为日志恢复源租户对应的租户名。
登录日志恢复源租户所在集群的
sys租户。执行以下命令,确认该租户是否被锁定。
obclient [oceanbase]> SELECT LOCKED FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_ID = user_tenant_id;其中,
user_tenant_id需要替换为日志恢复源租户的TENANT_ID。查询结果中,如果该租户对应的
LOCKED字段的值为YES,则表示该租户已经被锁定。执行以下命令,解锁租户。
obclient [oceanbase]> ALTER TENANT tenant_name UNLOCK;其中,
tenant_name需要替换为日志恢复源租户的租户名。有关租户解锁的详细操作及说明,请参见 租户锁定和解锁。
完成租户解锁操作后,重新执行 Switchover 操作将备租户切换为主租户。如果重新执行后仍然不成功,请联系技术支持人员协助处理。