Dalam blog baru-baru ini tentang apa yang baru di PostgreSQL 13, kami meninjau beberapa fitur baru dari versi ini, tetapi sekarang, mari kita lihat cara meningkatkan agar dapat memanfaatkan semua fungsi yang disebutkan ini .
Meningkatkan ke PostgreSQL 13
Jika Anda ingin memutakhirkan versi PostgreSQL Anda saat ini ke versi baru ini, Anda memiliki tiga opsi asli utama untuk melakukan tugas ini.
-
Pg_dump/pg_dumpall:Ini adalah alat pencadangan logis yang memungkinkan Anda membuang data dan memulihkannya di versi PostgreSQL baru. Di sini Anda akan memiliki periode waktu henti yang akan bervariasi sesuai dengan ukuran data Anda. Anda perlu menghentikan sistem atau menghindari data baru di node utama, menjalankan pg_dump, memindahkan dump yang dihasilkan ke node database baru, dan memulihkannya. Selama waktu ini, Anda tidak dapat menulis ke database PostgreSQL utama Anda untuk menghindari inkonsistensi data.
-
Pg_upgrade:Ini adalah alat PostgreSQL untuk meningkatkan versi PostgreSQL Anda di tempat. Ini bisa berbahaya di lingkungan produksi dan kami tidak merekomendasikan metode ini dalam kasus itu. Dengan menggunakan metode ini, Anda juga akan mengalami downtime, tetapi mungkin akan jauh lebih sedikit daripada menggunakan metode pg_dump sebelumnya.
-
Replikasi Logis:Sejak PostgreSQL 10, Anda dapat menggunakan metode replikasi ini yang memungkinkan Anda melakukan peningkatan versi utama dengan nol (atau hampir nol) downtime. Dengan cara ini, Anda dapat menambahkan node siaga di versi PostgreSQL terakhir, dan ketika replikasi terbaru, Anda dapat melakukan proses failover untuk mempromosikan node PostgreSQL baru.
Jadi, mari kita lihat metode ini satu per satu.
Menggunakan pg_dump/pg_dumpall
Jika waktu henti tidak menjadi masalah bagi Anda, metode ini adalah cara mudah untuk meningkatkan versi.
Untuk membuat dump, Anda dapat menjalankan:
$ pg_dumpall > dump_pg12.out
Atau untuk membuat dump dari satu database:
$ pg_dump world > dump_world_pg12.out
Kemudian, Anda dapat menyalin dump ini ke server dengan versi PostgreSQL baru, dan memulihkannya:
$ psql -f dump_pg12.out postgres
Perlu diingat bahwa Anda harus menghentikan aplikasi atau menghindari penulisan dalam database selama proses ini, jika tidak, Anda akan mengalami inkonsistensi data atau potensi kehilangan data.
Menggunakan pg_upgrade
Pertama, Anda harus menginstal PostgreSQL versi baru dan lama di server.
$ rpm -qa |grep postgres
postgresql13-contrib-13.3-2PGDG.rhel8.x86_64
postgresql13-server-13.3-2PGDG.rhel8.x86_64
postgresql13-libs-13.3-2PGDG.rhel8.x86_64
postgresql13-13.3-2PGDG.rhel8.x86_64
postgresql12-libs-12.7-2PGDG.rhel8.x86_64
postgresql12-server-12.7-2PGDG.rhel8.x86_64
postgresql12-12.7-2PGDG.rhel8.x86_64
postgresql12-contrib-12.7-2PGDG.rhel8.x86_64
Kemudian, pertama, Anda dapat menjalankan pg_upgrade untuk menguji upgrade dengan menambahkan flag -c:
$ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-12/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/12/data -D /var/lib/pgsql/13/data -c
Performing Consistency Checks on Old Live Server
------------------------------------------------
Checking cluster versions ok
Checking database user is the install user ok
Checking database connection settings ok
Checking for prepared transactions ok
Checking for system-defined composite types in user tables ok
Checking for reg* data types in user tables ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for presence of required libraries ok
Checking database user is the install user ok
Checking for prepared transactions ok
Checking for new cluster tablespace directories ok
*Clusters are compatible*
Arti bendera:
-
-b:Direktori lama yang dapat dieksekusi PostgreSQL
-
-B:Direktori executable PostgreSQL baru
-
-d:Direktori konfigurasi cluster database lama
-
-D:Direktori konfigurasi cluster database baru
-
-c:Periksa cluster saja. Itu tidak mengubah data apa pun
Jika semuanya terlihat baik-baik saja, Anda dapat menjalankan perintah yang sama tanpa flag -c dan itu akan meningkatkan server PostgreSQL Anda. Untuk ini, Anda harus menghentikan versi Anda saat ini terlebih dahulu dan menjalankan perintah yang disebutkan.
$ systemctl stop postgresql-12
$ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-12/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/12/data -D /var/lib/pgsql/13/data
...
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
Setelah selesai, seperti yang disarankan oleh pesan, Anda dapat menggunakan skrip tersebut untuk menganalisis server PostgreSQL baru dan menghapus yang lama jika aman.
Menggunakan Replikasi Logis
Replikasi logis adalah metode mereplikasi objek data dan perubahannya, berdasarkan identitas replikasinya. Ini didasarkan pada mode terbitkan dan berlangganan, di mana satu atau lebih pelanggan berlangganan satu atau lebih publikasi pada simpul penerbit.
Jadi berdasarkan ini, mari kita konfigurasikan publisher, dalam hal ini server PostgreSQL 12, sebagai berikut.
Edit file konfigurasi postgresql.conf:
listen_addresses = '*'
wal_level = logical
max_wal_senders = 8
max_replication_slots = 4
Edit file konfigurasi pg_hba.conf:
# TYPE DATABASE USER ADDRESS METHOD
host all rep1 10.10.10.141/32 md5
Gunakan alamat IP pelanggan di sana.
Sekarang, Anda harus mengkonfigurasi pelanggan, dalam hal ini server PostgreSQL 13, sebagai berikut.
Edit file konfigurasi postgresql.conf:
listen_addresses = '*'
max_replication_slots = 4
max_logical_replication_workers = 4
max_worker_processes = 8
Karena PostgreSQL 13 ini akan segera menjadi node utama baru, Anda harus mempertimbangkan untuk menambahkan parameter wal_level dan archive_mode dalam langkah ini, untuk menghindari restart baru layanan nanti.
wal_level = logical
archive_mode = on
Parameter ini akan berguna jika Anda ingin menambahkan replika baru atau menggunakan cadangan PITR.
Beberapa perubahan ini memerlukan server dimulai ulang, jadi mulai ulang penerbit dan pelanggan.
Sekarang, di penerbit, Anda harus membuat pengguna yang akan digunakan oleh pelanggan untuk mengaksesnya. Peran yang digunakan untuk koneksi replikasi harus memiliki atribut REPLICATION dan, untuk dapat menyalin data awal, ia juga memerlukan hak istimewa SELECT pada tabel yang dipublikasikan:
world=# CREATE ROLE rep1 WITH LOGIN PASSWORD '********' REPLICATION;
CREATE ROLE
world=# GRANT SELECT ON ALL TABLES IN SCHEMA public to rep1;
GRANT
Mari kita buat publikasi pub1 di node penerbit, untuk semua tabel:
world=# CREATE PUBLICATION pub1 FOR ALL TABLES;
CREATE PUBLICATION
Karena skema tidak direplikasi, Anda harus mengambil cadangan di PostgreSQL 12 dan memulihkannya di PostgreSQL 13. Cadangan hanya akan diambil untuk skema karena informasi akan direplikasi di awal transfer.
Di PostgreSQL 12, jalankan:
$ pg_dumpall -s > schema.sql
Di PostgreSQL 13, jalankan:
$ psql -d postgres -f schema.sql
Setelah Anda memiliki skema di PostgreSQL 13, Anda perlu membuat langganan, mengganti nilai host, dbname, pengguna, dan sandi dengan nilai yang sesuai dengan lingkungan Anda.
world=# CREATE SUBSCRIPTION sub1 CONNECTION 'host=10.10.10.140 dbname=world user=rep1 password=********' PUBLICATION pub1;
NOTICE: created replication slot "sub1" on publisher
CREATE SUBSCRIPTION
Hal di atas akan memulai proses replikasi, yang menyinkronkan isi tabel awal dari tabel dalam publikasi dan kemudian mulai mereplikasi perubahan tambahan pada tabel tersebut.
Untuk memverifikasi langganan yang dibuat, Anda dapat menggunakan katalog pg_stat_subscription. Tampilan ini akan berisi satu baris per langganan untuk pekerja utama (dengan PID nol jika pekerja tidak berjalan), dan baris tambahan untuk pekerja yang menangani salinan data awal dari tabel langganan.
world=# SELECT * FROM pg_stat_subscription;
-[ RECORD 1 ]---------+------------------------------
subid | 16421
subname | sub1
pid | 464
relid |
received_lsn | 0/23A8490
last_msg_send_time | 2021-07-23 22:42:26.358605+00
last_msg_receipt_time | 2021-07-23 22:42:26.358842+00
latest_end_lsn | 0/23A8490
latest_end_time | 2021-07-23 22:42:26.358605+00
Untuk memverifikasi kapan transfer awal selesai, Anda dapat memeriksa variabel srsubstate pada katalog pg_subscription_rel. Katalog ini berisi status untuk setiap relasi yang direplikasi di setiap langganan.
world=# SELECT * FROM pg_subscription_rel;
srsubid | srrelid | srsubstate | srsublsn
---------+---------+------------+-----------
16421 | 16408 | r | 0/23B1738
16421 | 16411 | r | 0/23B17A8
16421 | 16405 | r | 0/23B17E0
16421 | 16402 | r | 0/23B17E0
(4 rows)
Deskripsi kolom:
-
srsubid:Referensi ke langganan.
-
srrelid:Referensi ke relasi.
-
srsubstate:Kode status:i =inisialisasi, d =data sedang disalin, s =disinkronkan, r =siap (replikasi normal).
-
srsublsn:Akhiri LSN untuk status s dan r.
Saat transfer awal selesai, Anda memiliki segalanya untuk mengarahkan aplikasi Anda ke server PostgreSQL 13 baru Anda.
Kesimpulan
Seperti yang Anda lihat, PostgreSQL memiliki opsi berbeda untuk meningkatkan versi, bergantung pada persyaratan dan toleransi waktu henti Anda.
Apa pun jenis teknologi yang Anda gunakan, menjaga agar server basis data Anda tetap mutakhir dengan melakukan pemutakhiran secara rutin adalah tugas yang perlu tetapi sulit, karena Anda perlu memastikan bahwa Anda tidak akan kehilangan data atau inkonsistensi data setelah pemutakhiran. Rencana yang terperinci dan teruji adalah kuncinya di sini, dan tentu saja, itu harus menyertakan opsi pengembalian, untuk berjaga-jaga.