V nedávném blogu o tom, co je nového v PostgreSQL 13, jsme zkontrolovali některé nové funkce této verze, ale nyní se podívejme, jak upgradovat, abyste mohli využívat všechny tyto funkce .
Upgrade na PostgreSQL 13
Pokud chcete upgradovat svou aktuální verzi PostgreSQL na tuto novou, máte tři hlavní nativní možnosti, jak tento úkol provést.
-
Pg_dump/pg_dumpall:Je to logický nástroj pro zálohování, který vám umožňuje vypsat data a obnovit je v nová verze PostgreSQL. Zde budete mít období výpadku, které se bude lišit podle velikosti vašich dat. Musíte zastavit systém nebo se vyhnout novým datům v primárním uzlu, spustit pg_dump, přesunout vygenerovaný výpis do nového databázového uzlu a obnovit jej. Během této doby nemůžete zapisovat do své primární databáze PostgreSQL, abyste se vyhnuli nekonzistenci dat.
-
Pg_upgrade:Je to nástroj PostgreSQL pro upgrade vaší verze PostgreSQL na místě. V produkčním prostředí by to mohlo být nebezpečné a v takovém případě tuto metodu nedoporučujeme. Při použití této metody budete mít také výpadky, ale pravděpodobně to bude podstatně kratší než použití předchozí metody pg_dump.
-
Logická replikace:Od PostgreSQL 10 můžete použít tuto metodu replikace, která vám umožní provádět velké upgrady verzí pomocí nulové (nebo téměř nulové) prostoje. Tímto způsobem můžete přidat pohotovostní uzel v poslední verzi PostgreSQL, a když je replikace aktuální, můžete provést proces převzetí služeb při selhání pro podporu nového uzlu PostgreSQL.
Podívejme se tedy na tyto metody jednu po druhé.
Použití pg_dump/pg_dumpall
V případě, že pro vás výpadky nejsou problémem, je tato metoda snadným způsobem upgradu.
Chcete-li vytvořit výpis, můžete spustit:
$ pg_dumpall > dump_pg12.out
Nebo vytvořit výpis z jedné databáze:
$ pg_dump world > dump_world_pg12.out
Pak můžete tento výpis zkopírovat na server s novou verzí PostgreSQL a obnovit jej:
$ psql -f dump_pg12.out postgres
Mějte na paměti, že během tohoto procesu budete muset zastavit aplikaci nebo se vyhnout zápisu do databáze, jinak budete mít nekonzistenci dat nebo potenciální ztrátu dat.
Použití pg_upgrade
Nejprve budete muset mít na serveru nainstalovanou novou i starou verzi PostgreSQL.
$ 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
Nejprve můžete spustit pg_upgrade pro testování upgradu přidáním parametru -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*
Příznaky znamenají:
-
-b:Starý spustitelný adresář PostgreSQL
-
-B:Nový spustitelný adresář PostgreSQL
-
-d:Starý konfigurační adresář databázového clusteru
-
-D:Nový konfigurační adresář databázového clusteru
-
-c:Kontrolovat pouze clustery. Nemění žádná data
Pokud vše vypadá v pořádku, můžete spustit stejný příkaz bez parametru -c a upgraduje váš PostgreSQL server. Chcete-li to provést, musíte nejprve zastavit svou aktuální verzi a spustit zmíněný příkaz.
$ 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
Po dokončení, jak naznačuje zpráva, můžete tyto skripty použít k analýze nového serveru PostgreSQL a smazání starého, až to bude bezpečné.
Použití logické replikace
Logická replikace je metoda replikace datových objektů a jejich změn na základě jejich replikační identity. Je založen na režimu publikování a odběru, kde jeden nebo více odběratelů odebírá jednu nebo více publikací v uzlu vydavatele.
Na základě toho tedy nakonfigurujeme vydavatele, v tomto případě server PostgreSQL 12, následovně.
Upravte konfigurační soubor postgresql.conf:
listen_addresses = '*'
wal_level = logical
max_wal_senders = 8
max_replication_slots = 4
Upravte konfigurační soubor pg_hba.conf:
# TYPE DATABASE USER ADDRESS METHOD
host all rep1 10.10.10.141/32 md5
Tam použijte IP adresu předplatitele.
Nyní musíte nakonfigurovat předplatitele, v tomto případě server PostgreSQL 13, následovně.
Upravte konfigurační soubor postgresql.conf:
listen_addresses = '*'
max_replication_slots = 4
max_logical_replication_workers = 4
max_worker_processes = 8
Vzhledem k tomu, že tento PostgreSQL 13 bude brzy novým primárním uzlem, měli byste v tomto kroku zvážit přidání parametrů wal_level a archive_mode, abyste se později vyhnuli novému restartu služby.
wal_level = logical
archive_mode = on
Tyto parametry budou užitečné, pokud chcete přidat novou repliku nebo pro použití záloh PITR.
Některé z těchto změn vyžadují restart serveru, takže restartujte vydavatele i odběratele.
Nyní musíte ve vydavateli vytvořit uživatele, kterého bude odběratel používat k přístupu. Role použitá pro replikační připojení musí mít atribut REPLICATION a aby bylo možné zkopírovat počáteční data, musí mít také oprávnění SELECT pro publikovanou tabulku:
world=# CREATE ROLE rep1 WITH LOGIN PASSWORD '********' REPLICATION;
CREATE ROLE
world=# GRANT SELECT ON ALL TABLES IN SCHEMA public to rep1;
GRANT
Vytvořme publikaci pub1 v uzlu vydavatele pro všechny tabulky:
world=# CREATE PUBLICATION pub1 FOR ALL TABLES;
CREATE PUBLICATION
Vzhledem k tomu, že schéma není replikováno, musíte provést zálohu v PostgreSQL 12 a obnovit ji v PostgreSQL 13. Záloha bude provedena pouze pro schéma, protože informace budou replikovány v počátečním převod.
V PostgreSQL 12 spusťte:
$ pg_dumpall -s > schema.sql
V PostgreSQL 13 spusťte:
$ psql -d postgres -f schema.sql
Jakmile budete mít své schéma v PostgreSQL 13, musíte vytvořit předplatné a nahradit hodnoty hostitele, dbname, uživatele a hesla těmi, které odpovídají vašemu prostředí.
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
Výše uvedené zahájí proces replikace, který synchronizuje počáteční obsah tabulek tabulek v publikaci a poté zahájí replikaci přírůstkových změn do těchto tabulek.
K ověření vytvořeného předplatného můžete použít katalog pg_stat_subscription. Toto zobrazení bude obsahovat jeden řádek na předplatné pro hlavního pracovníka (s nulovým PID, pokud pracovník není spuštěn) a další řádky pro pracovníky zpracovávající počáteční kopii dat přihlášených tabulek.
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
Chcete-li ověřit, kdy je počáteční přenos dokončen, můžete zkontrolovat proměnnou srsubstate v katalogu pg_subscription_rel. Tento katalog obsahuje stav pro každý replikovaný vztah v každém předplatném.
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)
Popisy sloupců:
-
srsubid:Odkaz na předplatné.
-
srrelid:Odkaz na vztah.
-
srsubstate:Kód stavu:i =inicializovat, d =data se kopírují, s =synchronizována, r =připraveno (normální replikace).
-
srsublsn:Ukončení LSN pro stavy s a r.
Po dokončení počátečního přenosu máte vše připraveno k nasměrování aplikace na váš nový server PostgreSQL 13.
Závěr
Jak můžete vidět, PostgreSQL má různé možnosti upgradu v závislosti na vašich požadavcích a toleranci prostojů.
Bez ohledu na to, jaký druh technologie používáte, udržování databázových serverů v aktuálním stavu prováděním pravidelných upgradů je nezbytný, ale obtížný úkol, protože se musíte ujistit, že nedojde ke ztrátě dat nebo nekonzistence dat po upgradu. Klíčem je zde podrobný a otestovaný plán a samozřejmě musí zahrnovat možnost vrácení pro každý případ.