Cara Upgrade PostgreSQL 16 Dengan pg_upgradecluster Pada Server Ubuntu
- Categories:
- tutorial
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