PostgreSQL 13, de nieuwste release van de Postgres-databasesoftware, wordt geleverd met veel verbeteringen onder de motorkap. Hoewel het de meest populaire en veelzijdige open-source RDBMS is, is het niet de gemakkelijkste om in te stellen en aan de slag te gaan. Lees verder om te leren hoe u aan de slag kunt met de nieuwste versie van Postgres op de nieuwste LTS-versie van de Ubuntuserver.
Installatie
Ubuntu 20.04 wordt geleverd met Postgres 12 uit zijn universum opslagplaats. Omdat we versie 13 willen, kunnen we de officiële APT-repository van het PostgreSQL-project direct gebruiken. Deze repository bevat binaire bestanden voor Ubuntu 20.04 en bevat ook pakketten voor verschillende extensies die u later misschien wilt installeren.
Laten we de repository als volgt instellen (merk op dat "focal" de codenaam is voor Ubuntu 20.04):
# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main
END
# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc
# fetch the metadata from the new repo
sudo apt-get update
We kunnen nu de PostgreSQL-server en andere opdrachtregelprogramma's installeren met:
sudo apt-get install -y postgresql-13
De installatie doet een paar dingen:
- Het installeert de PostgreSQL-server, hulpprogramma's en een opdrachtregelclient met de naam psql .
- Het maakt een Linux-systeemgebruiker aan met de naam postgres . Alle gegevensbestanden zijn eigendom van deze gebruiker en alle processen worden uitgevoerd als deze gebruiker.
- Het creëert een databasecluster (zie onder). In dit cluster creëert het een database, ook wel postgres . genoemd .
- Het maakt één PostgreSQL-gebruiker aan (niet de Linux-systeemgebruiker), ook wel postgres . genoemd . Deze PostgreSQL-gebruiker heeft superuser-rechten.
Je kunt zien dat dit verwarrend begint te worden!
Databaseclusters
In Postgres-termen hebben we nu één databasecluster in gebruik. Een enkele databasecluster kan een of meer databases bevatten. In het databasecluster dat we nu hebben, is er een database genaamd “postgres”. (Er zijn ook een aantal "sjabloon"-databases die we voorlopig kunnen negeren.)
Een databasecluster wordt beheerd door een hoofdproces van postgres genaamd de postmaster Het brengt verschillende onderliggende processen voort die ofwel verschillende systeemtaken uitvoeren of inkomende clientverbindingen afhandelen. Bekijk de huidige lopende processen:
alice@ubu:~$ ps -o uname,pid,ppid,cmd -H -U postgres
USER PID PPID CMD
postgres 4880 1 /usr/lib/postgresql/13/bin/postgres -D /var/lib/postgresql/13/main -c config_file=/etc/postgresql/13/main/postgresql.conf
postgres 4882 4880 postgres: 13/main: checkpointer
postgres 4883 4880 postgres: 13/main: background writer
postgres 4884 4880 postgres: 13/main: walwriter
postgres 4885 4880 postgres: 13/main: autovacuum launcher
postgres 4886 4880 postgres: 13/main: stats collector
postgres 4887 4880 postgres: 13/main: logical replication launcher
Hier is het postmasterproces 4880 en het heeft 6 onderliggende processen voortgebracht die verschillende huishoudelijke activiteiten afhandelen. U kunt ook de locatie van het cluster zien (/var/lib/postgresql/13/main
) en de locatie van het configuratiebestand (/etc/postgresql/13/main/postgresql.conf
).
Herladen en herstarten
Op verschillende momenten moet u mogelijk opnieuw laden of opnieuw opstarten uw Postgres-server. Herladen zorgt ervoor dat Postgres de configuratiebestanden opnieuw onderzoekt en de wijzigingen toepast. Als er geen wijzigingen zijn in de configuratiebestanden, gebeurt er niets ergs. Het herladen stoort de huidige aangesloten clients niet. Om uw Postgres-server opnieuw te laden, kunt u het volgende doen:
sudo systemctl reload postgresql
Sommige configuratiewijzigingen worden pas van kracht nadat u de server opnieuw hebt opgestart. Dit is meer storend en verbreekt de verbinding met alle aangesloten clients. Om opnieuw op te starten, kunt u:
sudo systemctl restart postgresql
Logbestanden
Zoals je kunt zien, is er een systemd-service genaamd postgresql
waarmee u de postmaster kunt bedienen. Als de service niet start, kunt u de status controleren om te controleren op foutmeldingen:
alice@ubu:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2020-10-29 04:52:29 UTC; 25min ago
Main PID: 4557 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 1075)
Memory: 0B
CGroup: /system.slice/postgresql.service
Oct 29 04:52:29 ubu systemd[1]: Starting PostgreSQL RDBMS...
Oct 29 04:52:29 ubu systemd[1]: Finished PostgreSQL RDBMS.
De PostgreSQL-server schrijft een logbestand, dat u kunt controleren op meer gedetailleerde foutmeldingen. Dit bestand bevindt zich op /var/log/postgresql/postgresql-13-main.log
:
alice@ubu:~$ cat /var/log/postgresql/postgresql-13-main.log
2020-10-29 04:52:34.096 UTC [4880] LOG: starting PostgreSQL 13.0 (Ubuntu 13.0-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0, 64-bit
2020-10-29 04:52:34.097 UTC [4880] LOG: listening on IPv4 address "127.0.0.1", port 5432
2020-10-29 04:52:34.099 UTC [4880] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-10-29 04:52:34.106 UTC [4881] LOG: database system was shut down at 2020-10-29 04:52:31 UTC
2020-10-29 04:52:34.112 UTC [4880] LOG: database system is ready to accept connections
Verbinding maken met uw Postgres-server
Nu we onze server in gebruik hebben, laten we proberen er verbinding mee te maken. Standaard luistert de server alleen naar:
- TCP-verbindingen vanaf 127.0.0.1 op poort 5432, en
- Unix-domein-sockets in /var/run/postgresql
Vanwege de standaardconfiguratie is de enige manier om nu verbinding te maken met de server via de Unix-socket vanuit een proces dat wordt uitgevoerd als de systeemgebruiker postgres . Laten we de standaard interactieve client psql uitvoeren als volgt:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=#
Hier voeren we psql uit als de systeemgebruiker postgres (“sudo -u postgres psql”) en verbinden we met de database genaamd “postgres” (de laatste “postgres” op de opdrachtregel.) De prompt “postgres=#” geeft de naam van de momenteel verbonden database (“postgres”) en dat we superuser-privileges hebben (“#” in plaats van “$”).
De verbinding gebeurde via Unix-sockets (dit is de standaardmethode in psql). Aangezien de postgres-gebruiker standaard geen wachtwoord heeft en de standaardconfiguratie wachtwoordverificatie vereist voor TCP-verbindingen, is het op dit moment niet mogelijk om verbinding te maken via 127.0.0.1:5432 .
Inkomende verbindingen vanaf een intern netwerk toestaan
Laten we eerst de configuratie wijzigen om verbindingen vanaf een intern netwerk toe te staan. Ervan uitgaande dat het IP-adres van onze server op dit netwerk 10.1.2.3 is, kunnen we het hoofdconfiguratiebestand bewerken op /etc/postgresql/13/main/postgresql.conf
en verander de regels:
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
naar:
listen_addresses = 'localhost,10.1.2.3'
We moeten Postgres ook vertellen om wachtwoordverificatie te gebruiken voor verbindingen die binnenkomen vanaf deze netwerken. Bewerk hiervoor een ander configuratiebestand genaamd /etc/postgresql/13/main/pg_hba.conf
en verander de regel:
host all all 127.0.0.1/32 md5
naar:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.1.0.0/16 scram-sha-256
(Ervan uitgaande dat het interne netwerk 10.1.0.0/16 is.)
We hebben ook de standaard md5
gewijzigd methode naar de nieuwere en veiligerescram-sha-256
. Alle andere gevallen van md5
in het bestand moet ook worden vervangen door scram-sha-256
. Als uw toepassing of databasestuurprogramma deze methode niet ondersteunt, blijft u de md5
. gebruiken methode in plaats daarvan.
Om deze wijzigingen van kracht te laten worden, moet u de server opnieuw opstarten:
sudo systemctl restart postgresql
Een gewone gebruiker en database aanmaken
We zijn er bijna!
We kunnen nu een gewone gebruiker maken waarmee onze applicatie verbinding kan maken, en een database waarover het volledige controle heeft. Maak verbinding als de supergebruiker postgres lokaal vanaf de servermachine om dit te doen:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=# SET password_encryption = 'scram-sha-256';
SET
postgres=# CREATE USER alice PASSWORD 's3cr3tp@ss';
CREATE ROLE
postgres=#
(Laat het eerste commando weg als je md5
wilt gebruiken in plaats daarvan.) Dit creëerde een gebruiker genaamd alice met het wachtwoord s3cr3tp@ss . Laten we ook een database maken die deze gebruiker zal bezitten:
postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#
De database heet app1 . Sinds alice eigenaar is van deze database, zijn alle bewerkingen binnen de database (zoals het maken van tabellen, het invoegen van rijen) toegestaan als de toepassing verbinding maakt als de gebruiker alice .
Laten we proberen verbinding te maken als alice , via het netwerk:
~$ psql -h 10.1.2.3 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=>
Stoer! We zijn nu verbonden met de database app1 als de gebruiker alice .
Databases verwijderen, back-ups maken en terugzetten
Hier zijn een paar trucs die kunnen helpen als u doorgaat met werken met uw Postgresserver:
Een database verwijderen
U kunt de zojuist aangemaakte database (“app1”) als volgt verwijderen:
alice@ubu:~$ psql -h 127.0.0.1 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=> \c postgres
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "postgres" as user "alice".
postgres=> DROP DATABASE app1;
DROP DATABASE
postgres=>
Merk op dat u eerst naar een andere database moet overschakelen met het “\c”-commando van psql.
Om nog een database aan te maken, of om app1 opnieuw te maken , maak verbinding als de superuser en doe "CREATE DATABASE" zoals eerder.
Maak een back-up van de database
De gemakkelijkste manier om een back-up te maken van de gegevens in uw database is door pg_dump . te gebruiken als volgt:
alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:
Hiermee wordt een SQL-bestand gemaakt met de naam "backup.sql" dat alle SQL-opdrachten bevat die nodig zijn om het schema en de gegevens in de database app1 opnieuw te maken , in tekstformaat. U kunt deze opdrachten in elke database uitvoeren en het schema en de gegevens worden in die database ingevuld.
Lees hier meer over pg_dump.
Gegevens herstellen
Het SQL-opdrachtbestand dat u hierboven hebt gemaakt, kan als volgt worden hersteld:
alice@ubu:~$ psql -h 127.0.0.1 -U alice app2
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app2=> \i backup.sql
SET
SET
(..snip..)
Merk op dat we het schema en de gegevens in een andere database hebben hersteld, app2 . Met het commando “\i” van psql kun je de SQL-commando's uit een bestand uitvoeren.
Volgende stappen
Er is een hele reeks artikelen, tutorials, video's en cursussen die je helpen om je te helpen met PostgreSQL. Besteed echter wat tijd aan de officiële documentatie hier, die gezaghebbende en uitgebreide dekking biedt van alle PostgreSQL-functies, syntaxis en gebundelde hulpprogramma's.