PostgreSQL 13, den senaste versionen av Postgres databasprogramvara, kommer med många förbättringar under huven. Även om det är det mest populära och mångsidiga RDBMS med öppen källkod som finns, är det inte det lättaste att installera och komma igång. Läs vidare för att lära dig hur du kan komma igång med den senaste versionen av Postgres på den senaste LTS-versionen av Ubuntuservern.
Installation
Ubuntu 20.04 kommer med Postgres 12 från dess universum förvaret. Eftersom vi vill ha version 13 kan vi direkt använda PostgreSQL-projektets officiella APT-förråd. Det här förrådet innehåller binärfiler för Ubuntu 20.04 och inkluderar även paket för olika tillägg som du kanske vill installera senare.
Låt oss ställa in förvaret så här (observera att "focal" är kodnamnet för 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
Vi kan nu installera PostgreSQL-servern och andra kommandoradsverktyg med:
sudo apt-get install -y postgresql-13
Installationen gör några saker:
- Den installerar PostgreSQL-servern, verktyg och en kommandoradsklient som heterpsql .
- Den skapar en Linux-systemanvändare som heter postgres . Alla datafiler ägs av denna användare, och alla processer körs som denna användare.
- Det skapar ett databaskluster (se nedan). I detta kluster skapar den en databas, även kallad postgres .
- Det skapar en PostgreSQL-användare (inte Linux-systemanvändaren), även kalladpostgres . Den här PostgreSQL-användaren har superanvändarbehörigheter.
Du kan se att det här börjar bli förvirrande!
Databaskluster
I Postgres termer har vi nu ett enda databaskluster igång. Ett enda databaskluster kan innehålla en eller flera databaser. I det databaskluster som vi nu har finns en databas som heter "postgres". (Det finns också ett par "mall"-databaser som vi kan ignorera för tillfället.)
Ett databaskluster hanteras av en huvudsaklig postgres-process som kallas postmaster .Det skapar olika underordnade processer som antingen utför olika systemuppgifter eller hanterar inkommande klientanslutningar. Ta en titt på de processer som körs för närvarande:
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
Här är postmästarprocessen 4880 och den har gett upphov till 6 barnprocesser som hanterar olika hushållsaktiviteter. Du kan också se platsen för klustret (/var/lib/postgresql/13/main
) och platsen för konfigurationsfilen (/etc/postgresql/13/main/postgresql.conf
).
Ladda om och starta om
Vid olika tillfällen kan du behöva ladda om eller starta om din Postgres-server. Omladdning gör att Postgres granskar sina konfigurationsfiler igen och tillämpar ändringarna. Om det inte görs några ändringar i konfigurationsfilerna händer inget dåligt. Omladdningen stör inte de för närvarande anslutna klienterna. För att ladda om din Postgres-server kan du göra:
sudo systemctl reload postgresql
Vissa konfigurationsändringar träder i kraft först efter att du har startat om servern. Detta är mer störande och kommer att koppla bort alla anslutna klienter. För att starta om kan du:
sudo systemctl restart postgresql
Loggfiler
Som du kan se finns det en systemtjänst som heter postgresql
som du kan använda för att styra postmästaren. Om tjänsten inte startar kan du kontrollera dess status för att söka efter felmeddelanden:
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.
PostgreSQL-servern skriver en loggfil, som du kan kontrollera för mer detaljerade felmeddelanden. Den här filen finns på /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
Ansluta till din Postgres-server
Nu när vi har vår server igång, låt oss försöka ansluta till den. Som standard lyssnar servern endast efter:
- TCP-anslutningar från 127.0.0.1 på port 5432, och
- Unix-domänsockets i /var/run/postgresql
På grund av standardkonfigurationen är det enda sättet att ansluta till servern just nu via Unix-socket från en process som körs som systemanvändaren postgres . Låt oss köra den interaktiva standardklienten psql så här:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=#
Här kör vi psql som systemanvändaren postgres ("sudo -u postgres psql") och ansluter till databasen som heter "postgres" (den sista "postgres" på kommandoraden.) "postgres=#"-prompten indikerar namnet på den för närvarande anslutna databasen ("postgres") och att vi har superanvändarbehörigheter ("#" i motsats till "$").
Anslutningen skedde via Unix-uttag (detta är standardmetoden i psql). Eftersom postgres-användaren som standard inte har något lösenord och standardkonfigurationen kräver lösenordsautentisering för TCP-anslutningar, är det inte möjligt att ansluta över 127.0.0.1:5432 just nu .
Tillåta inkommande anslutningar från ett internt nätverk
Låt oss först ändra konfigurationen för att tillåta anslutningar från ett internt nätverk. Om vi antar att vår servers IP på detta nätverk är 10.1.2.3 kan vi redigera huvudkonfigurationsfilen på /etc/postgresql/13/main/postgresql.conf
och ändra raderna:
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
till:
listen_addresses = 'localhost,10.1.2.3'
Vi måste också berätta för Postgres att använda lösenordsautentisering för anslutningar som kommer in från dessa nätverk. För detta, redigera en annan konfigurationsfil som heter /etc/postgresql/13/main/pg_hba.conf
och ändra raden:
host all all 127.0.0.1/32 md5
till:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.1.0.0/16 scram-sha-256
(Förutsatt att det interna nätverket är 10.1.0.0/16.)
Vi har också ändrat standard md5
metoden till den nyare och säkrarescram-sha-256
. Alla andra förekomster av md5
i filen bör också ersättas med scram-sha-256
. Om din applikation eller databasdrivrutin inte stöder denna metod, fortsätt att använda md5
metod istället.
För att dessa ändringar ska träda i kraft måste du starta om servern:
sudo systemctl restart postgresql
Skapa en vanlig användare och databas
Vi är nästan där!
Vi kan nu skapa en vanlig användare som vår applikation kan ansluta som, och en databas som den har full kontroll över. Anslut som superanvändare postgres lokalt från serverdatorn för att göra detta:
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=#
(Uteslut det första kommandot om du vill använda md5
istället.) Detta skapade en användare som heter alice med lösenordet s3cr3tp@ss . Låt oss också skapa en databas som den här användaren kommer att äga:
postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#
Databasen heter app1 . Sedan alice äger denna databas, alla operationer i databasen (som att skapa tabeller, infoga rader) är tillåtna om applikationen ansluter som användaren alice .
Låt oss försöka ansluta som alice , över nätverket:
~$ 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=>
Häftigt! Vi är nu anslutna till databasen app1 som användaren alice .
Ta bort databaser, säkerhetskopiera och återställa
Här är några knep som kan hjälpa dig när du fortsätter att arbeta med din Postgresserver:
Ta bort en databas
Du kan ta bort databasen du just skapade ("app1"), så här:
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=>
Observera att du först måste byta till en annan databas med kommandot "\c" i psql.
För att skapa en annan databas, eller för att återskapa app1 , anslut som superanvändare och gör "CREATE DATABASE" som tidigare.
Säkerhetskopiera databasen
Det enklaste sättet att säkerhetskopiera data i din databas är att använda pg_dump så här:
alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:
Detta skapar en SQL-fil som heter "backup.sql" som innehåller alla SQL-kommandon som krävs för att återskapa schemat och data i databasen app1 , i textformat. Du kan utföra dessa kommandon i vilken databas som helst, och schemat och data kommer att fyllas i den databasen.
Läs mer om pg_dump här.
Återställa data
SQL-kommandofilen du skapade ovan kan återställas så här:
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..)
Observera att vi återställde schemat och data till en annan databas, app2 . Kommandot "\i" i psql låter dig köra SQL-kommandon från en fil.
Nästa steg
Det finns en hel massa artiklar, handledningar, videor och kurser som hjälper dig att bli mer skicklig med PostgreSQL. Tillbringa dock lite tid, med den officiella dokumentationen här, som ger auktoritativ och omfattande täckning av alla PostgreSQL-funktioner, syntax och medföljande verktyg.