2012-10-17 2 views
3

아마존 EC2에서 우분투 12.04 64 비트를 사용하고 있습니다. postgresql을 9.1에서 9.2로 업그레이드하려고합니다.postgresql 클러스터를 9.1에서 9.2로 업그레이드하는 중 오류가 발생했습니다.

$ uname -a 
Linux db2 3.2.0-32-virtual #51-Ubuntu SMP Wed Sep 26 21:53:42 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux 

$ apt-cache policy postgresql 
postgresql: 
    Installed: 9.1+136~precise 
    Candidate: 9.1+136~precise 
    Version table: 
*** 9.1+136~precise 0 
    500 http://ppa.launchpad.net/pitti/postgresql/ubuntu/ precise/main amd64     Packages 
    100 /var/lib/dpkg/status 
9.1+129ubuntu1 0 
    500 http://us-east-1.ec2.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages 
9.1+129 0 
    500 http://us-east-1.ec2.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages 

내가 소식을 업그레이드 프로세스는 다음과 같습니다

$ sudo add-apt-repository ppa:pitti/postgresql 
$ sudo apt-get update 
$ sudo apt-get install postgres-9.2 
$ sudo pg_dropcluster --stop 9.2 main 
$ sudo pg_upgradecluster 9.1 main /var/lib/postgresql/9.2 
Stopping old cluster... 
Disabling connections to the old cluster during upgrade... 
Restarting old cluster with restricted connections... 
Creating new cluster (configuration: /etc/postgresql/9.2/main, data: /var/lib/postgresql/9.2)... 
Moving configuration file /var/lib/postgresql/9.2/postgresql.conf to /etc/postgresql/9.2/main... 
Moving configuration file /var/lib/postgresql/9.2/pg_hba.conf to /etc/postgresql/9.2/main... 
Moving configuration file /var/lib/postgresql/9.2/pg_ident.conf to /etc/postgresql/9.2/main... 
Configuring postgresql.conf to use port 5433... 
Disabling connections to the new cluster during upgrade... 
Roles, databases, schemas, ACLs... 
Fixing hardcoded library paths for stored procedures... 
ERROR: cannot set transaction read-write mode during recovery 
Error: Could not fix library paths 
Re-enabling connections to the old cluster... 
Re-enabling connections to the new cluster... 
Error during cluster dumping, removing new cluster 

어떤 도움을 주시면 감사하겠습니다. 감사합니다.

+0

이상한 점은'pg_upgrade' 문제처럼 보입니다. 여기에 아무런 응답이 없다면 [pgsql-general mailing list] (http://archives.postgresql.org/pgsql-general/)에 묻는 것이 좋습니다. 'ps'에서 실제로'pg_upgrade' 명령 행을 찾을 수있는 기회는 무엇입니까? –

+0

@CraigRinger : pg_upgradecluster는 Perl 스크립트입니다. https://gist.github.com/3909063 나는 그걸 밟을지도 모른다. 메일 링리스트 제안에 감사드립니다. – onk

+0

그게'pg_wrapper'의 일부인'pg_upgradecluster'처럼 보입니다. 실제 작업을하는 커맨드는'pg_upgrade'라고합니다. 이것은 PostgreSQL과 함께 배포되는 C 프로그램입니다. 'pg_upgradecluster'는'pg_upgrade'를 호출해야하지만, 그 시점에 도달하기 전에 실패했을 수 있습니다. –

답변

4

문제의 근본 원인은 hot_standbyon이고 서버가 읽기 전용이므로 postgresql.conf입니다.

    는 이전 서버
  • sudo -i -u postgres
  • 를 시작
  • : 당신은 일반적으로 데비안과 우분투 패키지로 pg_wrapper 도구에서 pg_upgradecluster에 문제가있는 경우 수동 클러스터가 대신 업그레이드 할 수 일반적으로

    , for db in $(psql --tuples-only template1 -c "select datname from pg_database where datname not in ('template0','template1','postgres','template_postgis');"); do pg_dump -Fc -f $db.backup $db; done

  • pg_dumpall --globals-only > globals.sql
  • 이전 서버를 중지
  • initdb 새 서버를 제거한 경우 새 클러스터가됩니다. pg_wrapper으로 나는 pg_createcluster을 사용한다고 생각합니다.
  • 새 서버를 시작하십시오. 여전히 postgres 사용자로 :
  • psql -f globals.sql
  • for backup in *.backup; do pg_restore --dbname postgres --create $backup; done

또는, 자리에서 당신의 DB를 변환하는 pg_upgrade 도구 도구를 사용하지만 pg_wrapper을 혼동 수 있습니다.

이 단계는 pg_dumpall 명령을 사용하여 전체 클러스터 덤프를 단순화 할 수 있지만 많이 좋아하지는 않습니다. 나는 pg_dumpall 덤프를 복원하는 것이 오류 처리 측면에서 많이 필요하다고 생각하며, 덤프에서 개별 DB 또는 테이블을 추출하기가 어려우며 모든 트랜잭션을 단일 트랜잭션으로 복원 할 수는 없습니다. users/groups/roles와 같은 전역에만 pg_dumpall을 사용하고 위에 표시된 것처럼 개별 데이터베이스에 대해 pg_dump 데이터베이스 별 사용자 지정 형식 백업을 사용하는 것이 좋습니다.

+0

또는 hot_standby에서 서버를 제거하십시오. 네가 의심하는 것처럼. (지금 방에서 뒤로 몰래 움직인다. ..) – onk