In PostgreSQL wordt versie-upgrade op verschillende manieren uitgevoerd:
Pakketten installeren met een nieuwe versie van PostgreSQL. Dit is geschikt voor kleinere updates. Lees de release-opmerkingen goed door voordat je de upgrade uitvoert.
Gebruik van het standaard pg_dumpall-programma. Dit is een betrouwbare methode, maar er kan een lange downtime zijn.
Gebruik van het standaard pg_upgrade-programma. Een andere snelle manier om te upgraden, maar fouten kunnen zich voordoen.
Upgraden via logische replicatie. Deze optie heeft minimale downtime, maar is alleen geschikt voor PostgreSQL-versies groter dan 10.0. Eerdere versies vereisen uitbreidingen. De keuze hangt af van de versie die op de server wordt gebruikt en naar welke versie je wilt upgraden.
In dit artikel behandelen we alle bovengenoemde upgrade-methoden.
Het belangrijkste is om de bijzonderheden van updates tussen verschillende versies te begrijpen. De versienummers bestaan uit twee cijfers, bijvoorbeeld 10.1. Het eerste cijfer is het belangrijkste versienummer (10). Het tweede cijfer is het minor release-nummer (1). Voor PostgreSQL vóór versie 10 bestonden de versienummers uit drie cijfers. Bijvoorbeeld, in 9.6.3, is 9.6 het belangrijkste release-nummer en 3 het minor versienummer.
Je moet dit verschil begrijpen om de juiste upgrade-methode te kiezen.
In minor-versies verandert het gegevensopslagformaat niet, dus er zijn geen compatibiliteitsproblemen. Daarom kan de overgang van PostgreSQL 10.1 naar 10.6 zeer gemakkelijk worden uitgevoerd. Om te upgraden, zet je de server uit, vervang je de uitvoerbare bestanden en start je de server opnieuw.
De documentatie meldt echter dat sommige releases handmatige wijzigingen kunnen vereisen. Lees altijd de release-opmerkingen voordat je de upgrade uitvoert.
In major-versies kan het gegevensformaat veranderen. Dit maakt de update moeilijker. Je moet de gegevens mogelijk exporteren en opnieuw importeren, het pg_upgrade-programma gebruiken of logische replicatie toepassen.
Laten we alle methoden hieronder bekijken.
Laten we kijken hoe je PostgreSQL versie 14.1 kunt upgraden naar versie 14.3 op een Ubuntu-server.
PostgreSQL is standaard beschikbaar op Ubuntu. Begin met het commando:
sudo apt-get upgrade
Debian en Ubuntu brengen slechts één versie van PostgreSQL per besturingssysteemversie uit. Bijvoorbeeld, Debian Squeeze/6.0 heeft alleen PostgreSQL 8.4. Als je een andere versie van PostgreSQL nodig hebt, gebruik dan pakketten van PGDG.
Als je de laatste versie van PostgreSQL wilt, moet je eerst het Postgres-repository installeren.
Voeg een repository toe:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Importeer de signeringssleutel:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Werk de pakketlijst in het systeem bij:
sudo apt-get update
Installeer de benodigde PostgreSQL-versie:
sudo apt-get -y install postgresql-14.3
Om de lijst van geïnstalleerde DBMS's te bekijken, voer het volgende uit:
dpkg --get-selections | grep postgres
Bekijk ook de lijst van clusters:
pg_lsclusters
Stop PostgreSQL voordat je wijzigingen aanbrengt:
sudo service postgresql stop
Wanneer de PostgreSQL-pakketten zijn geïnstalleerd, maken ze een standaardcluster voor je. Je moet de naam van het nieuwe PostgreSQL-cluster wijzigen om conflicten met de oude clusternaam tijdens de upgrade te voorkomen:
sudo pg_renamecluster 14.3 main main_pristine
Upgrade het oude cluster:
sudo pg_upgradecluster 14.1 main
Start de service:
sudo service postgresql start
Controleer opnieuw de lijst van clusters en zorg ervoor dat het nieuwe cluster werkt:
pg_lsclusters
Verwijder de oude cluster:
sudo pg_dropcluster 14.1 main
Als je de major versie moet wijzigen, gebruik dan het pg_dumpall-programma. Het principe van deze methode is om gegevens uit één major versie te exporteren en ze vervolgens in een andere versie te importeren.
Voordat je de gegevens exporteert, moet je ervoor zorgen dat er geen wijzigingen in de database worden aangebracht. Anders worden sommige wijzigingen mogelijk niet opgenomen in de uiteindelijke dump.
Verkrijg de dump en schrijf deze naar een bestand:
pg_dumpall > output_file
Stop de server:
pg_ctl stop
Wijzig de naam van de oude directory om naamconflicten te voorkomen:
mv /usr/local/pgsql /usr/local/pgsql.old
De oude directory kan gewoon worden verwijderd. Maar het is wijzer om het te hernoemen om ruimte voor herstel te behouden. In plaats van /usr/local/pgsql geef je het pad naar je directory op.
Installeer de nieuwe versie vanaf de bron. Er is een gedetailleerde handleiding in de documentatie.
Maak een nieuwe cluster aan:
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
Zorg ervoor dat je de wijzigingen in de pg_hba.conf en postgresql.conf bestanden overzet.
Start de database-server:
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
Herstel de gegevens uit de back-up:
/usr/local/pgsql/bin/psql -d postgres -f output_file
Het nadeel van deze methode is dat de server voor een lange tijd uitgeschakeld zal zijn. Om de downtime te verminderen, kun je de nieuwe server in een andere directory installeren en vervolgens de oude en nieuwe servers op verschillende poorten draaien. Om gegevens over te zetten, gebruik het commando:
pg_dumpall -p 5432 | psql -d postgres -p 5433
Vervang 5432 en 5433 door de poortnummers waarop je de servers hebt uitgevoerd.
Om het exporteren en importeren van gegevens te vermijden, gebruik het pg_upgrade-programma. Het helpt je sneller te upgraden. Het pg_upgrade-programma maakt systeemtabellen opnieuw, rekening houdend met de wijzigingen in de nieuwste PostgreSQL-versies. In dit geval blijven de oude gegevensbestanden behouden. Daarnaast verifieert pg_upgrade of de clusters compatibel zijn.
Het pg_upgrade-programma helpt je upgraden van PostgreSQL 8.4.X naar de huidige DBMS-release.
Laten we een algemeen upgradeplan bekijken met behulp van pg_upgrade.
Verplaats de oude cluster. Dit moet worden gedaan als de directory niet naar de oude release was gelinkt. Bijvoorbeeld, het bevindt zich in /usr/local/pgsql. Als je het niet hernoemt, ontstaat er een conflict tijdens de update.
Hernoemen gebeurt wanneer de server is uitgeschakeld met het commando:
mv /usr/local/pgsql /usr/local/pgsql.old
Bouw de nieuwe versie vanaf de bron. Pas de configureeropties aan zodat de vlaggen compatibel zijn met de oude clusterconfiguratie. Voordat je de upgrade start, controleert pg_upgrade de compatibiliteit van de vlaggen.
Installeer nieuwe uitvoerbare bestanden. Gebruik een prefix om de server in een niet-standaard directory te plaatsen:
make prefix=/usr/local/pgsql.new install
Gebruik initdb om een nieuwe cluster te initialiseren. Controleer of de vlaggen compatibel zijn met de vlaggen van de oude cluster.
Installeer de uitbreidingsbestanden van gedeelde objecten. Als er updates beschikbaar zijn, maakt pg_upgrade automatisch een script voor hun latere installatie.
Zorg ervoor dat de peer-authenticatie in pg_hba.conf is ingesteld. Dit moet worden gedaan omdat pg_upgrade meerdere keren verbinding maakt met de oude en nieuwe hosts.
Controleer of de oude en nieuwe servers zijn gestopt:
pg_ctl -D /opt/PostgreSQL/9.6 stop
pg_ctl -D /opt/PostgreSQL/14 stop
Voer pg_upgrade uit vanaf de nieuwe server. Roep eerst het programma aan in de controlemodus door de vlag toe te voegen: pg_upgrade --check. In reactie ontvang je een lijst met aanpassingen die handmatig moeten worden uitgevoerd na de upgrade.
Als je wijzigingen hebt aangebracht in het bestand pg_hba.conf, herstel het dan naar de vorige pg_hba.conf status. Soms moeten andere configuraties op de nieuwe cluster worden gewijzigd om overeen te komen met de instellingen van de oude cluster.
Start de server.
Als je tevreden bent met het resultaat, verwijder dan de oude cluster.
Voor details en functies van het gebruik van pg_upgrade, zie de documentatie.
Vanaf versie 10 van PostgreSQL is er een methode voor logische replicatie van gegevensobjecten en de wijzigingen daarin. Het is gebaseerd op het gebruik van replicatie-identificators; meestal zijn dit primaire sleutels.
Logische replicatie maakt gebruik van het publish-subscribe-model. De gebruiker maakt een momentopname van de gepubliceerde database en kopieert deze naar de abonnee. In de PostgreSQL-documentatie is een van de typische scenario’s voor het gebruik van logische replicatie juist de replicatie tussen verschillende major versies van PostgreSQL.
De back-upserver kan zich op dezelfde of een andere host bevinden. Nadat de synchronisatie is voltooid, zijn er verschillende opties beschikbaar. Bijvoorbeeld, je kunt de nieuwe server de hoofdserver maken en de oude uitschakelen.
Het belangrijkste voordeel van logische replicatie is de minimale downtime. De serveronderbreking is in sommige gevallen beperkt tot een paar seconden.
We hebben gekeken naar de universele methoden voor het upgraden van PostgreSQL naar een nieuwe major versie en het updaten binnen één major versie.
Met deze gids kun je de methode kiezen die het beste bij jouw situatie past en je huidige versie van PostgreSQL updaten.