Amazon Redshift コンソールに、クエリのステータスが [COMPLETED (完了)] と表示されますが、その後ステータスが [ABORTED (中断)] に変わります。SQL クライアントの応答は、1 つ以上のコマンドが完了していることを示していますが、前のセッションまたはトランザクションからの結果をクエリしたときにテーブルに対してデータの変更が行われていません。この問題を解決するには、どうすれば良いですか?

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

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

トランザクションが後でコミットされると、変更内容が表示されます。ただし、トランザクションをコミットできない場合、Amazon Redshift コンソールはクエリのステータスが [ABORTED] であることを示します。トランザクションをコミットできなかった理由を見つけるために、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 クライアントまたはドライバーに応じて、この設定を有効にすることも、トランザクションが完了したときに明示的な 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 システムテーブルに ROLLBACK のエントリが含まれます。次のクエリを実行して、変更がロールバックされたかどうかを確認します。

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

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


このページは役に立ちましたか? はい | いいえ

AWS サポートナリッジセンターに戻る

サポートが必要ですか? AWS サポートセンターをご覧ください

公開日: 2019 年 3 月 25 日