본문 바로가기

PostgreSQL

PostgreSQL 메이저 버전 업그레이드 방법 2. pg_upgrade

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

이전 pg_dumpall을 통한 PostgreSQL 업그레이드에 이어 두 번째로 pg_upgrade를 통한 업그레이드를 설명하겠습니다.


목차

2. pg_upgrade

3. pg_upgradecluster


2. pg_upgrade

pg_upgrade는 PostgreSQL에서 제공해주는 업그레이드 명령어 입니다. 다만 설치 후 단순히 이 명령어를 실행시키는 것으로 업그레이드가 짜잔 하고 끝나는 것이 아닙니다. 이 명령어를 실행하기 위해서는 이전 버전의 PostgreSQL과 최신 버전의 PostgreSQL 둘 다 설치가 되어 있어야 합니다.


먼저 PostgreSQL 최신 버전을 설치합니다. 설치방법은 그냥 자신의 배포판에 맞게 수단과 방법을 가리지 않고 설치하시면 됩니다. 저는 Archlinux를 사용하므로 pacman 을 사용해 설치하겠습니다.

$ pacman -Syu
$ pacman -S postgresql postgresql-old-upgrade

Archlinux는 pg_upgrade를 사용한 업그레이드를 위해 postgresql-old-upgrade라는 패키지 명으로 이전버전의 PostgreSQL을 제공하고 있습니다. 이 패키지를 설치하면 /opt/pg-sql-{버전} 에 이전 버전의 PostgreSQL이 설치됩니다.

$ ls /opt/pgsql-10 -l
total 16
drwxr-xr-x 2 root root 4096 Nov 17 01:42 bin
drwxr-xr-x 6 root root 4096 Nov 17 01:42 include
drwxr-xr-x 4 root root 4096 Nov 17 01:42 lib
drwxr-xr-x 6 root root 4096 Nov 17 01:42 share

pg_upgrade를 실행하기 전에 pg_dumpall를 사용했던 것과 같이 새로운 클러스터를 생성해 줘야합니다. 이미 이전 포스트에서 설명을 했으므로 명령어만 적고 넘어가겠습니다. 다만 이전 포스트와 다른 점은 이전 클러스터 디렉토리를 다른 곳으로 이동시켜 둔 것과 initdb를 한 후 postgres 계정을 로그아웃하지 않았다는 겁니다.

$ sudo mv -r /var/lib/postgres/data /var/lib/postgres/old-data
$ sudo mkdir /var/lib/postgres/data
$ sudo chown postgres:postgres /var/lib/postgres/data
$ sudo su postgres -
$ chmod 700 /var/lib/postgres/data
$ cd /var/lib/postgres/data
$ initdb -D /var/lib/postgres/data -E UTF-8 --locale=ko_KR.UTF-8 --lc-messages=en_US.UTF-8

드디어 pg_upgrade를 실행할 차례입니다. pg_upgrade는 총 4개의 인자가 필요합니다.

-b 이전 버전의 bin(실행파일) 디렉토리

-B 새 버전의 bin(실행파일) 디렉토리

-d 이전 버전의 클러스터 디렉토리

-D 새로 만든 클러스터 디렉토리


제 Archlinux 기준으로는 이전버전의 bin 디렉토리는 /opt/pgsql-10/bin, 새 버전의 bin 디렉토리는 /usr/bin, 이전 버전의 클러스터 디렉토리는 /var/lib/postgres/old-data, 새로 만든 클러스터 디렉토리는 /usr/lib/postgres/data 입니다. 그러므로 명령어는 아래와 같습니다.

$ pg_upgrade -b /opt/pgsql-10/bin -B /usr/bin -d /var/lib/postgres/old-data -D /var/lib/postgres/data
$ exit

에러가없다면 완벽히 업그레이드가 끝났다는 것이므로 PostgreSQL을 시작사켜 봅시다.

$ sudo systemctl start postgresql


이걸로 pg_upgrade를 사용한 업그레이드는 끝났습니다. 뭔가 pg_dumpall과 그리 다르지 않은 느낌입니다. 솔직히 말하자면 pg_dumpall로 덤프뜨는 시간을 아낄 수 있다 뿐인 것 같은데 이건 정말 거대한 데이터베이스를 운영하지 않는 이상 속도 차이를 체감하기 어려울 것 같습니다. pg_upgrade의 설명을 보면 이전 데이터를 재활용한다고 하는데 저는 아직 그렇게 큰 데이터베이스는 가지고 있지 않아서 확인할 수는 없었습니다.