업그레이드 중 다음 오류가 발생했습니다.
Stopping PostgreSQL 15 database server: mainError: Config owner (postgres:101) and data owner (runit-log:999) do not match, and config owner is not root … failed!
failed!
could not open version file “/shared/postgres_data/PG_VERSION”: Permission denied
Failure, exiting
다음 명령으로 해결되었습니다.
sudo ./launcher enter app
그리고
chown -R postgres:postgres /shared/postgres_data
chown -R postgres:postgres /shared/postgres_run
chmod -R 700 /shared/postgres_data
무한 루프에 빠져 있습니다. 데이터베이스는 정상적으로 업데이트되었지만 ./launcher rebuild app을 실행하면 계속 반복됩니다. 확인할 수 있는 것은 다음 내용뿐입니다.
수정: 이 메시지를 발견했습니다…
mv: inter-device move failed: '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new'; unable to remove target: Directory not empty
Your installation contains extensions that should be updated
with the ALTER EXTENSION command. The file
update_extensions.sql
when executed by psql by the database superuser will update
these extensions.
조언을 부탁드립니다.
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
/usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE
Old 13 database is stored at /shared/postgres_data_old
To complete the upgrade, rebuild again using:
./launcher rebuild app
-------------------------------------------------------------------------------------
자, 여기서 문제가 이것인 것 같습니다:
이것들은 shared/standalone/ 위치에 있으며 이미 수동으로 이동되었습니다…
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old': Device or resource busy
mv: inter-device move failed: '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new'; unable to remove target: Directory not empty
I, [2025-02-08T15:22:42.078189 #1] INFO -- : Generating locales (this might take a while)...
어떤 해결책도 효과가 없네요. 정말 답답합니다.
요청도 없이 단순히 이런 서비스를 제안하는 것은 매우 이례적인 일입니다.
누군가를 고용하고 싶다면 다음 장소를 이용하세요: Marketplace - Discourse Meta
업그레이드 후 멀티사이트 인스턴스가 다운되었습니다. 다음과 같은 메시지가 표시되었습니다:
설치된 확장 기능이 ALTER EXTENSION 명령어로 업데이트되어야 합니다. 데이터베이스 슈퍼유저가 psql로 실행하는 경우, 파일
update_extensions.sql
이 확장 기능을 업데이트합니다.
어디를 찾아봐도 update_extensions.sql 파일을 찾을 수 없습니다. 이 파일은 어디에 위치해야 하나요?
다음 내용을 확인해 보세요
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old': Device or resource busy
mv: inter-device move failed: '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new'; unable to remove target: Directory not empty
I, [2025-02-08T15:22:42.078189 #1] INFO -- : Generating locales (this might take a while)...
저였습니다. 여기서 해결하기 어려운 상황에 처해 보일 때 도움을 제공합니다.
호기심에서 질문드립니다.
Postgres와 같은 핵심 구성 요소의 업그레이드와 관련된 표준이나 전략이 있을까요?
Postgres 13의 지원 기간이 2025년 11월까지이고, 15는 2027년까지, 현재 버전은 17이라는 점을 확인했습니다.
그저 배우고 이해하려는 목적입니다. DB 버전 변경은 일반적으로 큰 일이기도 하고 상당한 노력이 필요합니다.
감사합니다!
저는 postgres 10부터 이 서비스를 함께해 왔습니다. 보통 두 번의 릴리스 주기로 업그레이드하지만, 12에서 13으로 넘어갈 때는 조기 전환이 가치가 있는 몇 가지 개선 사항이 있어서 바로 업그레이드했습니다. 16으로 바로 넘어가지 않은 점은 약간 놀랐습니다.
디스크 공간이 충분하고 최신 버전의 docker를 사용한다면 일반적으로 꽤 순조롭게 진행됩니다.
수정이 될 때까지 13 템플릿으로 되돌렸습니다. 감사합니다.
PostgreSQL 13에서 15로 업그레이드할 때 겪었던 문제를 해결했습니다. 실패한 업그레이드 상태로 서버를 백업에서 복원한 후, PostgreSQL en_GB.UTF-8 로케일 환경에서 다음과 같은 단계가 제게 효과적이었습니다:
sudo -i
su - discourse
cd /var/discourse
git stash
git stash drop
git pull
./launcher stop app
docker run --rm \
--entrypoint=/bin/bash \
-e LANG='en_GB.UTF-8' \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade'
exit
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
chown -R 101:104 /var/discourse/shared/standalone/postgres_data
su - discourse
cd /var/discourse
docker run --rm -v /var/discourse/shared/standalone:/shared \
local_discourse/app chown -R postgres:postgres /shared/postgres_data
./launcher rebuild app
과거에 PostgreSQL LANG 설정을 위해 수행했던 로컬 변경 사항을 git stash; git stash drop 명령을 사용하여 제거해야 했으며, PostgreSQL 데이터 디렉터리 이동은 root 권한으로 수행해야 하고 chown 명령이 필요했습니다.
이번에는 git pull이 필요한가요? 보통은 필요하지 않습니다.
요즘에는 필요하지 않습니다. rebuild가 처리하기 때문입니다.
첫 번째 오류의 마지막 메시지인 Device or resource busy는 다른 프로세스가 해당 postgres_data 디렉토리의 잠금을 잡고 있어 이동할 수 없다는 것을 시사합니다.
해당 디렉토리가 데이터베이스 디렉토리이므로, postgres_data가 마운트 포인트일 가능성이 높습니다. 두 번째 mv 명령에서 inter-device move failed가 표시된다는 점을 고려하면, shared/postgres_data_new와 shared/postgres_data가 서로 다른 디스크/파티션에 위치해 있을 가능성이 더욱 커집니다.
postgres_data가 마운트 포인트임을 확인했다면, 첫 번째 재빌드가 UPGRADE OF POSTGRES COMPLETE 메시지와 함께 완료된 후 두 번째 재빌드를 실행하기 전에, postgres_data 안의 모든 파일을 다른 백업 디렉토리로 수동으로 이동한 다음, postgres_data_new 안의 모든 파일을 (이제 비어 있는) postgres_data 디렉토리로 이동해야 합니다.
postgres_data가 마운트 포인트가 아니라면, lsof를 사용할 수 있습니다. 이를 통해 잠금의 원인이 되는 프로세스를 식별해 볼 수 있습니다.
물론, 먼저 필요한 백업을 수행하세요.
완벽합니다, 감사합니다.
파일은 다음 폴더에 있었습니다:
/var/postgres_data_discourse 안에 postgres_data_new
다음 방법으로 문제를 해결했습니다.
postgres_data_new를 /var로 이동했습니다.
postgres_data_discourse를 postgres_data_discourse_old로 이름 변경했습니다.
postgres_data_new를 postgres_data_discourse로 이름 변경했습니다.
./launcher rebuild app을 실행했습니다.
다시 한번 감사합니다 ![]()
데이터베이스 크기가 62GB입니다. 가장 좋은 업그레이드를 수행하기 위해 무엇을 권장하시나요?
62G /var/discourse/shared/standalone/postgres_data
새로운 VM으로 이전하고, 빈 데이터베이스를 가진 새로운 Discourse를 시작하는 것을 권장합니다. (다운타임 없이 전환하기를 원한다면 ssl 및 letsencrypt 디렉터리를 복사하면 됩니다.) 그런 다음 현재 데이터베이스를 새 서버로 복원하세요. 이렇게 하면 다운타임 없이 업그레이드를 수행할 수 있으며, 문제가 발생할 위험도 전혀 없습니다.
어쨌든 OS를 업그레이드하기에는 아직 이르다고 할 수 없습니다.
사용 중인 Discourse의 기존 버전을 나중에 받을 수 있는 새 Discourse 버전으로 복원할 수 있는지 묻고 있다면, 답은 네입니다.