OpenGaussにおけるSQL実行情報の確認:SHOW WARNINGSおよびERRORS構文の使用法

機能の概要

本コマンドは、現在のデータベースセッション内で直前に実行されたSQLステートメントによって生成された診断情報を一覧表示します。エラー(Error)、警告(Warning)、通知(Note)の3種類の優先度を含むため、クエリの異常検知や内部処理フローの追跡、デバッグ作業において必須のツールとなります。

基本的な構文と制御引数

SHOW WARNINGS [LIMIT [オフセット,] 件数];
SHOW COUNT(*) WARNINGS;

SHOW ERRORS [LIMIT [オフセット,] 件数];
SHOW COUNT(*) ERRORS;
  • 件数 (row_count): 取得対象となるメッセージの最大行数を指定します。省略時は全件取得されます。
  • オフセット (offset): 結果セットの何行目から表示を開始するかを指定します。未指定の場合は先頭(0行目)から読み出されます。
  • sql_note (システムパラメータ): セッションレベルの設定値です。ONの状態では「Note」レベルのメッセージもSHOW WARNINGSの対象に含まれます。FALSEに設定することで、ノイズの多い通知ログをフィルタリング可能です。

戻り値のデータ構造

カラム名 データ型 説明
Level TEXT メッセージの優先度を示す列挙値(Note / Warning / Error)
Code INTEGER 該当する内部状態を表す数値エラーコード
Message TEXT 人間が読める形式の詳細メッセージ本文

内部仕様と運用上の留意点

Codeフィールドに格納される数値は、システム内部のマクロ定義(ERRCODE対応)から派生した識別子です。具体的には、特定の文字列パターンからASCII値を取得し、各桁を6ビット単位で右寄せ配置して30ビットの符号なし整数へ圧縮した結果が算出されます。アプリケーション側で独自のエラーハンドリングを実装する場合、これらの数値マッピングを参照することが推奨されます。

sql_noteパラメータの変更は即座にセッション環境に反映され、直後からのコマンド実行履歴に対してのみ適用されます。ログの冗長性を抑制したい運用環境では、適宜FALSEへの切り替え検討が有用です。

実践的なシナリオ例

以下は、テーブル作成時の例外処理、関数内INFOログのキャッチ、アドバザリロック解放時の警告、およびページネーション制御の実演です。

-- 初期状態の確認(Note表示は既定で有効)
SHOW sql_note;
-- sql_note
-- --------
-- on
-- (1行)

-- 既存スキーマ内に同名オブジェクトを作成しようとした際のError記録
CREATE TABLE IF NOT EXISTS app_config (setting_key VARCHAR(100));
INSERT INTO app_config VALUES ('debug_mode'); -- ここまでは正常動作

CREATE TABLE app_config (user_id INT, created_at TIMESTAMP);
-- ERROR: relation "app_config" already exists in schema "public" ...

SHOW WARNINGS LIMIT 1;
-- level |   code    |                                  message
-- ------+-----------+-----------------------------------------------------
-- Error | 117571716 | relation "app_config" already exists in schema "public"
-- (1行)

SHOW COUNT(*) WARNINGS;
-- count
-- -----
--     1
-- (1行)

-- LOGレベルのメッセージを捕まえるためのテスト関数
CREATE OR REPLACE FUNCTION validate_param(p_text CHAR)
RETURNS VOID AS $$
BEGIN
    RAISE INFO 'Validating input string: %', p_text;
END;
$$ LANGUAGE plpgsql;

SELECT validate_param('test_session'::CHAR);
-- 画面にはINFOログが表示されるが、セッション履歴はまだ記録完了していない状態

SHOW WARNINGS;
-- level | code |                     message                      
-- ------+------+--------------------------------------------------
-- Note  |    0 | Validating input string: test_session
-- (1行)

-- Noteレベルを非表示にする設定に変更
SET sql_note = FALSE;
SELECT validate_param('test_session'::CHAR);
SHOW WARNINGS;
-- level | code | message
-- ------+------+---------
-- (0行) -- フィルターがかかり、出力が空になることを確認

-- ロック管理系関数でのWarning発生サンプル
SELECT pg_advisory_unlock(500), pg_advisory_unlock_shared(501);
-- WARNING: you don't own a lock of type ExclusiveLock ...
-- WARNING: you don't own a lock of type ShareLock ...

SHOW ERRORS;
-- level  | code |                                      message
-- -------+------+--------------------------------------------------------
-- Warning|   64 | you don't own a lock of type ExclusiveLock
-- Warning|   64 | you don't own a lock of type ShareLock
-- (2行)

-- OFFSETを使用した部分取得テスト
SHOW WARNINGS LIMIT 1 OFFSET 1;
-- level  | code |                      message
-- -------+------+----------------------------------------------------
-- Warning|   64 | you don't own a lock of type ShareLock
-- (1行) -- 1行目の次に位置する警告のみ取得

タグ: OpenGauss SQL診断 データベースデバッグ SHOW WARNINGS PostgreSQL互換

7月25日 23:13 投稿