sql >> Databáze >  >> RDS >> PostgreSQL

Upgrade na PostgreSQL13

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.


  1. Analýza názvů tabulek a sloupců z SQL/HQL Java

  2. Jak funguje ATAN2() v MariaDB

  3. Optimalizace dotazů SQL — Jak zjistit, kdy a zda je to potřeba

  4. Nelze načíst ID posledního vloženého řádku v režimu spánku pomocí Oracle