如何識別與 Amazon Redshift 中的 Data API 相關的錯誤?

上次更新日期:2022 年 10 月 31 日

如何確定 Amazon Redshift 中的 Data API 查詢失敗的原因?

解決方案

Amazon Redshift Data API 是非同步的,這表示您可以執行長時間運作的查詢,而不必等待查詢完成。當 Data API 查詢失敗時,查詢的狀態不會立即顯示。若要判斷查詢失敗的原因,請針對單一或多個查詢使用 DescribeStatement 動作。若要執行 DescribeStatement,您必須具有陳述式 ID。

單一查詢

若要針對叢集執行單一查詢,請使用 ExecuteStatement 動作來傳回陳述式 ID:

注意:下列範例命令使用 AWS Secrets Manager 身分驗證方法。此命令會針對叢集執行 SQL 陳述式,並傳回識別碼以擷取結果。

aws redshift-data execute-statement
    --region us-east-1
    --secret arn:aws:secretsmanager:us-east-1:123456789012:secret:myuser-secret-hKgPWn
    --cluster-identifier redshift-cluster-1
    --sql "select * from test_table;"
    --database dev

注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI

輸出類似於以下內容:

{
    "ClusterIdentifier": "redshift-cluster-1",
    "CreatedAt": "2022-09-16T12:22:31.894000+05:30",
    "Database": "dev",
    "Id": "458c568d-717b-4f36-90bd-e642bfb06cbf",
    "SecretArn": "arn:aws:secretsmanager:us-east-1:123456789012:secret:myuser-secret-hKgPWn"
}

上述 SQL 陳述式會傳回 ExecuteStatementOutput,其中包含陳述式 ID。您可以使用 DescribeStatement 並輸入陳述式 ID 來檢查查詢的狀態:

aws redshift-data describe-statement --id 458c568d-717b-4f36-90bd-e642bfb06cbf

DescribeStatement 的輸出提供下列其他詳細資訊:

  • RedshiftPid
  • 查詢期間
  • 其中的列數
  • 結果集的大小
  • RedshiftQueryID

輸出類似於以下內容:

{
    "ClusterIdentifier": "redshift-cluster-1",
    "CreatedAt": "2022-09-16T12:22:31.894000+05:30",
    "Duration": -1,
    "Error": "ERROR: relation \"test_table\" does not exist",
    "HasResultSet": false,
    "Id": "458c568d-717b-4f36-90bd-e642bfb06cbf",
    "QueryString": "select * from test_table;",
    "RedshiftPid": 1074727629,
    "RedshiftQueryId": -1,
    "ResultRows": -1,<
    "ResultSize": -1,
    "SecretArn": "arn:aws:secretsmanager:us-east-1:123456789012:secret:myuser-secret-hKgPWn",
    "Status": "FAILED",
    "UpdatedAt": "2022-09-16T12:22:32.365000+05:30"
}

上一個回應中的「Error」: 區段會顯示確切的錯誤。在前面的例子中是「ERROR: relation \"test_table\" does not exist」 (ERROR: 關係 \"test_table\" 不存在)。

多個查詢

若要針對叢集執行多個查詢,請使用 BatchExecuteStatement 動作傳回陳述式 ID:

aws redshift-data batch-execute-statement
    --region us-east-1
    --secret-arn arn:aws:secretsmanager:us-east-1:123456789012:secret:myuser-secret-hKgPWn     --cluster-identifier redshift-cluster-1
        --database dev
    --sqls "select * from test_table;" "select * from another_table;"

輸出類似於以下內容:

{
    "ClusterIdentifier": "redshift-cluster-1",
    "CreatedAt": "2022-09-16T12:37:16.707000+05:30",
    "Database": "dev",
    "Id": "08b4b917-9faf-498a-964f-e82a5959d1cb",
    "SecretArn": "arn:aws:secretsmanager:us-east-1:123456789012:secret:myuser-secret-hKgPWn"
}

若要取得查詢的狀態,請使用具有前述回應之陳述式 ID 的 DescribeStatement

aws redshift-data describe-statement --id 08b4b917-9faf-498a-964f-e82a5959d1cb

輸出類似於以下內容:

{
    "ClusterIdentifier ": "redshift-cluster-1 ",
    "CreatedAt ": "2022-09-16T12:37:16.707000+05:30 ",
    "Duration ": 0,
    "Error ": "Query #1 failed with ERROR: relation \ "test_table\"
does not exist ",
    "HasResultSet ": false,
    "Id ": "08b4b917-9faf-498a-964f-e82a5959d1cb ",
    "RedshiftPid ": 1074705048,
    "RedshiftQueryId ": 0,
    "ResultRows ":-1,
    "ResultSize ": -1,
    "SecretArn ": "arn:aws:secretsmanager:us-east-1:123456789012:secret:myuser-secret-hKgPWn ",
    "Status ": "FAILED ",
    "SubStatements ": [
        {
            "CreatedAt ": "2022-09-16T12:37:16.905000+05:30 ",
            "Duration ": -1,
            "Error ": "ERROR: relation \ "test_table\" does not exist ",
            "HasResultSet ": false,
            "Id ": "08b4b917-9faf-498a-964f-e82a5959d1cb:1",
            "QueryString ": "select * from test_table; ",
            "RedshiftQueryId ": -1,
            "ResultRows ": -1,
            "ResultSize ": -1,
            "Status ": "FAILED ",
            "UpdatedAt ": "2022-09-16T12:37:17.263000+05:30 "
        },
        {
            "CreatedAt ": "2022-09-16T12:37:16.905000+05:30",
            "Duration ": -1,
            "Error ": "Connection or an prior query failed. ",
            "HasResultSet ": false,
            "Id ": "08b4b917-9faf-498a-964f-e82a5959d1cb:2 ",
            "QueryString ": "select * from another_table;",
            "RedshiftQueryId ": 0,
            "ResultRows ": -1,
            "ResultSize": -1,
            "Status ": "ABORTED ",
            "UpdatedAt ": "2022-09-16T12:37:17.263000+05:30 "
        }
    ],
    "UpdatedAt ": "2022-09-16T12:37:17.288000+05:30 "
}

上述輸出會顯示多陳述式查詢之所有子陳述式的狀態。前述回應中的「Error」: 區段會顯示每個子陳述式的確切錯誤。

若要疑難排解 Data API 的問題,請參閱疑難排解 Amazon Redshift Data API 的問題

監控 Data API 事件

可以使用 Amazon EventBridge 來監控 Data API 事件。此資訊可傳送至與 Amazon Simple Notification Service (Amazon SNS) 整合的 AWS Lambda 函數,以此傳送通知。如需詳細資訊,請參閱使用 AWS Lambda 和 Amazon Redshift Data API 建置事件導向應用程式


此文章是否有幫助?


您是否需要帳單或技術支援?