用戶使用資料庫客戶端工具如navicat、dbeaver等執行超大結果集的查詢語句導致異常中斷,中斷信息Last read message sequence %d is not equal to the max written message sequence %d。 ...
本文分享自華為雲社區《GaussDB(DWS)現網案例之超大結果集接收異常》,作者:你是猴子請來的救兵嗎 。
問題背景
內核版本 GaussDB 8.1.3
問題描述 用戶使用資料庫客戶端工具如navicat、dbeaver等執行查詢語句異常中斷,中斷信息"Last read message sequence %d is not equal to the max written message sequence %d"
問題定位
客戶端異常中斷後有些錯誤信息時不感知的,此時topsql就派上了用場。歷史topsql記錄了查詢作業運行結束時的資源使用情況(包括記憶體、下盤、CPU時間等)和運行狀態信息(包括報錯、終止、異常等)以及性能告警信息。而對於由於FATAL、PANIC錯誤導致查詢異常結束時,狀態信息列只顯示aborted,無法記錄詳細異常信息。
1,此時我們通過歷史topsql查詢視圖查詢語句執行情況
--當前CN select * from GS_WLM_SESSION_HISTORY; --所有CN select * from PGXC_WLM_SESSION_HISTORY;
根據topsql記錄結果發現語句存在abort_info為
Last read message sequence %d is not equal to the max written message sequence %d
可知,查詢執行遇到FATAL、PANIC錯誤導致查詢異常結束
2,接著確認日誌信息,通過線程ID查看當時語句執行情況,發現客戶端存在異常中斷
根因分析
前提:
cn_retry開啟+查詢語句+max_cn_temp_file_size臨時文件開啟
發送邏輯:
服務端執行查詢之後,會通過發送緩衝區往客戶端發送數據;當查詢結果集過大,則發送緩衝區滿了之後,會往臨時文件寫數據;當臨時文件超出max_cn_temp_file_size指定的最大值時(此時會禁用cn_retry),需要分批發送,此時會先將已寫入臨時文件的數據發送至客戶端;然後繼續將剩餘數據寫入新的臨時文件發送,以此迴圈,直到所有數據發送完成。
問題場景:
當臨時文件超出最大值時,先將其發送至客戶端,此時客戶端斷連(如產生oom),數據發送中斷,此時已發送數據量與已寫入臨時文件的數據量不一致,因此產生報錯
Last read message sequence %d is not equal to the max written message sequence %d
此報錯代表已寫入臨時文件的數據與已發送到客戶端的數據量不一致,實際場景為客戶端異常導致的發送數據中斷,因此報錯內容符合預期。
相關知識
相關guc參數:
1,cn_send_buffer_size:指定CN端數據發送數據緩存區的大小。整型,8~128, 單位為KB。預設8KB
2,max_cn_temp_file_size:指定SQL語句出錯自動重試功能中CN端使用臨時文件的最大值,設定為0表示不使用臨時文件。預設5G
相關日誌記錄:
1,臨時文件超出max_cn_temp_file_size,記錄" %s temp file exceeded, max temp file size : %d KB, current result size : %ld KB"
2,客戶端異常導致數據發送失敗,記錄"could not send data to client [ Remote IP: %s PORT: %s]. detail:%s"
3,數據發送中斷或結束,當已發送數據和已寫入臨時文件的數據量不一致時,記錄"Last read message sequence %d is not equal to the max written message sequence %d"
場景復現
創建普通表即可,導入一定量的數據,執行簡單查詢使其返回較大的結果集,如
select * from store_sales;
為了方便場景復現,臨時將允許的臨時文件最大值調整為500M,便於觸發分批發送。
1,正常接收場景
此時客戶端環境記憶體足夠,可正常接收數據,超大結果集將通過臨時文件下盤的方法分批發送,直到所有數據發送完成。
2,異常中斷場景
此時客戶端環境允許的數據量優先,超大結果集將分批發送的過程中,客戶端觸發OOM異常中斷,服務端會記錄客戶端異常發送失敗信息以及已發送數據不一致的錯誤信息。
改善辦法
1,避免超大結果集的查詢,如果無法避免,則通過分頁或游標多次查詢
2,增大客戶端支持的運行記憶體,防止記憶體不足
知識小結
1,報錯Last read message sequence %d is not equal to the max written message sequence %d為超大結果集返回異常中斷時的報錯,符合預期,需通過業務語句的改寫或客戶端環境的改善來解決。
2,TopSQL查詢監控的原理和適用方法可參考:GaussDB for DWS 資源監控核心技術解密: TopSQL查詢監控解密