Amazon Redshift コンソールと SQL クライアントの応答では COPY コマンドが正常に完了したと表示されるが、Amazon Redshift テーブルにデータがコピーされていません。STL_LOAD_ERRORSSTL_LOADERROR_DETAIL、または STL_ERROR テーブルにもエラーは記録されていません。

これは、COPY コマンドは正常に実行されたが、その後 SQL トランザクションが完了しなかったためロールバックされた場合に発生します。トランザクションを完全に行うには、SQL トランザクションのコンテキストで COPY コマンドを実行します。SQL コマンドが完了しなかった場合、トランザクションのコンテキスト内で実行されたコマンドはすべてロールバックされます。この動作は仕様です。そのため、Amazon Redshift コンソールやエラーログテーブルにエラーが表示されません。

この問題を検証して修正するには、以下の手順を実行します。

  1. COPY コマンドのクエリ ID を使用して、STL_COMMIT_STATS テーブルに対して次のクエリを実行します。
         SELECT q.query, cs.xid, cs.endtime
         FROM stl_query q, stl_commit_stats cs
         WHERE q.query = QUERY ID
         AND q.xid = cs.xid;
    このクエリが結果を返さない場合は、COPY コマンドのトランザクションが完了せず、ロールバックが実行されています。これは通常、複数の SQL クライアントでトランザクションの自動コミットがデフォルトで無効になっており、明示的に宣言されないかぎりトランザクションをコミットしないために発生します。
  2. SQL クライアントの資料を参照して、デフォルトのトランザクション動作を検証します。
  3. SQL クライアントのデフォルトの動作が自動コミットを無効としている場合、次のいずれかの方法で問題を解決できます。
    • SQL クライアントの自動コミットを有効にします - これは必ずしも常に最適な解決方法ではありませんが、既存の SQL コマンドを変更する必要なくすぐに問題を解決できます。複数のアドホックデータロードを実行している場合など一部のケースでは、これがもっとも実用的な解決方法である場合もあります。
    • SQL ステートメント COMMIT または END を使用して、COPY コマンドの後で明示的にトランザクションをコミットします。コマンドがプログラムで実行されている場合、コマンド構文は「Psycopg 2.6 documentation」に説明されている Python の接続クラス conn.commit() ステートメントに似たものになるはずです。

AWS、Amazon Redshift、COPY コマンド、SQL、トランザクション、自動コミット、レコードがない


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

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

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