Logo PostgreSQL

Pada tulisan ini adalah cara upgrade PostgrSQL pada server Ubuntu. Saya melakukan upgrade dari PostgreSQL 12 ke PostgreSQL 14 pada server Ubuntu. Meski begitu, untuk upgrade dengan versi lain cukup diganti dengan angka versi PostgreSQL yang diinginkan karena langkah-langkahnya sama.

1. Install Versi Terbaru PostgreSQL

Jika PostgreSQL sudah terpasang pada server Ubuntu, biasanya saat dilakukan upgrade server Ubuntu PostgreSQL yang terbaru otomatis ter-install.

Cara lain untuk upgrade versi terbaru PostgreSQL dapat dilakukan dengan menjalankan dibawah ini.

# Install versi terbaru PostgreSQL
# Jika ingin versi tertentu, misal versi 14, ganti 'postgresql dengan 'postgresql-14'
sudo apt-get -y install postgresql

Untuk lebih detil dapat dilihat melalui https://www.postgresql.org/download/linux/ubuntu/.

Jika instalasi berhasil, maka akan terdapat dua buah PostgreSQL seperti berikut. Terlihat ada PostgreSQL 12 dan PostgreSQL 14.

example_user@example:~$ dpkg --get-selections | grep postgres
postgresql                install
postgresql-12             install
postgresql-14             install
postgresql-client-12      install
postgresql-client-14      install
postgresql-client-common  install
postgresql-common         install
postgresql-contrib        install

Cara kedua dapat menggunakan perintah ps untuk mengecek versi PostgreSQL yang telah berhasil di-install dan sedang aktif seperti berikut.

$ ps aux | grep postgre
example_user     673  0.0  1.5 221228 30528 ?        Ss   08:55   0:00 /usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main_14 -c config_file=/etc/postgresql/14/main_14/postgresql.conf
example_user     675  0.0  1.4 251088 29676 ?        Ss   08:55   0:00 /usr/lib/postgresql/12/bin/postgres -D /var/lib/postgresql/12/main -c config_file=/etc/postgresql/12/main/postgresql.conf
example_user     679  0.0  0.3 221228  7064 ?        Ss   08:55   0:00 example_user: 14/main_14: checkpointer
example_user     680  0.0  0.3 221228  7132 ?        Ss   08:55   0:00 example_user: 14/main_14: background writer
example_user     681  0.0  0.5 221228 11776 ?        Ss   08:55   0:00 example_user: 14/main_14: walwriter
example_user     682  0.0  0.4 221796  9832 ?        Ss   08:55   0:00 example_user: 14/main_14: autovacuum launcher
example_user     683  0.0  0.3  75820  6688 ?        Ss   08:55   0:00 example_user: 14/main_14: stats collector
example_user     684  0.0  0.3 221656  7916 ?        Ss   08:55   0:00 example_user: 14/main_14: logical replication launcher
example_user     692  0.0  0.3 251088  6500 ?        Ss   08:55   0:00 example_user: 12/main: checkpointer
example_user     693  0.0  0.3 251088  6544 ?        Ss   08:55   0:00 example_user: 12/main: background writer
example_user     694  0.0  0.5 251088 10732 ?        Ss   08:55   0:00 example_user: 12/main: walwriter
example_user     695  0.0  0.4 251632  8984 ?        Ss   08:55   0:00 example_user: 12/main: autovacuum launcher
example_user     696  0.0  0.2 105584  5448 ?        Ss   08:55   0:00 example_user: 12/main: stats collector
example_user     697  0.0  0.3 251628  7116 ?        Ss   08:55   0:00 example_user: 12/main: logical replication launcher

2. Cek Cluster PostgreSQL

Jika poin 1 berhasil dilakukan, saat menjalankan pg_lsclusters untuk melihat daftar cluster, maka akan ada dua jenis cluster PostgreSQL, yaitu cluster PostgreSQL versi 10 dan 12. Terlihat versi 12 dan 14 sama-sama memiliki cluster bernama main.

