データベースの運用保守において、SQL実行エラーは非常に一般的であり、業務に直接的な影響を及ぼす可能性があります。SQL実行エラーの原因は多岐にわたり、例えば、データベースへの接続が正しくできない、データベースユーザーの権限が不足している、構文エラー、またはデータがクエリ条件を満たしていないなどが挙げられます。
皆様が問題の根本原因を迅速に特定し、効率的に解決できるよう支援するため、以下に明確で実用的なSQLエラーのトラブルシューティングプロセスをまとめました。このプロセスは、明確な操作手順を提供し、問題処理の効率を向上させ、業務への影響を可能な限り低減することを目的としており、日常的な運用保守業務を強力にサポートします。
SQL実行エラーのトラブルシューティングプロセスは、以下の図のとおりです。

手順の概要
SQL実行時にエラーが発生した場合、以下の手順で問題を調査できます。
SQL実行でエラーが発生した後、まずはSQLエラーメッセージを確認します。エラーメッセージに明確なエラーコードが含まれている場合は、そのエラーコードを基に問題を調査します。明確なエラーコードが欠けている場合は、問題のエラータイプを判断し、アプリケーション実行エラーか手動SQL実行エラーかを特定する必要があります。
アプリケーション実行エラーの場合、具体的な調査方法については、アプリケーション例外 - OceanBaseエラーコードがエラーメッセージに含まれない場合およびアプリケーション例外 - OceanBaseエラーコードがエラーメッセージに含まれる場合を参照してください。
手動SQL実行エラーの場合、手動で再現可能かどうかを判断します。
再現できない場合は、SQLステートメントを基にknowledge baseドキュメントで関連情報を検索し、参考にしながら調査します。
再現できる場合は、まず問題シナリオを再現します。元のシナリオに従って、2881または2883ポートでOceanBaseクラスタに接続し、元のSQLステートメントを実行して問題シナリオを再現します。
SQLエラーシナリオを再現した後、以下の手順で関連情報を収集し、問題を調査します。
以下のステートメントを実行して、
trace_idを取得します。注意
エラーが発生したSQLを実行した直後に、速やかに以下のステートメントを実行する必要があります。そうでない場合、クエリ結果はエラーが発生したSQLの
trace_idではありません。MySQLモードOracleモードMySQLモードで
trace_idを取得するステートメントは次のとおりです:obclient> SELECT last_trace_id();Oracleモードで
trace_idを取得するステートメントは次のとおりです:obclient> SELECT last_trace_id() FROM DUAL;取得した
trace_idに基づいて、実際にそのSQLを実行したホスト情報を取得します。OceanBaseクラスタは通常マルチノードでデプロイされているため、以下のSQLを使用してSQLが実際に実行されたノードを取得し、その後ログフィルタリングを行います。
MySQLモードOracleモードMySQLモードで以下のステートメントを実行します。
obclient> SELECT * FROM oceanbase.GV$OB_SQL_AUDIT WHERE trace_id=last_trace_id;ここで、
last_trace_idは前のステップで取得したtrace_idに置き換える必要があります。Oracleモードで以下のステートメントを実行します:
obclient> SELECT * FROM SYS.GV$OB_SQL_AUDIT WHERE trace_id=last_trace_id;ここで、
last_trace_idは前の手順で取得したtrace_idに置き換える必要があります。GV$OB_SQL_AUDITビューのクエリ結果によると、svr_ipに対応するホストが、実際にそのSQLを実行したホストです。取得したホスト情報に基づいて、
sshコマンドを使用して対応するホストにログインします。ログが保存されているディレクトリに移動します。
以下では、OceanBaseデータベースのインストールディレクトリを
/home/admin/oceanbaseと仮定します。ログの実際の保存パスは、実際の環境に基づいてください。cd /home/admin/oceanbase/log以下のコマンドを実行して、ログ内の関連情報をフィルタリングします。
grep "${trace_id}" observer.loggrep "${trace_id}" observer.log.xxxここで、
${trace_id}は前の手順で取得したtrace_idに、observer.log.xxxはタイムスタンプ付きのログファイルに置き換えてください。xxxはSQLエラーが発生した時間に基づいて、実際のタイムスタンプに置き換えてください。ログに提供されている情報に基づき、エラーコードや関連するエラーメッセージなどを組み合わせて問題を分析します。
ログやエラーコードに関する詳細については、ログの概要およびエラーメッセージの概要を参照してください。
ログの情報が不明確な場合は、技術サポートにお問い合わせいただき、調査をご支援いただけますようお願いいたします。
典型的な事例
以下は、一般的なSQL実行エラーのトラブルシューティング事例です。
SQLエラーが再現された後、データベースの戻り結果にエラーコード情報が含まれている場合
SELECTステートメントに多数のOR条件、または多数のANDで結合されたIN条件、あるいは多数のAND NOT条件が含まれる場合、SELECTステートメントの実行時にエラー-4013、No memory or reach tenant memory limitが発生します。
ログにエラーコード情報が含まれている場合
SQLステートメントを実行して
longtext型のフィールドを処理する際に、エラーErrorCode=5098が発生します。SQL実行時にエラー
error 4119 (RPC packet to send too long)が発生し、同時にtrace_idを使用してobserver.logをクエリすると、情報obrpc packet payload execced its limitが確認できます。
ログにその他のエラー情報が含まれている場合
- SQLステートメントのフィルター条件において、異なるフィールドに対する判定条件が64個を超える場合、エラー
-4002 Invalid argumentが発生します。
- SQLステートメントのフィルター条件において、異なるフィールドに対する判定条件が64個を超える場合、エラー
SQLエラーが再現された後、データベースの戻り結果にエラーコード情報が含まれている場合
c1,c2,c3列を含むクエリステートメントで、列c1,c2がインデックスヒットし、かつc1またはc2列に複数のin式がある場合、c1/c2/c3は任意のベクトル式を形成します。このステートメントを実行する際にinternal errorエラーが発生し、エラーコードはORA-00600です。
SQL実行後にエラーコードがあり、ログ内のエラーコード情報と照合する場合
- SQLステートメントの実行時に
Timeoutエラーが発生し、エラーコードはORA-00600です。
- SQLステートメントの実行時に