Logo PostgreSQL

Pada tulisan ini adalah cara upgrade PostgrSQL pada server Ubuntu. Saya melakukan upgrade dari PostgreSQL 14 ke PostgreSQL 16 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 16, ganti 'postgresql dengan 'postgresql-16'
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 14 dan PostgreSQL 16.

example_user@example:~$ dpkg --get-selections | grep postgres
postgresql					install
postgresql-14				install
postgresql-16				install
postgresql-client-14		install
postgresql-client-16		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     855  0.0  1.5 225524 31272 ?        Ss   Nov09   0:07 /usr/lib/postgresql/16/bin/postgres -D /var/lib/postgresql/16/main -c config_file=/etc/postgresql/16/main/postgresql.conf
example_user     856  0.0  1.5 254804 31320 ?        Ss   Nov09   0:00 /usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf
example_user     859  0.0  0.4 225660  9004 ?        Ss   Nov09   0:00 example_user: 16/main: checkpointer
example_user     860  0.0  0.3 225680  6228 ?        Ss   Nov09   0:04 example_user: 16/main: background writer
example_user     862  0.0  0.5 225524 10464 ?        Ss   Nov09   0:04 example_user: 16/main: walwriter
example_user     863  0.0  0.4 227132  8548 ?        Ss   Nov09   0:02 example_user: 16/main: autovacuum launcher
example_user     864  0.0  0.3 227108  6936 ?        Ss   Nov09   0:00 example_user: 16/main: logical replication launcher
example_user     884  0.0  0.4 254924  8676 ?        Ss   Nov09   0:00 example_user: 14/main: checkpointer
example_user     885  0.0  0.3 254804  6580 ?        Ss   Nov09   0:04 example_user: 14/main: background writer
example_user     886  0.0  0.5 254804 10788 ?        Ss   Nov09   0:04 example_user: 14/main: walwriter
example_user     887  0.0  0.3 255240  7480 ?        Ss   Nov09   0:00 example_user: 14/main: logical replication launcher
example_user    1122  0.0  1.0 256528 21608 ?        Ss   Nov09   0:00 example_user: 14/main: example example_db [local] idle
example_user    2624  0.0  1.0 256528 21724 ?        Ss   Nov09   0:00 example_user: 14/main: example example_db [local] idle

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 14 dan 16. Terlihat versi 14 dan 16 sama-sama memiliki cluster bernama main.

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

3. Matikan Service PostgreSQL

Agar dapat upgrade PostgreSQL 14 ke PostgreSQL 16 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
14  main    5432 down   example_user /var/lib/postgresql/14/main /var/log/postgresql/postgresql-14-main.log
16  main    5433 down   example_user /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16-main.log

3. Ganti Nama Cluster PostgreSQL Versi Terbaru

Upgrade PostgreSQL 14 ke PostgreSQL 16 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 16 main main_16

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

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

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

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

$ sudo pg_upgradecluster 14 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
14  main    5434 down   example_user /var/lib/postgresql/14/main    /var/log/postgresql/postgresql-14-main.log
16  main    5432 online example_user /var/lib/postgresql/16/main    /var/log/postgresql/postgresql-16-main.log
16  main_16 5433 down   example_user /var/lib/postgresql/16/main_16 /var/log/postgresql/postgresql-16-main_16.log

5. Hapus Cluster Lama

Berhubung cluster versi lama PostgreSQL sudah tidak digunakan, cluster lama dapat dihapus. Juga hapus cluster main_16 dimana ini merupakan cluster kita rename sebelumnya.

sudo pg_dropcluster 14 main
sudo pg_dropcluster 16 main_16

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-14

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

example_user@example:~$ dpkg --get-selections | grep postgres

postgresql					install
postgresql-16				install
postgresql-client-16		install
postgresql-client-common	install
postgresql-common			install
postgresql-contrib			install