Docker

元組並發更新錯誤導致的 Postgres 崩潰循環

  • November 20, 2021

有時在 OpenShift 中啟動 Postgres POD 時會顯示以下錯誤程式碼

  pg_ctl: another server might be running; trying to start server anyway
  waiting for server to start....LOG:  redirecting log output to logging 
  collector process
  HINT:  Future log output will appear in directory "pg_log".
  ..... done
  server started
  => sourcing /usr/share/container-scripts/postgresql/start/set_passwords.sh ...
  ERROR:  tuple concurrently updated

要解決此問題:

  1. 查找崩潰循環中的 postgres pod 的名稱。
  2. 開始oc debug與 pod 的會話。
  3. 將關聯的 Postgres 部署擴展到零個 pod。
  4. 從調試會話的 cmd 行;
  • 執行run-postgresql。這是CMDdocker 鏡像。作為啟動過程的一部分,腳本會創建一些在 pod 中不存在的文件,即/var/lib/pgsql/openshift-custom-postgresql.confand /var/lib/pgsql/passwd,這將阻止您執行任何pg_ctl命令。當您執行該命令時,您應該會看到上面列出的相同錯誤輸出。
  • 執行pg_ctl stop -D /var/lib/pgsql/data/userdata乾淨地關閉 Postgres。你應該看到;

waiting for server to shut down.... done server stopped

  • 執行pg_ctl start -D /var/lib/pgsql/data/userdata以啟動 Postgres。您應該看到以下輸出,它應該無限期地等待(沒有錯誤);

server starting sh-4.2$ LOG: redirecting log output to logging collector process HINT: Future log output will appear in directory "pg_log".

  • enter幾次以返回 cmd 提示符。
  • 執行pg_ctl stop -D /var/lib/pgsql/data/userdata,並等待 postgres 停止。這將確保徹底關閉。

waiting for server to shut down.... done server stopped

  • 退出調試會話。
  • 將部署擴展到 1 個 pod。Postgres 現在應該可以正常啟動了。

長期鬥爭後找到的解決方案:https ://pathfinder-faq-ocio-pathfinder-prod.pathfinder.gov.bc.ca/DB/PostgresqlCrashLoopTupleError.html 致謝作者:Wade Barnes

引用自:https://serverfault.com/questions/942743