PostgreSQL 13, l'ultima versione del software di database Postgres, include molti miglioramenti nascosti. Pur essendo l'RDBMS open source più popolare e versatile in circolazione, non è il più facile da configurare e iniziare. Continua a leggere per scoprire come iniziare con l'ultima versione di Postgres sull'ultima versione LTS del server Ubuntu.
Installazione
Ubuntu 20.04 viene fornito con Postgres 12 dal suo universo deposito. Dal momento che vogliamo la versione 13, possiamo utilizzare direttamente il repository APT ufficiale del progetto PostgreSQL. Questo repository contiene binari per Ubuntu 20.04 e include anche pacchetti per varie estensioni che potresti voler installare in seguito.
Impostiamo il repository in questo modo (nota che "focal" è il nome in codice di 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
Ora possiamo installare il server PostgreSQL e altri strumenti da riga di comando usando:
sudo apt-get install -y postgresql-13
L'installazione fa alcune cose:
- Installa il server PostgreSQL, le utility e un client a riga di comando chiamatopsql .
- Crea un utente di sistema Linux chiamato postgres . Tutti i file di dati sono di proprietà di questo utente e tutti i processi vengono eseguiti come questo utente.
- Crea un cluster di database (vedi sotto). In questo cluster crea un database, chiamato anche postgres .
- Crea un utente PostgreSQL (non l'utente del sistema Linux), chiamato anchepostgres . Questo utente PostgreSQL ha i privilegi di superutente.
Puoi vedere che questo sta cominciando a creare confusione!
Cluster di database
In termini di Postgres, ora abbiamo un unico cluster di database attivo e funzionante. Un singolo cluster di database può contenere uno o più database. Nel databasecluster che abbiamo ora, c'è un database chiamato "postgres". (Ci sono anche un paio di database "modello" che possiamo ignorare per ora.)
Un cluster di database è gestito da un processo postgres principale chiamato postmaster .Genera vari processi figlio che eseguono varie attività di sistema o gestiscono le connessioni client in entrata. Dai un'occhiata ai processi attualmente in esecuzione:
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
Qui il processo postmaster è 4880 e ha generato 6 processi figlio che gestiscono varie attività di pulizia. Puoi anche vedere la posizione del cluster (/var/lib/postgresql/13/main
) e la posizione del file di configurazione (/etc/postgresql/13/main/postgresql.conf
).
Ricaricamento e riavvio
In vari momenti, potrebbe essere necessario ricaricare o riavvia il tuo server Postgres. Il ricaricamento fa sì che Postgres riesamini i suoi file di configurazione e applichi le modifiche. Se non ci sono modifiche ai file di configurazione, non succede nulla di male. Il ricaricamento non disturba i client attualmente connessi. Per ricaricare il tuo server Postgres, puoi fare:
sudo systemctl reload postgresql
Alcune modifiche alla configurazione avranno effetto solo dopo il riavvio del server. Ciò è più dirompente e disconnetterà tutti i client connessi. Per riavviare, puoi:
sudo systemctl restart postgresql
File di registro
Come puoi vedere, esiste un servizio systemd chiamato postgresql
che puoi usare per controllare il postmaster. Se il servizio non si avvia, puoi verificarne lo stato per verificare la presenza di messaggi di errore:
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.
Il server PostgreSQL scrive un file di registro, che puoi controllare per messaggi di errore più dettagliati. Questo file si trova in /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
Connessione al tuo server Postgres
Ora che abbiamo il nostro server attivo e funzionante, proviamo a connetterci ad esso. Per impostazione predefinita, il server è in ascolto solo per:
- Connessioni TCP da 127.0.0.1 sulla porta 5432 e
- Socket di dominio Unix in /var/run/postgresql
A causa della configurazione predefinita, l'unico modo per connettersi al server in questo momento è tramite il socket Unix da un processo che è in esecuzione come utente di sistema postgres . Eseguiamo il client interattivo standard psql così:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=#
Qui stiamo eseguendo psql come utente di sistema postgres ("sudo -u postgres psql") e ci stiamo connettendo al database chiamato "postgres" (l'ultimo "postgres" sulla riga di comando.) Il prompt "postgres=#" indica il nome del database attualmente connesso ("postgres") e che disponiamo dei privilegi di superutente ("#" anziché "$").
La connessione è avvenuta tramite socket Unix (questo è il metodo predefinito in psql). Poiché per impostazione predefinita l'utente postgres non ha una password e la configurazione predefinita richiede l'autenticazione della password per le connessioni TCP, non è possibile connettersi su 127.0.0.1:5432 in questo momento .
Consenti connessioni in entrata da una rete interna
Innanzitutto modifichiamo la configurazione per consentire le connessioni da una rete interna. Supponendo che l'IP del nostro server su questa rete sia 10.1.2.3, possiamo modificare il file di configurazione principale in /etc/postgresql/13/main/postgresql.conf
e cambia le righe:
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
a:
listen_addresses = 'localhost,10.1.2.3'
Dobbiamo anche dire a Postgres di utilizzare l'autenticazione della password per le connessioni in arrivo da queste reti. Per questo, modifica un altro file di configurazione chiamato /etc/postgresql/13/main/pg_hba.conf
e cambia la riga:
host all all 127.0.0.1/32 md5
a:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.1.0.0/16 scram-sha-256
(Supponendo che la rete interna sia 10.1.0.0/16.)
Abbiamo anche cambiato il md5
predefinito metodo al più nuovo e più sicuroscram-sha-256
. Tutte le altre occorrenze di md5
nel file dovrebbe anche essere sostituito con scram-sha-256
. Se l'applicazione o il driver del database non supporta questo metodo, continua a utilizzare md5
metodo invece.
Affinché queste modifiche abbiano effetto, è necessario riavviare il server:
sudo systemctl restart postgresql
Creazione di un utente regolare e di un database
Ci siamo quasi!
Ora possiamo creare un utente normale a cui la nostra applicazione può connettersi e un database su cui ha il pieno controllo. Collegati come superutente postgres localmente dalla macchina server per farlo:
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=#
(Ometti il primo comando se vuoi usare md5
invece.) Questo ha creato un utente chiamato alice con la password s3cr3tp@ss . Creiamo anche un database di cui questo utente sarà proprietario:
postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#
Il database si chiama app1 . Da alice possiede questo database, tutte le operazioni all'interno del database (come la creazione di tabelle, l'inserimento di righe) sono consentite se l'applicazione si connette come l'utente alice .
Proviamo a connetterci come alice , in rete:
~$ 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=>
Freddo! Ora siamo collegati al database app1 come utente alice .
Eliminazione di database, backup e ripristino
Ecco alcuni trucchi che possono aiutarti mentre continui a lavorare con Postgresserver:
Eliminazione di un database
Puoi eliminare il database che hai appena creato ("app1"), in questo modo:
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=>
Nota che devi prima passare a un altro database usando il comando "\c" di psql.
Per creare un altro database o per ricreare app1 , connettiti come superutente ed esegui “CREA DATABASE” come prima.
Esegui il backup del database
Il modo più semplice per eseguire il backup dei dati nel database è utilizzare pg_dump così:
alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:
Questo crea un file SQL chiamato "backup.sql" che contiene tutti i comandi SQL necessari per ricreare lo schema e i dati nel database app1 , in formato testo. Puoi eseguire questi comandi in qualsiasi database e lo schema e i dati verranno inseriti in quel database.
Leggi di più su pg_dump qui.
Ripristino dati
Il file di comando SQL che hai creato sopra può essere ripristinato in questo modo:
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..)
Tieni presente che abbiamo ripristinato lo schema e i dati in un altro database, app2 . Il comando “\i” di psql ti consente di eseguire i comandi SQL da un file.
Passaggi successivi
Ci sono un sacco di articoli, tutorial, video e corsi che ti aiutano a diventare più esperto con PostgreSQL. Trascorri un po' di tempo, tuttavia, con la documentazione ufficiale qui, che fornisce una copertura ampia e autorevole di tutte le funzionalità, la sintassi e le utilità in bundle di PostgreSQL.