$ pg_lsclusters
Ver Cluster Port Status Owner        Data directory                 Log file
12  main    5432 online example_user /var/lib/postgresql/12/main    /var/log/postgresql/postgresql-12-main.log
14  main    5433 online example_user /var/lib/postgresql/14/main    /var/log/postgresql/postgresql-14-main.log

3. Matikan Service PostgreSQL

Agar dapat upgrade PostgreSQL 12 ke PostgreSQL 14 perlu dimatikan service PostgreSQL yang sedang berjalan.

sudo service postgresql stop

Menjalankan pg_lsclusters akan terlihat seluruh cluster statusnya adalah down.

$ pg_lsclusters
Ver Cluster Port Status Owner        Data directory                 Log file
12  main    5432 down   example_user /var/lib/postgresql/12/main    /var/log/postgresql/postgresql-12-main.log
14  main    5433 down   example_user /var/lib/postgresql/14/main    /var/log/postgresql/postgresql-14-main.log

3. Ganti Nama Cluster PostgreSQL Versi Terbaru

Upgrade PostgreSQL 12 ke PostgreSQL 14 akan menggunakan nama cluster main, sehingga cluster main pada PostgreSQL versi 14 perlu ganti nama / rename dahulu agar tidak konflik. Misal main diganti menjadi main_14.

sudo pg_renamecluster 14 main main_14

Jika berhasil, saat dijalankan pg_lsclusters akan terdapat nama main_14, berbeda dengan hasil poin 2 diatas.

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory                 Log file
12  main    5432 down   postgres /var/lib/postgresql/12/main    /var/log/postgresql/postgresql-12-main.log
14  main_14 5433 down   postgres /var/lib/postgresql/14/main_14 /var/log/postgresql/postgresql-14-main_14.log

4. Upgrade Cluster Pada PostgreSQL Versi Lama ke PostgreSQL Versi Baru

Pada bagian ini, seluruh data pada database cluster main PostgreSQL 12 akan diupgrade untuk dijalankan oleh PostgreSQL 14. Semakin banyak data akan semakin lama.

$ sudo pg_upgradecluster 12 main

Jika menjalankan pg_upgradecluster terjadi error dibawah ini:

Restarting old cluster with restricted connections...
Notice: extra pg_ctl/postgres options given, bypassing systemctl for start operation
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = "en_US.UTF-8",
	LC_ALL = (unset),
	LC_TERMINAL = "iTerm2",
	LC_CTYPE = "UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
Error: The locale requested by the environment is invalid:
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  LC_CTYPE: UTF-8
  LC_TERMINAL: iTerm2
  LC_TERMINAL_VERSION: 3.4.19
Error: Could not create target cluster

Coba lakukan generate locale “en_US.UTF-8”:

sudo locale-gen "en_US.UTF-8"

jika masih error, edit ~/.profile dan tambahkan baris dibawah ini:

unset LC_CTYPE

Lalu logout dan login ulang.

Jika pg_upgradecluster berhasil, cek dengan pg_lsclusters terlihat cluster main PostgreSQL 14 adalah online.

$ pg_lsclusters
Ver Cluster Port Status Owner        Data directory                     Log file
12  main    5434 down   example_user /var/lib/postgresql/12/main        /var/log/postgresql/postgresql-12-main.log
14  main    5432 online example_user /var/lib/postgresql/14/main        /var/log/postgresql/postgresql-14-main.log
14  main_14 5433 down   example_user /var/lib/postgresql/14/main_14     /var/log/postgresql/postgresql-14-main_14.log

5. Hapus Cluster Lama

Berhubung cluster versi lama PostgreSQL sudah tidak digunakan, cluster lama dapat dihapus.

sudo pg_dropcluster 12 main

6. Hapus Paket lama PostgreSQL hasil dpkg

Lalu paket lama hasil dpkg pada poin 1 juga dapat dihapus. Cara hapus paket lama PostgreSQL dapat dilakukan dengan cara berikut.

sudo apt-get --purge autoremove postgresql-12

Jika cek lagi postgresql, maka hanya terlihat PostgreSQL 14 saja.

example_user@example:~$ dpkg --get-selections | grep postgres
postgresql                  install
postgresql-14               install
postgresql-client-14        install
postgresql-client-common    install
postgresql-common           install
postgresql-contrib          install