変更が行われていないのに、Amazon Redshift クエリのステータスが [Completed] (完了) から [Aborted] (中断) に変わったのはなぜですか?

最終更新日: 2020 年 10 月 5 日

Amazon Redshift コンソールに、クエリのステータスが [Completed] (完了) と表示されますが、その後ステータスが [Aborted] (中断) に変わります。しかし、以前のセッションまたはトランザクションの結果をクエリした際にテーブルは更新されませんでした。なぜこうなったのでしょうか?

簡単な説明

データを操作したりデータベースオブジェクトを作成したりする SQL ステートメントは、トランザクションがコミットされるまで保持されません。 これは、暗黙的に COMMIT を実行する TRUNCATE ステートメントには適用されません。

Amazon Redshift コンソールでは、まだ未処理トランザクションになっている場合、SQL ステートメントに対してそのクエリのステータスが [Completed] (完了) であることを示します。トランザクションがロールバックされると、ステータスは [Aborted] (中断) に変わります。また、STL_QUERY システムテーブルには、中断されたカラム値が 0 の場合に SQL 文が正常に完了したことが示されます。

トランザクションが後でコミットされると、変更内容が表示されます。ただし、トランザクションをコミットできない場合、Amazon Redshift コンソールはクエリが中断されたことを示します。トランザクションをコミットできない理由を特定するには、STL システムテーブルを確認します。

解決方法

次のクエリを実行して SVL_STATEMENTTEXT システムテーブルを確認し、SQL ステートメントのトランザクション ID (xid) でフィルタリングします。

SELECT * FROM SVL_STATEMENTTEXT WHERE xid IN (SELECT xid FROM STL_QUERY WHERE query = [QUERY ID]) ORDER BY starttime, sequence;

結果が対応する END または COMMIT ステートメントのない BEGIN ステートメントである場合、SQL クライアントまたはドライバーの AUTO COMMIT 設定は無効になります。SQL クライアントまたはドライバーによっては、AUTO COMMIT 設定を有効にすることができます。または、トランザクションの完了時に明示的な COMMIT 文または END 文を手動で発行することもできます。

SQL ステートメントがその変更をコミットすると、対応するエントリが STL_COMMIT_STATS システムテーブルに追加されます。次のクエリを実行して、変更内容がコミットされたことを確認します。

SELECT q.query, q.xid, NVL2(cs.endtime, cs.endtime::text, 'NO COMMIT') AS commit_endtime
FROM STL_QUERY q LEFT JOIN STL_COMMIT_STATS cs ON q.xid = cs.xid AND cs.node = -1
WHERE q.query = [QUERY ID];

SQL 文が変更をコミットできず、トランザクションが終了すると、ロールバック用のエントリが STL_UNDONE システムテーブルに表示されます。次のクエリを実行して、変更がロールバックされたかどうかを確認します。

SELECT *
FROM STL_UNDONE
WHERE xact_id_undone IN (SELECT xid from STL_QUERY where query = [QUERY ID]);

このクエリはロールバックされたトランザクションに関する情報を返します。つまり、トランザクションが完了するまで実行されず、変更が適用されなかったことを意味します。ロールバックは、シリアル化可能な分離違反がある場合、または管理者がセッションを終了するか、クエリをキャンセルした場合に発生します。ロールバックは、ネットワーク接続のタイムアウトによっても発生する可能性があります。ロールバックが発生すると、クライアントは詳細を含むエラーメッセージを受け取ります。したがって、クライアントが エラーのログを記録するように設定されていることを確認してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?