生産環境Postgresデータベースのデッドロック問題処理


PostgreSQLは1つの强大なオープンソースデータベースで、処理分析型+取引型混合型システムにとって确かにとても悪くなくて、特にバージョンのアップグレードは11.2后に性能の向上が多くて、多くの运行メカニズムはoracleとますます接近して、确かにとても强大で、しかしオープンソースシステムは确かにいくつかの気に入らない地方が存在して、长い时间のプロジェクトの问题の集锦が积み重ねてやっとゆっくりと悟ることができます.非機能テストから技術メンテナンスへの転換として、メンテナンスの過程で非機能面(高可用性、高信頼性、拡張性など)と性能テストの最適化の面から確かに多くの生産の不要な故障問題を避けることができるが、オープンソースの技術はバージョン反復の過程でいつもいくつかの望ましくない技術故障に対して、やはり私たち自身の持続的な学習、発掘、蓄積、向上が必要である.技術が業務運営の発展と市場の需要を持続的に満たすことを確保することができる.以下の問題は私たちが17年にオンラインになったシステムで、2年の運行を経て、多くの業務が千万級に表現され、読み書き分離、分表などを最適化する必要があるが、問題はたまに現れ、技術がまだ不十分であることを説明し、例えば以下の問題の原因:現在の生産環境でpostgres 9を使用している.5バージョン、主従配置、しかし業界業務の特殊性のため、一部の訪問表などはすべて三四百万級で、しかも日常の更新頻度が非常に高く、日常の使用頻度が比較的高い表は、一日のinsert、updateはすべて10万近くで、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] - org.apache.shiro.web.servlet.ShiroHttpSession@461f4ab12019-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] - org.apache.shiro.web.servlet.ShiroHttpSession@285d498f2019-04-14 15:16:18,138 ERROR [thinkgem.jeesite.common.repeat_form_validator.Token] - 1-61322fb9-7ca7-482b-99ee-913074957a942019-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 = ?, update_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:デフォルト502、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