Pembaruan : Proses ini sama untuk memutakhirkan 9.5 hingga setidaknya 11.5; hanya memodifikasi perintah untuk mencerminkan versi 9.6
dan 10
, di mana 9.6
adalah tua versi dan 10
adalah baru versi. Pastikan untuk menyesuaikan direktori "lama" dan "baru" juga.
Saya baru saja memutakhirkan PostgreSQL 9.5 menjadi 9.6 di Ubuntu dan berpikir saya akan membagikan temuan saya, karena ada beberapa nuansa OS / paket khusus yang perlu diperhatikan.
( Saya tidak ingin harus membuang dan mengembalikan data secara manual , sehingga beberapa jawaban lain di sini tidak dapat digunakan.)
Singkatnya, proses terdiri dari menginstal versi baru PostgreSQL bersama versi lama (misalnya, 9.5 dan 9.6), dan kemudian menjalankan pg_upgrade
biner, yang dijelaskan dalam (beberapa) detail di https://www.postgresql.org/ docs / 9.6 / static / pgupgrade.html .
Satu-satunya aspek "rumit" dari pg_upgrade
kegagalan untuk melewati nilai yang benar untuk suatu argumen, atau kegagalan untuk login sebagai pengguna yang benar atau cd
ke lokasi yang benar sebelum menjalankan perintah, dapat menyebabkan pesan kesalahan samar.
Di Ubuntu (dan mungkin Debian), asalkan Anda menggunakan repo "resmi" deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main
,, dan asalkan Anda belum mengubah jalur sistem file default atau opsi runtime, prosedur berikut harus melakukan pekerjaan.
Instal versi baru (perhatikan bahwa kami menentukan 9.6
, secara eksplisit):
sudo apt install postgresql-9.6
Setelah instalasi berhasil, kedua versi akan berjalan berdampingan, tetapi pada port yang berbeda. Output instalasi menyebutkan ini, di bagian bawah, tetapi mudah untuk diabaikan:
Creating new cluster 9.6/main ...
config /etc/postgresql/9.6/main
data /var/lib/postgresql/9.6/main
locale en_US.UTF-8
socket /var/run/postgresql
port 5433
Hentikan kedua contoh server (ini akan menghentikan keduanya sekaligus):
sudo systemctl stop postgresql
Beralih ke pengguna sistem PostgreSQL khusus:
su postgres
Pindah ke direktori rumahnya (gagal melakukan ini akan menyebabkan kesalahan):
cd ~
pg_upgrade
membutuhkan input berikut (beri pg_upgrade --help
tahu kami ini):
When you run pg_upgrade, you must provide the following information:
the data directory for the old cluster (-d DATADIR)
the data directory for the new cluster (-D DATADIR)
the "bin" directory for the old version (-b BINDIR)
the "bin" directory for the new version (-B BINDIR)
Input ini dapat ditentukan dengan "nama panjang", agar lebih mudah divisualisasikan:
-b, --old-bindir=BINDIR old cluster executable directory
-B, --new-bindir=BINDIR new cluster executable directory
-d, --old-datadir=DATADIR old cluster data directory
-D, --new-datadir=DATADIR new cluster data directory
Kita juga harus melewati --new-options
sakelar, karena kegagalan untuk melakukannya menghasilkan sebagai berikut:
connection to database failed: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/lib/postgresql/.s.PGSQL.50432"?
Hal ini terjadi karena opsi konfigurasi default diterapkan tanpa adanya sakelar ini, yang mengakibatkan opsi koneksi yang salah digunakan, karenanya kesalahan soket.
Jalankan pg_upgrade
perintah dari versi PostgreSQL baru :
/usr/lib/postgresql/9.6/bin/pg_upgrade --old-bindir=/usr/lib/postgresql/9.5/bin --new-bindir=/usr/lib/postgresql/9.6/bin --old-datadir=/var/lib/postgresql/9.5/main --new-datadir=/var/lib/postgresql/9.6/main --old-options=-cconfig_file=/etc/postgresql/9.5/main/postgresql.conf --new-options=-cconfig_file=/etc/postgresql/9.6/main/postgresql.conf
Logout dari akun pengguna sistem khusus:
exit
Pembaruan sekarang selesai, tetapi , instance baru akan mengikat ke port 5433
(standar standarnya adalah 5432
), jadi ingatlah ini jika mencoba untuk menguji instance baru sebelum "memotong" untuk itu.
Mulai server seperti biasa (sekali lagi, ini akan memulai instance lama dan baru):
systemctl start postgresql
Jika Anda ingin menjadikan versi baru sebagai default, Anda perlu mengedit file konfigurasi yang efektif, misalnya /etc/postgresql/9.6/main/postgresql.conf
, dan memastikan bahwa port didefinisikan seperti itu:
port = 5432
Jika Anda melakukan ini, ubah nomor port versi lama ke 5433
pada saat yang sama (sebelum memulai layanan), atau, cukup hapus versi lama (ini tidak akan menghapus konten database Anda yang sebenarnya; Anda harus menggunakannya apt --purge remove postgresql-9.5
untuk itu terjadi ):
apt remove postgresql-9.5
Perintah di atas akan menghentikan semua instance, jadi Anda harus memulai instance baru terakhir kali dengan:
systemctl start postgresql
Sebagai catatan terakhir, jangan lupa untuk mempertimbangkan pg_upgrade
saran bagus:
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
./analyze_new_cluster.sh
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh