Docker
元組並發更新錯誤導致的 Postgres 崩潰循環
有時在 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
要解決此問題:
- 查找崩潰循環中的 postgres pod 的名稱。
- 開始
oc debug
與 pod 的會話。- 將關聯的 Postgres 部署擴展到零個 pod。
- 從調試會話的 cmd 行;
- 執行
run-postgresql
。這是CMD
docker 鏡像。作為啟動過程的一部分,腳本會創建一些在 pod 中不存在的文件,即/var/lib/pgsql/openshift-custom-postgresql.conf
and/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