PG數據庫錯誤: 檢測到ShareLock死鎖處理
PostgreSQL 是一個免費數據庫,對於處理分析型+交易型混合型系統來說確實很不錯,特別是版本的升級到11.2後性能提升很多,很多運行機制跟oracle越來越接近,確實很強大,但是開源系統確實存在一些不如意地方,需要長時間項目問題集錦積累才能慢慢的領悟。
而作為從非功能測試轉型做技術運維,在運維過程中會從非功能方面(高可用性、高可靠性、可擴展性等)和性能測試優化方面考慮確實可以避免很多生產不必要的故障問題,但是對於開源的技術在版本叠代過程中總會有些不如意的技術故障還是需要我們自己持續性學習、挖掘、積累、提升,才能確保技術能持續滿足業務運營發展和市場需求。
如下問題是我們17年上線的系統,經2年的運行,很多業務表達到千萬級,導致需要讀寫分離、分表等來優化,但是問題還是偶爾出現,說明技術還不到位,例如如下:
問題原因:
目前生產環境使用postgres9.5版本,主從配置,但是因為行業業務的特殊性,有些回訪表等都是三四百萬級別的,而且日常更新頻繁度非常高,日常使用頻繁比較高的表,一天insert、update都是接近十萬,delete三四萬以上,導致在對該表的統計信息不準確,而pg默認 autovacuum默認參數導致部分表因本身存量數據大,更新比例小,導致這些日常被用到的大表反而沒辦法被重新統計分析,最終導致磁盤IO 高,CPU 高問題,而因為在調整過程中調整不當也導致如下,在對表進行批量update 時,而PG就進行 autovacuum_analyze,結果導致出現 ShareLock錯誤,具體錯誤如下:
2019-04-14 15:15:47,707 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - 2-
2019-04-14 15:15:47,707 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - [email protected]
461f4ab1
2019-04-14 15:16:15,952 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - 2-
2019-04-14 15:16:15,952 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - [email protected]
2019-04-14 15:16:18,138 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - 1-61322fb9-7ca7-482b-99ee-913074957a94
2019-04-14 15:16:24,227 ERROR [500.jsp] -
Error updating database. Cause: org.postgresql.util.PSQLException: 錯誤: 檢測到死鎖
詳細:進程6533等待在事務 36964707上的ShareLock; 由進程10733阻塞.
進程10733等待在事務 36964708上的ShareLock; 由進程6533阻塞.
建議:詳細信息請查看服務器日誌.
在位置:當更新關系"visit_crd"的元組(11314, 33)時
The error may involve defaultParameterMap
The error occurred while setting parameters
SQL: UPDATE visit_crd SET visit_plan_id = ?, customer_number = ?, call_id = ?, time_start = ?, time_end = ?,
duration = ?, type = ?, route = ?, cpn = ?, cdpn = ?, recording = ?, trunk_number = ?, update_by = ?, updat
e_date = ?, remarks = ?, affiliation = ?, update_ind = ?, execute_ind = ? WHERE id = ?
Cause: org.postgresql.util.PSQLException: 錯誤: 檢測到死鎖
詳細:進程6533等待在事務 36964707上的ShareLock; 由進程10733阻塞.
進程10733等待在事務 36964708上的ShareLock; 由進程6533阻塞.
建議:詳細信息請查看服務器日誌.
在位置:當更新關系"visit_crd"的元組(11314, 33)時
; SQL []; 錯誤: 檢測到死鎖
詳細:進程6533等待在事務 36964707上的ShareLock; 由進程10733阻塞.
進程10733等待在事務 36964708上的ShareLock; 由進程6533阻塞.
建議:詳細信息請查看服務器日誌.
在位置:當更新關系"visit_crd"的元組(11314, 33)時; nested exception is org.postgresql.util.PSQLException: 錯誤: 檢測到死鎖
詳細:進程6533等待在事務 36964707上的ShareLock; 由進程10733阻塞.
進程10733等待在事務 36964708上的ShareLock; 由進程6533阻塞.
建議:詳細信息請查看服務器日誌.
在位置:當更新關系"visit_crd"的元組(11314, 33)時
org.springframework.dao.DeadlockLoserDataAccessException:
問題分析
PG 默認 autovacuum
1、autovacuum_vacuum_threshold:默認50
2、autovacuum_vacuum_scale_factor默認值為20%。
3、autovacuum_analyze_threshold:默認50。
4、autovacuum_analyze_scale_factor默認10%
第一次優化:
autovacuum_vacuum_scale_factor = 0.001
autovacuum_analyze_scale_factor = 0.001
結果導致如上錯誤信息:
第二次優化:
autovacuum_vacuum_scale_factor = 0.03
autovacuum_analyze_scale_factor = 0.03
問題解決
PG數據庫錯誤: 檢測到ShareLock死鎖處理