為什麼我在 Amazon Redshift 中的查詢被取消?

2 分的閱讀內容
0

我在 Amazon Redshift 中的查詢被取消,並顯示錯誤消息。

簡短說明

查詢可能因下列原因=在 Amazon Redshift 上取消:

  • 設定 Amazon Redshift 工作負載管理 (WLM) 查詢監控規則
  • 陳述式逾時值
  • 中止、取消或終止請求
  • 網路問題
  • 叢集維護升級
  • 內部處理錯誤
  • ASSERT 錯誤

若要避免查詢被停止,請完成以下步驟:

解決方法

設定 Amazon Redshift WLM 查詢監控規則

建立 WLM 查詢監視規則 (QMR),以定義佇列的指標式效能界限。或者,指定查詢超過 WLM 時間限制時,Amazon Redshift 應採取的動作。例如,建立一個規則,取消執行超過 60 秒臨界值的查詢。

範例 1: 查詢監視規則中指定的中止動作

如果由於查詢監視規則中指定的中止動作而取消查詢,則查詢會傳回下列錯誤:

"ERROR: Query (500029) cancelled by WLM abort action of Query Monitoring Rule "testrule"."

若要識別是否因為「中止」動作而取消查詢,請執行下列查詢:

select * from STL_WLM_RULE_ACTION where action = 'abort';

查詢輸出會列出由「中止」動作取消的所有查詢。如果您的查詢識別碼列在輸出中,請增加 WLM QMR 參數中的時間限制。

範例 2: 沒有快速移動查詢可用的佇列

如果在查詢監視規則中指定了「快速移動」動作,則可以快速移動查詢。快速移動查詢時,WLM 會嘗試根據 WLM 佇列指派規則,將查詢路由至下一個相符佇列。如果查詢不符合佇列定義,則會取消查詢。取消的查詢不會重新指派至預設佇列。如需詳細資訊,請參閱 wlm_json_ 組態參數特性

**注意:**您只能在手動 WLM 設定中快速移動查詢。

如果查詢已快速移動,但沒有相符的佇列可用,則取消的查詢會傳回下列錯誤訊息:

"ERROR: Query (500104) canceled on user's request and ran out of wlm queues for restart."

如果您的查詢因此錯誤訊息而取消,請執行下列查詢以檢查使用者定義的佇列:

select * from stl_wlm_query where query=<query-id>;

在輸出中,service_class 條目 6-13 包含使用者定義的佇列。例如,**service_class ** 6 可能會在 WLM 組態中列出 Queue1,而 service_class 7 可能會列出 Queue2。

如需 ** service_class** 佇列映射的詳細資訊,請執行下列查詢:

select * from stv_wlm_service_class_config where service_class>5;

取得佇列映射資訊後,請從 Amazon Redshift 主控台檢查 WLM 組態。確認佇列符合 WLM 組態。只有使用者群組或查詢群組組態有相符佇列可用時,您才能快速移動查詢。如需詳細資訊,請參閱 WLM 查詢快速移動的佇列

陳述式逾時值

statement_timeout 值是在 Amazon Redshift 終止查詢之前執行查詢的時間上限。超過陳述式逾時時,就會取消工作階段期間提交的查詢,並顯示下列錯誤訊息:

「錯誤: 使用者請求的查詢 (150) 取消」

若要確認查詢是否因為陳述式逾時而取消,請執行下列查詢:

select * from SVL_STATEMENTTEXT where text ilike '%set%statement_timeout%to%' and pid in (select pid from STL_QUERY where query = <queryid>);

陳述式逾時也可以在叢集參數群組中設定。請檢查叢集參數群組和任何 statement_timeout 組態設定,以進一步確認。如需詳細資訊,請參閱修改參數群組

中止、取消或終止請求

若要檢查使用者 (例如超級使用者) 是否已停止或取消特定查詢,請使用您的查詢 ID 執行下列查詢:

select * from SVL_STATEMENTTEXT where text ilike '%cancel%' and xid
    in (select xid from STL_QUERY where query = <queryid>);
select * from SVL_STATEMENTTEXT where text ilike '%abort%' and xid in (select xid from STL_QUERY where query = <queryid>);

如果查詢出現在輸出中,則查詢會在使用者請求時停止或取消。

**注意:**使用者只能終止自己的工作階段。超級使用者可以終止所有工作階段。

使用者取消或終止對應的程序 (執行查詢的位置) 時,也可以停止查詢。以下是可以取消或終止查詢的程序範例:

某程序被這些命令取消或終止時,便會有一個條目記錄在 SVL_TERMINATE 中。若要確認查詢是否因為工作階段終止而停止,請查看 SVL_TERMINATE 日誌。執行下列查詢以查看 SVL_TERMINATE 日誌:

select * from SVL_TERMINATE where pid=(select pid from STL_QUERY where query=500534);

網路問題

有時候會因為基礎網路問題而取消查詢。若要確認網路問題是否會導致您的查詢取消,請執行下列查詢以檢查 STL_CONNECTION_LOG 條目:

select * from STL_CONNECTION_LOG where pid in (select pid from STL_QUERY where query = <query_id>);

STL_CONNECTION_LOG 記錄驗證嘗試和網絡連接或斷開連接。如果您的查詢出現在輸出中,則網路連線問題可能會導致您的查詢取消。

叢集維護升級

在執行查詢時如果發生排定的維護,則查詢會終止並返回,需要重新啟動叢集。排定長時間執行的作業 (例如大型資料載入或 VACUUM 作業),避免出現維護時段。如需詳細資訊,請參閱維護時段排程

若要檢查您的 Amazon Redshift 叢集上是否已執行維護作業,請選擇 Amazon Redshift 主控台中的事件索引標籤。

內部處理錯誤

STL_ERROR 資料表會記錄 Amazon Redshift 產生的內部處理錯誤。STL_ERROR 資料表不會記錄 SQL 錯誤或訊息。

若要確認您的查詢是否因內部錯誤而取消,請執行下列查詢以檢查 STL_ERROR 條目:

select * from STL_ERROR where userid=<user id>;

ASSERT 錯誤

有時候查詢會因為 ASSERT 錯誤而停止。當查詢本身出現問題時,可能會發生 ASSERT 錯誤。如果您在修補程式升級後收到 ASSERT 錯誤,請將 Amazon Redshift 更新為最新的叢集版本。然後,檢查叢集版本歷史記錄。或者,您可以返回叢集版本

AWS 官方
AWS 官方已更新 10 個月前