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 の状態が期待どおりにならず、上記のエラーが発生します。
たとえば、以下の2つのシナリオでは、テナントが不整合な中間ロール切り替え状態にあります。
現在のテナントでプライマリ→スタンバイの切り替えを実行する必要があるが、以前に失敗したスタンバイ→プライマリの切り替え操作があり、その結果
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 を実行してリーダーのいないログストリームのリストを取得します。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の値を変更する際、小さすぎる値は設定しないでください。20 秒以上を推奨します。例は以下のとおりです。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';2回の照会結果に基づき、
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の2倍の時間だけ大きくなるまでしばらく待ってから、次のステップを実行します。ビュー
CDB_OB_LS_LOCATIONSを照会し、各ログストリームのリーダーレプリカの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 ポート番号に置き換える必要があります。
照会結果に基づいて判断します。
照会結果が空でない場合、以下の操作を実行して、永久オフラインのマシンをログストリームのリーダーレプリカの
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;照会結果に基づき、照会された各ログストリームに対応する、永久オフラインのマシンをログストリームのリーダーレプリカの
MEMBER_LISTから削除するタスクが存在する必要があります。ログストリームのうち、このタスクが開始されていないものがある場合、またはタスクが完了しないままの場合は、テクニカルサポートに連絡し、対応を依頼してください。照会結果が空の場合、テナントのすべてのログストリームのリーダーレプリカの
MEMBER_LIST情報に永久オフラインのマシンが存在しないことを意味します。次のステップに進み、各ログストリームのリーダーレプリカのLEARNER_LIST情報を確認します。
ビュー
CDB_OB_LS_LOCATIONSを照会し、各ログストリームのリーダーレプリカの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 ポート番号に置き換える必要があります。
照会結果に基づいて判断します。
照会結果が空でない場合、以下の操作を実行して、永久オフラインのマシンをログストリームのリーダーレプリカの
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_LISTから削除するタスクが存在する必要があります。ログストリームのうち、このタスクが開始されていないものがある場合、またはタスクが完了しないままの場合は、テクニカルサポートに連絡し、対応を依頼してください。照会結果が依然として空の場合、テナントのすべてのログストリームのリーダーレプリカの
LEARNER_LIST情報にも永久オフラインのマシンが存在しないことを意味します。次のステップに進み、テナントに永久オフラインのマシン上の余分なレプリカがまだ存在するかどうかを確認します。
テナントのすべてのログストリームのリーダーレプリカの
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はログ復元ソーステナントに対応するテナント名です。
復元ソースを設定する際に指定した専用ユーザーで現在のスタンバイテナントにログインします。
現在のユーザーが持つ権限を確認し、ログ復元ソーステナント内の一部の必要なシステムビューへの照会権限を持っているかどうかを確認します。
MySQL モードテナントで現在のユーザーが持つ権限を確認する詳細な操作については、ユーザー権限の確認 を参照してください。
Oracle モードテナントで現在のユーザーが持つ権限を確認する詳細な操作については、ユーザー権限の確認 を参照してください。
ネットワークベースの物理スタンバイデータベースのシナリオで、ビューにアクセスする専用ユーザーに必要なユーザー権限については、ログ復元ソースの設定 を参照してください。照会結果に基づき、現在のユーザーがドキュメントで要求されている権限を持っていない場合は、現在のユーザーに適切な権限を付与してください。
権限付与が完了した後、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 操作によりスタンバイテナントをプライマリテナントに切り替える操作を再実行してください。再実行後も成功しない場合は、テクニカルサポートに連絡し、対応を依頼してください。