Postgres 16 데이터베이스(및 PG>13 전체)에서 백업 실패

Postgres 16 데이터베이스에 대한 백업이 더 이상 작동하지 않습니다. 이는 이 커밋에서 postgresql-client 대신 postgresql-client-${PG_MAJOR}를 설치하기 때문인 것 같습니다.

이것이 어떤 문제를 해결하기 위한 것인가요? OS에서 제공하는 psql 클라이언트가 모든 버전의 Postgres와 함께 잘 작동하지 않았나요?

Digital Ocean 데이터베이스에서 이 클라이언트가 PG16을 사용하고 있다는 사실에 놀랐습니다. 하지만 일부 CDCK 호스팅이 이제 PG15를 사용한다는 점은 알고 있었습니다.

다음과 같은 방법보다 백업을 정상적으로 수행하는 더 나은 방법이 있을까요:

run:
  - exec:
      cd: /var/www/discourse
      cmd: 
        - apt-get update && apt-get remove -y postgresql-client-13 && apt-get install -y postgresql-client-16

아마도 PG_MAJOR를 환경 변수로 설정할 수 있을까요?

네, 그런 것 같습니다.

PR에서:

pg_dump 버전 17.2를 사용하여 Discourse 백업이 생성되었을 때 이 버그를 발견했습니다. 17.2보다 낮은 버전의 postgres 클러스터에는 이를 복원할 수 없습니다.

여러분은 상당히 난감한 상황에 처해 있는 것 같습니다 (PostgreSQL: Documentation: 18: pg_dump)

pg_dump는 PostgreSQL의 더 새로운 버전으로 데이터를 전송하는 데 사용되므로, pg_dump의 출력은 pg_dump 버전보다 새로운 PostgreSQL 서버 버전에 로드될 수 있을 것으로 예상됩니다. pg_dump는 자체 버전보다 오래된 PostgreSQL 서버에서 덤프를 생성할 수도 있습니다. (현재, 버전 9.2까지의 서버가 지원됩니다.) 그러나 pg_dump는 자체 주요 버전보다 새로운 PostgreSQL 서버에서 덤프를 생성할 수 없습니다. 잘못된 덤프를 생성할 위험을 감수하기보다는 시도조차 거부합니다. 또한, 덤프가 해당 버전의 서버에서 생성된 경우에도 pg_dump의 출력이 더 오래된 주요 버전의 서버에 로드될 수 있다는 보장은 없습니다. 덤프 파일을 더 오래된 서버에 로드하려면, 더 오래된 서버가 이해하지 못하는 구문을 제거하기 위해 덤프 파일을 수동으로 편집해야 할 수 있습니다.

아, 실수였네요. PR을 읽었다고 생각했는데 말입니다. 저는 영어 모국화자이고 박사 학위도 있는데, 좀 더 잘할 수 있다고 생각했을 텐데요. :person_shrugging:

아니요. 이 코드가 베이스 이미지를 빌드하는 부분이라 그렇게 할 수 없습니다.

그래서 제 수정안은 현재로서는 최선인 것 같습니다. 다만, 제가 더 영리했다면 apt-get update로 가져오는 apt 관련 항목들을 제거했을 텐데 말입니다.

PG13을 원하지만 더 최신 버전은 원하지 않는다는 것을 여러 사람과 시스템에게 설득하는 것이 종종 어렵기 때문에, 다른 분들도 이 문제를 겪을 것이라 생각합니다. 또한, Discourse가 PG15로 작동한다는 것을 아는 누군가가 꽤 오래전에 그렇게 말한 것 같기도 합니다.

고맙습니다, Richard!

백업이 조용히 실패하는 건가요??

(보통 설치 환경에서는 버전 13을 사용 중이므로, 이 상황은 다소 특수한 경우일 것 같지만, 아주 드문 일은 아닐 수도 있겠습니다.)

그렇지 않습니다. 그래서 꽤 명확하게 나타나며, postgres를 직접 관리할 수 있을 만큼 충분한 지식을 가진 사람들에게만 발생하는 문제입니다.

여러분 안녕하세요, 오늘 이 문제를 겪었습니다. 증상이 대략 6일 동안 백업 실패에 대한 알림을 계속 받았다는 것이었고, 주요 로그 줄은 다음과 같았습니다:

[2025-06-14 03:30:20] pg_dump: error: aborting because of server version mismatch
[2025-06-14 03:30:20] pg_dump: detail: server version: 16.9; pg_dump version: 15.12 (Debian 15.12-1.pgdg120+1)

저는 Digital Ocean 드롭렛에서 실행되는 Ubuntu 환경에서 권장 설치 가이드를 사용하여 Discourse를 운영합니다. 다만 postgres 컨테이너 대신 Digital Ocean의 관리형 Postgres 데이터베이스를 사용하고 있습니다. 제 데이터베이스를 확인해 보니 pg 16이 실행 중입니다. 최근에 업그레이드된 것 같지는 않고(어쨌든 주요 버전 업그레이드가 자동으로 이루어질 것 같지도 않지만), 확인을 위해 지원팀에 이메일을 보냈습니다.

어쨌든, 제 조사 결과 이 페이지로 이어졌습니다. @pfaffman 님이 게시한 YAML을 어디에 배치해야 할지 확신이 서지 않아서 명령어를 수동으로 실행했고, 이 문제를 마주치는 다른 분들을 위해 공유하고자 합니다:

  • cd /var/discourse
  • launcher enter app
  • apt list --installed | grep postgres # 현재 설치된 버전이 15임을 확인하기 위함
  • apt-get update
  • apt-get remove postgresql-client-15
  • apt-get install postgresql-client-16

그 후 관리자 백업 페이지에서 수동 백업을 트리거했습니다.

이것이 문제를 일시적으로 해결한 것 같지만, @pfaffman 님이 지적했듯이 다음에 Discourse를 업그레이드할 때 다시 postgresql-client-15로 되돌아갈 것이며, 백업이 다시 작동하지 않아 위의 수동 개입이 필요할 것으로 예상됩니다.

Discourse를 업그레이드할 때마다 이 단계를 반복해야 하는 것을 제외하고 이 문제에 대한 해결책이 있을까요?

여기 어딘가에 app.yml에 해당 명령어를 입력할 수 있도록 필요한 정보를 제공하고 있을 것 같습니다.

예제로 postgres 템플릿을 참고해 보시는 것도 좋습니다.

감사합니다. 하지만 잘 이해가 되지 않습니다. 위에서 언급하신 YAML은 제가 이전에 올린 여러 명령어를 하나로 줄이는 방법일 뿐, discourse를 업그레이드할 때마다 여전히 수동으로 실행해야 한다는 인식이 있습니다. 제가 오해한 건가요?