sql >> Databasteknik >  >> RDS >> PostgreSQL

Komma igång med Postgres 13 på Ubuntu 20.04

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.


  1. Oracle infoga från välj i tabell med fler kolumner

  2. Fatalt fel:Anrop till odefinierad funktion session_register()

  3. En snabb titt på SQL Servers numeriska funktioner

  4. Hur kontrollerar man resultatet av SSIS-paketjobbet efter att det har slutfört sin körning?