為什麼我的 Amazon Redshift 查詢狀態在未進行任何變更的情況下,從「已完成」變更為「已中止」?

1 分的閱讀內容
0

Amazon Redshift 主控台顯示查詢狀態為「已完成」,但狀態隨後變更為「已中止」。但是,當我查詢先前的工作階段或交易的結果時,並未對資料表進行任何更新。

簡短描述

在確認交易之前,操作資料或建立資料庫物件的 SQL 陳述式不會持續保存。這不適用於以隱含方式執行 COMMITTRUNCATE 陳述式。

如果 SQL 陳述式仍在某未結交易中,則 Amazon Redshift 主控台會顯示該 SQL 陳述式的查詢狀態為「已完成」。如果交易已復原,狀態將變更為「已中止」。當「已中止」資料欄值為 0 時,STL_QUERY 系統資料表還會顯示 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;

查詢的輸出會針對已復原交易顯示「復原 1 個交易」陳述式。

如果交易的開頭為 BEGIN 陳述式,則該陳述式由使用者或應用程式明確地開啟。該陳述式還必須獲明確確認。起始不是 BEGIN 陳述式的交易通常是由 SQL 用戶端或驅動程式的 AUTO COMMIT 選項自動確認。如果該選項遭停用,使用者必須明確地傳送 COMMIT。

交易經適當確認後,交易的變更是可延續的 (持續保存),並且可以讓在 COMMIT 陳述式之後起始的其他 XID 看到。如需詳細資訊,請參閱可序列化隔離

當 SVL_STATEMENTTEXT 系統資料表上沒看到 END、COMMIT 或「復原 1 個交易」訊息時,表示 XID 可能仍處於未結狀態。使用 SVV_TRANSACTIONS 視圖來識別未結交易和 LOCK 爭用

系統資料表 STL_COMMIT_STATS 和 STL_UNDONE 還可以用於確定交易的結尾是 COMMIT 還是 ROLLBACK。

執行以下查詢,找出變更是否已獲確認:

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];

執行以下查詢,找出變更是否已復原:

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

由於明確的 ROLLBACK 命令或在完成之前不執行,交易變更不會持續保留。存在可序列化隔離違規時,不會發生明確的 ROLLBACKS。當系統管理員 TERMINATES 工作階段或 CANCELS 查詢時,也不會發生這些狀況。網路連線中的逾時也會阻止交易變更持續保留。

如果發生復原,用戶端隨後會收到包含更多詳細資料的錯誤訊息。最佳實務是將用戶端設定為記錄錯誤。如需詳細資訊,請參閱設定記錄 (JDBC) 或 LogLevel (ODBC)。

相關資訊

STL_DDLTEXT

AWS 官方
AWS 官方已更新 1 年前