OceanBaseデータベースが実行される過程で、クライアントから送信されたトランザクションリクエストを実行し、実行終了後に結果をクライアントに返します。トランザクションの実行が失敗または異常な場合、トランザクションエラーが発生します。一般的なトランザクションエラーは大きく二つのカテゴリに分けられます。一つはトランザクション実行中にクライアントにスローされるエラーであり、もう一つはシステムログや内部ビューで検出されるエラーです。以下では、これら二つのカテゴリのエラーをまとめ、一般的なトラブルシューティング手法を概説します。これにより、一般的な問題を自力で特定することが容易になります。
トラブルシューティング手法
トランザクションの問題に対するトラブルシューティング手法は、主にトランザクション状態テーブルのクエリとシステムログの検索です。
ビュー GV$OB_TRANSACTION_PARTICIPANTS は、クラスタ全体の未終了トランザクションの参加者コンテキスト情報(リーダー・ノードおよびフォロワー・ノードを含む)を記録しています。現在のトランザクションのすべての参加者情報を収集することで、そのトランザクション全体の実行状態を構築できます。主なフィールドは以下の通りです:
TX_TYPE:トランザクション実行中、リーダー・ノード上ではこのフィールドは UNDECIDED と表示されます。トランザクションコミット中、リーダー・ノード上ではこのフィールドにトランザクションの具体的なタイプ(例:LOCAL、DISTRIBUTED)が表示されます。STATE:トランザクション実行中の状態を示します。トランザクション実行中、このフィールドは ACTIVE と表示されます。ACTION:トランザクション実行中、リーダー・ノード上ではこのフィールドは START と表示されます。トランザクションコミット中、リーダー・ノード上ではこのフィールドは COMMIT と表示されます。
例えば、以下のステートメントは実行中のトランザクション情報を示しています。
obclient> select * from gv$ob_transaction_participants\G
*************************** 1. row ***************************
TENANT_ID: 1002
SVR_IP: 11.xx.xx.xx
SVR_PORT: 48274
SESSION_ID: 3221506881
SCHEDULER_ADDR: "11.xx.xx.xx:48270"
TX_TYPE: UNDECIDED
TX_ID: 752
LS_ID: 1002
PARTICIPANTS: NULL
CTX_CREATE_TIME: 2022-09-21 16:28:46.037405
TX_EXPIRED_TIME: 2022-09-21 16:43:37.804879
STATE: ACTIVE
ACTION: START
PENDING_LOG_SIZE: 57
FLUSHED_LOG_SIZE: 0
ROLE: LEADER
*************************** 2. row ***************************
TENANT_ID: 1002
SVR_IP: 11.xx.xx.xx
SVR_PORT: 48270
SESSION_ID: 3221506881
SCHEDULER_ADDR: "11.xx.xx.xx:48270"
TX_TYPE: UNDECIDED
TX_ID: 752
LS_ID: 1001
PARTICIPANTS: NULL
CTX_CREATE_TIME: 2022-09-21 16:28:37.804879
TX_EXPIRED_TIME: 2022-09-21 16:43:37.804879
STATE: ACTIVE
ACTION: START
PENDING_LOG_SIZE: 57
FLUSHED_LOG_SIZE: 0
ROLE: LEADER
システムログについては、Trace ID を使用して対応する期間内の OBServer ログを検索することで、あるステートメントの実行パス上のすべてのログを表示できます。また、Trans ID を使用してそのトランザクションに関連するすべてのログを検索することもできます。