sql >> Database teknologi >  >> RDS >> PostgreSQL

Kom godt i gang med Postgres 13 på Ubuntu 20.04

PostgreSQL 13, den seneste udgivelse af Postgres-databasesoftwaren, kommer med mange forbedringer under hætten. Selvom den er den mest populære og alsidige open source RDBMS, er den ikke den nemmeste at konfigurere og komme i gang. Læs videre for at lære, hvordan du kan komme i gang med den seneste version af Postgres på den seneste LTS-version af Ubuntuserveren.

Installation

Ubuntu 20.04 kommer med Postgres 12 fra dets univers depot. Da vi ønsker version 13, kan vi direkte bruge PostgreSQL-projektets officielle APT-lager. Dette lager indeholder binære filer til Ubuntu 20.04 og inkluderer også pakker til forskellige udvidelser, som du måske vil installere senere.

Lad os opsætte lageret sådan her (bemærk, at "focal" er kodenavnet for 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 installere PostgreSQL-serveren og andre kommandolinjeværktøjer ved hjælp af:

sudo apt-get install -y postgresql-13

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 en databaseklynge (se nedenunder). I denne klynge opretter den en database, også kaldet postgres .
  • Det opretter én PostgreSQL-bruger (ikke Linux-systembrugeren), også kaldetpostgres . Denne PostgreSQL-bruger har superbrugerrettigheder.

Du kan se, at dette begynder at blive forvirrende!

Databaseklynger

I Postgres-termer har vi nu en enkelt databaseklynge oppe at køre. En enkelt databaseklynge kan indeholde en eller flere databaser. I den databaseklynge, som vi nu har, er der en database kaldet "postgres". (Der er også et par "skabelon"-databaser, som vi kan ignorere indtil videre.)

En databaseklynge administreres af en hovedpostgres-proces kaldet postmaster .Det afføder forskellige underordnede processer, der enten udfører forskellige systemopgaver eller håndterer indgående klientforbindelser. Tag et kig på de aktuelt kørende processer:

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

Her er postmesterprocessen 4880, og den har affødt 6 underordnede processer, der håndterer forskellige husholdningsaktiviteter. Du kan også se placeringen af ​​klyngen (/var/lib/postgresql/13/main ) og placeringen af ​​konfigurationsfilen (/etc/postgresql/13/main/postgresql.conf ).

Genindlæsning og genstart

På forskellige tidspunkter skal du muligvis genindlæse eller genstart din Postgres-server. Genindlæsning får Postgres til at revurdere sine konfigurationsfiler og anvende ændringerne. Hvis der ikke er nogen ændringer i konfigurationsfilerne, sker der ikke noget galt. Genindlæsning forstyrrer ikke de aktuelt tilsluttede klienter. For at genindlæse din Postgres-server kan du gøre:

sudo systemctl reload postgresql

Nogle konfigurationsændringer træder først i kraft, når du genstarter serveren. Dette er mere forstyrrende og vil afbryde forbindelsen til alle tilsluttede klienter. For at genstarte kan du:

sudo systemctl restart postgresql

Logfiler

Som du kan se, er der en systemd service kaldet postgresql som du kan bruge til at styre postmesteren. Hvis tjenesten ikke starter, kan du tjekke dens status for at tjekke for fejlmeddelelser:

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-serveren skriver en logfil, som du kan tjekke for mere detaljerede fejlmeddelelser. Denne fil er placeret 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

Opretter forbindelse til din Postgres-server

Nu hvor vi har vores server oppe at køre, lad os prøve at oprette forbindelse til den. Som standard lytter serveren kun efter:

  • TCP-forbindelser fra 127.0.0.1 på port 5432, og
  • Unix-domæne-sockets i /var/run/postgresql

På grund af standardkonfigurationen er den eneste måde at oprette forbindelse til serveren på lige nu via Unix-socket fra en proces, der kører som systembrugeren postgres . Lad os køre den interaktive standardklient psql sådan her:

alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.

postgres=#

Her kører vi psql som systembrugeren postgres ("sudo -u postgres psql") og forbinder til databasen kaldet "postgres" (den sidste "postgres" på kommandolinjen). "postgres=#"-prompten angiver navnet på den aktuelt tilsluttede database ("postgres"), og at vi har superbrugerrettigheder ("#" i modsætning til "$").

Forbindelsen skete via Unix-stik (dette er standardmetoden i psql). Da postgres-brugeren som standard ikke har en adgangskode, og standardkonfigurationen kræver adgangskodegodkendelse til TCP-forbindelser, er det ikke muligt at oprette forbindelse over 127.0.0.1:5432 lige nu .

Tilladelse af indgående forbindelser fra et internt netværk

Lad os først ændre konfigurationen for at tillade forbindelser fra et internt netværk. Forudsat at vores servers IP på dette netværk er 10.1.2.3, kan vi redigere hovedkonfigurationsfilen på /etc/postgresql/13/main/postgresql.conf og skift linjerne:

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all

til:

listen_addresses = 'localhost,10.1.2.3'

Vi skal også fortælle Postgres at bruge adgangskodegodkendelse til forbindelser, der kommer ind fra disse netværk. Til dette skal du redigere en anden konfigurationsfil kaldet /etc/postgresql/13/main/pg_hba.conf og ændre linjen:

host    all             all             127.0.0.1/32            md5

til:

host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             10.1.0.0/16             scram-sha-256

(Forudsat at det interne netværk er 10.1.0.0/16.)

Vi har også ændret standard md5 metode til den nyere og mere sikrescram-sha-256 . Alle andre forekomster af md5 i filen skal også erstattes med scram-sha-256 . Hvis dit program eller din databasedriver ikke understøtter denne metode, skal du fortsætte med at bruge md5 metode i stedet.

For at disse ændringer kan træde i kraft, skal du genstarte serveren:

sudo systemctl restart postgresql

Oprettelse af en almindelig bruger og database

Vi er der næsten!

Vi kan nu oprette en almindelig bruger, som vores applikation kan forbinde som, og en database, som den har fuld kontrol over. Tilslut som superbrugeren postgres lokalt fra servermaskinen for at gøre dette:

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=#

(Udlad den første kommando, hvis du vil bruge md5 i stedet.) Dette skabte en bruger kaldet alice med adgangskoden s3cr3tp@ss . Lad os også oprette en database, som denne bruger vil eje:

postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#

Databasen hedder app1 . Siden alice ejer denne database, er alle operationer i databasen (såsom oprettelse af tabeller, indsættelse af rækker) tilladt, hvis applikationen forbinder som brugeren alice .

Lad os prøve at oprette forbindelse som alice , over netværket:

~$ 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=>

Fedt nok! Vi er nu forbundet til databasen app1 som brugeren alice .

Sletning af databaser, sikkerhedskopiering og gendannelse

Her er et par tricks, der kan hjælpe, mens du fortsætter med at arbejde med din Postgresserver:

Sletning af en database

Du kan slette den database, du lige har oprettet ("app1"), sådan her:

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=>

Bemærk, at du først skal skifte til en anden database ved at bruge kommandoen "\c" i psql.

For at oprette en anden database eller for at genskabe app1 , tilslut som superbruger og gør "CREATE DATABASE" som før.

Sikkerhedskopier databasen

Den nemmeste måde at sikkerhedskopiere dataene i din database på er at bruge pg_dump sådan her:

alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:

Dette opretter en SQL-fil kaldet "backup.sql", der indeholder alle de SQL-kommandoer, der kræves for at genskabe skemaet og dataene i databasen app1 , i tekstformat. Du kan udføre disse kommandoer i enhver database, og skemaet og dataene bliver udfyldt i den database.

Læs mere om pg_dump her.

Gendannelse af data

SQL-kommandofilen, du oprettede ovenfor, kan gendannes sådan:

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..)

Bemærk, at vi gendannede skemaet og dataene i en anden database, app2 . Kommandoen "\i" i psql lader dig udføre SQL-kommandoer fra en fil.

Næste trin

Der er en hel masse artikler, tutorials, videoer og kurser derude for at hjælpe dig med at blive dygtigere med PostgreSQL. Brug dog lidt tid med den officielle dokumentation her, som giver autoritativ og omfattende dækning af alle PostgreSQL-funktioner, syntaks og medfølgende hjælpeprogrammer.


  1. Tjek, om MySQL-tabel eksisterer uden at bruge vælg fra syntaks?

  2. MySQL-funktion til at finde antallet af arbejdsdage mellem to datoer

  3. PostgreSQL FEJL:annullerer erklæring på grund af konflikt med gendannelse

  4. MariaDB GROUP_CONCAT()