본문 바로가기

PostgreSQL

PostgreSQL 메이저 버전 업그레이드 방법 1. pg_dumpall

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

얼마 전 PostgreSQL 11이 발표되었습니다. 이번 업데이트에서는 파티셔닝과 병렬 코드 실행 향상, 표현식 JIT 컴파일 등 여러 새로운 기능들이 추가되었기에 PostgreSQL의 성능 향상을 바라시는 분들은 상당히 관심을 가질만한 부분입니다.


하지만 PostgreSQL이 다른 DBMS들에 비해 메이저 버전 업그레이드가 상당히 불편합니다. MariaDB만 봐도 단순히 패키지를 업데이트 한 후에 서비스 재시작만 해주면 간단히 업그레이드가 끝납니다. 그런데 PostgreSQL은 기본적으로 pg_upgrade 명령어를 제공하지만 실행만으로 새로운 버전으로 업그레이드 되는 것이 아닙니다. 그래서 이 포스팅에서 PostgreSQL 메이저 버전 업그레이드 방법에 대해 설명하겠습니다.


먼저 PostgreSQL 업그레이드 하는 방법은 총 3가지가 있습니다.


1. pg_dumpall

2. pg_upgrade

3. pg_upgradecluster


이 중 1, 2번은 어떤 환경에서든지 사용가능한 방법이고 3번은 Debian 계열(Ubuntu 등)의 배포판에서만 가능한 것으로 알고있습니다.


1. pg_dumpall

이 업그레이드 방법은 아주 간단하면서 직관적으로 업그레이드를 진행합니다. pg_dumpall는 PostgreSQL에서 기본적으로 제공하는 명령어로, 클러스터에 있는 모든 데이터들을 SQL 구문으로 변환하여 표준출력(stdout)으로 내보냅니다. 업그레이드 방법은 미리 새로운 버전의 PostgreSQL을 설치하기 전에 pg_dumpall로 모든 데이터들을 백업합니다.

$ pg_dumpall -U postgres > dump.sql

이걸 실행하면 현재 작업하던 디렉토리에 dump.sql 이라는 이름의 파일이 만들어집니다.

이제 새로운 PostgreSQL을 설치하고 기존의 클러스터 디렉토리는 복사해 두던가 삭제해도 됩니다.

//제가 주로 사용하는 배포판은 Archlinux인데 이 배포판은 systemd 서비스에 클러스터 디렉토리를 /var/lib/postgres/data로 고정이 되어있습니다. 이 경우에는 삭제하거나 이동을 해 두어야 합니다. Debian 계열은 /var/lib/postgresql/{버전}/main 형태로 관리되는 것 같은데 이 경우엔 손대지 않아도 될 것 같습니다.


설치를 했으면 이제 클러스터를 새로 설치해야 합니다. 저는 Archlinux를 사용중이라 이걸 기준으로 작성할 예정이지만 다른 배포판도 디렉토리만 알맞게 설정해 주시면 문제가 없습니다. PostgreSQL의 클러스터 설치 명령어는 initdb입니다.

$ 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

$ exit

먼저 클러스터를 설치할 디렉토리를 만들고 postgres 계정의 소유로 만들어줘야 합니다. postgres 계정은 보통 패키지로 설치할 때 자동으로 생성됩니다. PostgreSQL이 상당히 권한 문제에 까다로운데, 권한 비트가 하나라도 바뀌어도 에러를 뱉고 실행을 거부할 때도 있습니다.

그 다음은 postgres 계정으로 로그인합니다. 위에서도 말했듯이 PostgreSQL이 보안에 대해 까다로워서 그냥 무턱대고 sudo로 실행한다고 다 해주지 않습니다. initdb를 root 권한으로 실행하면 아래와 같은 에러를 띄웁니다.

initdb: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will
own the server process.

initdb에서 -D 옵션은 설치할 디렉토리이고, -E는 인코딩 설정, --locale은 로케일에 대해 설정하는 겁니다. 저는 추가적으로 터미널 만으로 작업하는 경우 한글이 제대로 나오지 않을 수 있기 때문에 --lc-messages는 en_US.UTF-8로 설정했습니다. 이건 자신의 이전 데이터베이스 설정에 맞게 알아서 잘 설정해 주시면 되겠습니다.


에러가 없다면 문제없이 설치가 완료된 것입니다. 이제 postgresql을 실행합니다.

$ sudo systemctl start postgresql

이것도 사용하시는 시스템에 따라 잘 실행해 주시면 되겠습니다(...)

다음으로는 psql로 접속합니다.

$ psql -U postgres

\l 을 실행해 보시면 아주 깔끔하게 기본 데이터베이스만 들어있는 PostgreSQL을 볼 수 있겠습니다. 이 클러스터에 이전에 덤프 떠 놓은 데이터들을 넣으려면 \i 파일명 을 입력하시면 됩니다.

postgres# \i dump.sql

이제 모든 데이터가 입력이 되었으니 이전처럼 사용하시면 됩니다! // 다만 postgresql.conf는 초기 설정으로 돌아갔으니 replica나 다른 추가 설정을 하신 분은 실사용 전에 해당 설정을 변경하시기 바랍니다.


2, 3방법은 이후에 추가 포스팅하겠습니다.