Selvom PostgreSQL er et moderne og alsidigt RDBMS, er det ikke det nemmeste af beasts at konfigurere og komme i gang, mens du søger at udvikle en applikation. Læs videre for at lære om, hvordan du kan komme i gang med den seneste version af PostgreSQL på LTS-versionen af Ubuntu.
Installation
Ubuntu 18.04 kommer med PostgreSQL 10, men vi kan i stedet bruge APT-lageret, der hostes af PostgreSQL-teamet til at installere den seneste version, PostgreSQL 11.
Du kan konfigurere depotet ved hjælp af disse kommandoer:
# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ bionic-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
Og installer derefter selve softwaren ved hjælp af:
sudo apt-get install postgresql-11
Installationen gør et par ting:
- Den installerer PostgreSQL-serveren, hjælpeprogrammer og en kommandolinjeklient kaldetpsql .
- Den opretter en Linux-systembruger kaldet postgres . Alle datafiler ejes af denne bruger, og alle processer kører som denne bruger.
- Den opretter én database, også kaldet postgres .
- Det opretter én PostgreSQL-bruger (ikke Linux-systembrugeren), også kaldetpostgres .
Du kan se, at dette begynder at blive forvirrende!
Databaseklynger
Din nyligt installerede PostgreSQL-server består af et sæt processer, der styrer det, der er kendt som en "databaseklynge". Du kan se processerne her:
alice@devbox:~$ ps axfww | grep postgres
4737 ? S 0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
4749 ? Ss 0:00 \_ postgres: 11/main: checkpointer
4750 ? Ss 0:00 \_ postgres: 11/main: background writer
4751 ? Ss 0:00 \_ postgres: 11/main: walwriter
4752 ? Ss 0:00 \_ postgres: 11/main: autovacuum launcher
4753 ? Ss 0:00 \_ postgres: 11/main: stats collector
4754 ? Ss 0:00 \_ postgres: 11/main: logical replication launcher
Hovedprocessen (her med PID 4737) er hovedprocessen, som yderligere afføder de underordnede processer – dette kaldes konventionelt "postmaster"-processen.
PostgreSQL's brug af udtrykket "klynge" går forud for moderne fancy distributedclustering-jargon - her betyder det blot et sæt databaser, der administreres på en enkelt maskine af en enkelt postmaster. Læs mere om klynger her.
En klynge indeholder blandt andet databaser (for nu har vi kun én, "postgres") og PostgreSQL-brugere (igen, kun én, også kaldet "postgres"). Bare så du ved det, er klyngen forbundet med en hel masse datafiler, som alle lever under én enkelt mappe – i dette tilfælde under/var/lib/postgresql/11/main . Lagde du mærke til denne sti i postmaster-kommandolinjen ovenfor?
Når din app, eller psql, opretter forbindelse til Postgres, skal den gøre det i konteksten af en PostgreSQL-bruger. Der er altid en PostgreSQL-bruger tilknyttet en forbindelse. Men som du måske har gættet nu, kan en PostgreSQL-bruger muligvis svare til en systembruger.
Systembrugere og PostgreSQL-brugere
PostgreSQL-brugere kan oprettes ved hjælp af SQL-kommandoer som CREATE ROLEeller medfølgende værktøjer som createdb.
Når en applikation forsøger at oprette forbindelse til Postgres, skal den angive aPostgreSQL-brugernavn. Lad os se, hvad der sker, når du starter en PostgreSQLclient som psql:
alice@devbox:~$ psql
psql: FATAL: role "alice" does not exist
Her er "alice" dit Linux-systembrugernavn. psql tager dette navn og bruger det som Postgres brugernavn. En rolle (roller er et slags generisk navn for "bruger" eller "gruppe", BTW) med det navn eksisterer ikke, hvilket er det, Postgres klager over.
Vi ved, at der er en rolle ved navnet "postgres", så lad os prøve det. Vi kan bruge parameteren "-U" i psql til at specificere brugernavnet:
alice@devbox:~$ psql -U postgres
psql: FATAL: Peer authentication failed for user "postgres"
OK, vi kommer tættere på - rollen/brugeren "postgres" eksisterer, men "peeautentificering" er mislykket. Hvad er denne "peer-godkendelse"?
Peer- og adgangskodegodkendelse
PostgreSQL-klienter som psql eller din app kan oprette forbindelse til PostgreSQL-serveren via en af disse IPC-mekanismer:
- Unix-domæne-sockets
- TCP-stik
I modsætning til TCP-sockets giver Unix-domænesockets mulighed for at validere klientforbindelsens systembruger-id. Postgres-serveren kan undersøge en indgående forbindelse over en Unix-domæne-socket og bestemme klientens systembruger-ID og derefter beslutte, om den skal give den adgang eller ej.
Som standard lytter din server kun efter forbindelser over unix-domæne-sockets og ikke TCP/IP.
Lad os se, hvad der sker, hvis vi prøver at starte psql som systembrugeren postgres:
alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.
postgres=#
Det virkede! (Brug "\q", "\quit" eller ^D
for at afslutte psql, BTW.)
I peer-godkendelse, hvis klientforbindelsen er oprettet ved hjælp af en Unix-domænesocket, og klientprocessen har det samme systembrugernavn som den PostgreSQLuser, den forsøger at oprette forbindelse som, anses godkendelsen for at være vellykket.
PostgreSQL-brugere kan også valgfrit tildeles en adgangskode, og du kan bede PostgreSQL om at validere indgående forbindelser ved hjælp af adgangskoden. Men hvordan? Det er den næste brik i puslespillet.
pg_hba.conf
Det er nu tid til at åbne den (in)berømte pg_hba.conf-konfigurationsfil, som findes på /etc/postgresql/11/main/pg_hba.conf
:
sudo vim /etc/postgresql/11/main/pg_hba.conf
HBA står for værtsbaseret godkendelse. Grundlæggende bruges denne fil til at kontrollere, hvordan PostgreSQL-brugere autentificeres. Denne fil er sandsynligvis den mest ikke-intuitive del af PostgreSQL-indlæringskurven. Referencedokumentationen er her, du bør læse den senere.
Den første (ikke-kommentar) linje her er:
local all postgres peer
som fortæller Postgres at acceptere "lokale" (unix-domæne) forbindelser til "alle" databaser, autentificere som bruger "postgres" ved hjælp af "peer"-godkendelse. Dette er grunden til, at forbindelse som systembrugerens "postgres" fungerer lige uden for boksen.
Rækkefølgen af linjer i denne fil er vigtig, den første matchende linje vinder. Lad os se en anden linje:
host all all 127.0.0.1/32 md5
Denne linje giver "alle" brugere mulighed for at logge ind ved hjælp af TCP/IP ("vært") fra localhost ("127.0.0.1/32") til "alle" databaser, hvis det lykkes dem med adgangskodegodkendelse ved hjælp af "md5"-metoden.
Der er flere metoder til autentificering af adgangskode (md5, scram-sha-256, gss, ldap, …), end vi kan dække, så lad os bare vende tilbage til enklere eksempler.
Men først skal vi sikre os, at PostgreSQL også accepterer TCP/IP-forbindelser. Til det skal vi redigere hovedkonfigurationsfilen.
postgresql.conf
Filen /etc/postgresql/11/main/postgresql.conf er hovedkonfigurationsfilen for din PostgreSQL-klynge. Denne fil indeholder et parti af indstillinger og at forstå, hvad alle disse betyder, er slet ikke nogen nem opgave. Lad os nu se den allerførste indstilling:
#listen_addresses = 'localhost'
Denne linje er kommenteret som standard, lad os fjerne kommentarer for at få den til at læse:
listen_addresses = 'localhost'
Dette vil lade PostgreSQL lytte efter indgående TCP/IP-forbindelser på localhost, port 5432 (standard). Gem ændringerne (du skal være "root" for at gøre dette), og genstart Postgres-serveren for at ændringerne træder i kraft:
sudo systemctl restart postgresql
(Bemærk, at nogle for de fleste indstillingsændringer skal du bare "genindlæse", ikke "genstarte", men dette kræver en "genstart").
Nu kan vi se Postgres lytte på port 5432, bundet til 127.0.0.1:
alice@devbox:~$ sudo netstat -tnlp | grep 5432
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 8408/postgres
Lad os nu konfigurere en ny bruger og database til brug for en app.
App-opsætning
Lad os oprette forbindelse som superbrugeren "postgres" for at foretage ændringerne:
alice@devbox:~$ sudo -u postgres psql
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
Type "help" for help.
postgres=# create user myapp_user password 's3cr3t';
CREATE ROLE
postgres=# create database myapp owner myapp_user;
CREATE DATABASE
postgres=#
Vi har nu oprettet en database kaldet myapp
og en bruger kaldet myapp_user
, med adgangskoden s3cr3t
. Databasen er tom og ejes af brugerenmyapp_user
, hvilket betyder, at ved at oprette forbindelse som myapp_user
klienten vil være i stand til at udføre næsten alle DDL/DML-kommandoer.
Lad os oprette forbindelse til appdatabasen som denne appbruger nu:
alice@devbox:~$ psql -h 127.0.0.1 -d myapp -U myapp_user
Password for user myapp_user:
psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
myapp=>
Det virkede! Du er nu forbundet til "myapp" (se prompten), ved hjælp af SSL over en TCP/IP-forbindelse til 127.0.0.1. Bemærk, at vi også specificerede databasenavnet på kommandolinjen for psql. Af historiske årsager, hvis dette udelades, antages databasenavnet også at være det samme som systemets brugernavn ("alice" her), hvilket ikke er det, vi ønsker. PostgreSQL-brugernavnet er også angivet(“-U myapp_user”).
Hvis du har brug for at oprette forbindelse fra andre maskiner, skal du redigere pg_hba.conf
for at tilføje linjer som sådan:
# existing entry, allows connections from localhost
host all all 127.0.0.1/32 md5
# new entry to allow connections from 10.1.2.0/24 subnet,
# only to myapp database for myapp_user
host myapp myapp_user 10.1.2.0/24 md5
og genindlæs PostgreSQL ("sudo systemctl genindlæs postgresql") for at ændringerne træder i kraft.
Med dette på plads kan du nu bruge databaseforbindelsesstrenge som disse i dine apps:
# URL format
postgresql://myapp_user:[email protected]/myapp
# connection string format
host=127.0.0.1 user=myapp_user dbname=myapp password=s3cr3t
Klar!
Dette skulle give dig opsætning med en dedikeret database og bruger til din app. Din app-udviklingsramme (som Django, Drupal osv.) bør være i stand til at oprette objekter (som tabeller, visninger) og administrere dataene i denne database.