PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Premiers pas avec Postgres 13 sur Ubuntu 20.04

PostgreSQL 13, la dernière version du logiciel de base de données Postgres, est livré avec de nombreuses améliorations sous le capot. Bien qu'il s'agisse du SGBDR open source le plus populaire et le plus polyvalent, il n'est pas le plus facile à configurer et à démarrer. Lisez la suite pour savoir comment démarrer avec la dernière version de Postgres sur la dernière version LTS du serveur Ubuntu.

Installation

Ubuntu 20.04 est livré avec Postgres 12 de son univers dépôt. Depuis que nous voulons la version 13, nous pouvons directement utiliser le dépôt officiel APT du projet PostgreSQL. Ce dépôt contient des binaires pour Ubuntu 20.04, et inclut également des packages pour diverses extensions que vous voudrez peut-être installer plus tard.

Configurons le référentiel comme ceci (notez que "focal" est le nom de code d'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

Nous pouvons maintenant installer le serveur PostgreSQL et d'autres outils de ligne de commande en utilisant :

sudo apt-get install -y postgresql-13

L'installation fait quelques choses :

  • Il installe le serveur PostgreSQL, les utilitaires et un client en ligne de commande appelé psql .
  • Il crée un utilisateur système Linux appelé postgres . Tous les fichiers de données appartiennent à cet utilisateur et tous les processus s'exécutent sous cet utilisateur.
  • Il crée un cluster de bases de données (voir ci-dessous). Dans ce cluster, il crée une base de données, également appelée postgres .
  • Cela crée un utilisateur PostgreSQL (pas l'utilisateur du système Linux), également appelé postgres . Cet utilisateur PostgreSQL a des privilèges de superutilisateur.

Vous pouvez voir que cela commence à devenir confus !

Clusters de bases de données

En termes Postgres, nous avons maintenant un seul cluster de base de données opérationnel. Un cluster de bases de données unique peut contenir une ou plusieurs bases de données. Dans le cluster de base de données que nous avons maintenant, il y a une base de données appelée "postgres". (Il existe également quelques bases de données "modèles" que nous pouvons ignorer pour l'instant.)

Un cluster de base de données est géré par un processus postgres principal appelé le postmaster .Il génère divers processus enfants qui exécutent diverses tâches système ou gèrent les connexions client entrantes. Jetez un œil aux processus en cours d'exécution :

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

Ici, le processus postmaster est 4880 et il a engendré 6 processus enfants qui gèrent diverses activités de maintenance. Vous pouvez également voir l'emplacement du cluster (/var/lib/postgresql/13/main ) et l'emplacement du fichier de configuration (/etc/postgresql/13/main/postgresql.conf ).

Rechargement et redémarrage

À divers moments, vous devrez peut-être recharger ou redémarrer votre serveur Postgres. Le rechargement oblige Postgres à réexaminer ses fichiers de configuration et à appliquer les modifications. Si aucune modification n'est apportée aux fichiers de configuration, rien de grave ne se produit. Le rechargement ne perturbe pas les clients actuellement connectés. Pour recharger votre serveur Postgres, vous pouvez faire :

sudo systemctl reload postgresql

Certaines modifications de configuration ne prendront effet qu'après le redémarrage du serveur. Ceci est plus perturbateur et déconnectera tous les clients connectés. Pour redémarrer,vous pouvez :

sudo systemctl restart postgresql

Fichiers journaux

Comme vous pouvez le voir, il existe un service systemd appelé postgresql que vous pouvez utiliser pour contrôler le postmaster. Si le service ne démarre pas, vous pouvez vérifier son état pour vérifier les messages d'erreur :

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.

Le serveur PostgreSQL écrit un fichier journal, que vous pouvez vérifier pour des messages d'erreur plus détaillés. Ce fichier se trouve dans /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

Connexion à votre serveur Postgres

Maintenant que notre serveur est opérationnel, essayons de nous y connecter. Par défaut, le serveur n'écoute que :

  • Les connexions TCP de 127.0.0.1 sur le port 5432, et
  • Sockets de domaine Unix dans /var/run/postgresql

En raison de la configuration par défaut, la seule façon de se connecter au serveur actuellement est via le socket Unix à partir d'un processus qui s'exécute en tant qu'utilisateur système postgres . Lançons le client interactif standard psql comme ceci :

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

postgres=#

Ici, nous exécutons psql en tant qu'utilisateur système postgres ("sudo -u postgres psql") et nous nous connectons à la base de données appelée "postgres" (le dernier "postgres" sur la ligne de commande.) L'invite "postgres=#" indique le nom de la base de données actuellement connectée ("postgres") et que nous avons des privilèges de superutilisateur ("#" par opposition à "$").

La connexion s'est produite via des sockets Unix (c'est la méthode par défaut dans psql). Puisque par défaut l'utilisateur postgres n'a pas de mot de passe et que la configuration par défaut nécessite une authentification par mot de passe pour les connexions TCP, il n'est pas possible de se connecter sur 127.0.0.1:5432 pour le moment .

Autoriser les connexions entrantes depuis un réseau interne

Modifions d'abord la configuration pour autoriser les connexions à partir d'un réseau interne. En supposant que l'IP de notre serveur sur ce réseau est 10.1.2.3, nous pouvons modifier le fichier de configuration principal à /etc/postgresql/13/main/postgresql.conf etchangez les lignes :

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

à :

listen_addresses = 'localhost,10.1.2.3'

Nous devons également indiquer à Postgres d'utiliser l'authentification par mot de passe pour les connexions provenant de ces réseaux. Pour cela, éditez un autre fichier de configuration appelé /etc/postgresql/13/main/pg_hba.conf et changez la ligne :

host    all             all             127.0.0.1/32            md5

à :

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

(En supposant que le réseau interne est 10.1.0.0/16.)

Nous avons également modifié le md5 par défaut méthode vers la méthode scram-sha-256 plus récente et plus sécurisée . Toutes les autres occurrences de md5 dans le fichier doit également être remplacé par scram-sha-256 . Si votre application ou votre pilote de base de données ne prend pas en charge cette méthode, continuez à utiliser le md5 méthode à la place.

Pour que ces modifications prennent effet, vous devez redémarrer le serveur :

sudo systemctl restart postgresql

Création d'un utilisateur régulier et d'une base de données

Nous y sommes presque !

Nous pouvons maintenant créer un utilisateur régulier auquel notre application peut se connecter et une base de données sur laquelle elle a un contrôle total. Connectez-vous en tant que superutilisateur postgres localement depuis la machine serveur pour faire ceci :

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

(Omettez la première commande si vous souhaitez utiliser md5 à la place.) Cela a créé un utilisateur appelé alice avec le mot de passe s3cr3tp@ss . Créons également une base de données dont cet utilisateur sera propriétaire :

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

La base de données s'appelle app1 . Depuis alice possède cette base de données, toutes les opérations dans la base de données (comme la création de tables, l'insertion de lignes) sont autorisées si l'application se connecte en tant qu'utilisateur alice .

Essayons de nous connecter en tant que alice , sur le réseau :

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

Frais! Nous sommes maintenant connectés à la base de données app1 en tant qu'utilisateur alice .

Suppression de bases de données, sauvegarde et restauration

Voici quelques astuces qui peuvent vous aider à continuer à travailler avec votre serveur Postgres :

Supprimer une base de données

Vous pouvez supprimer la base de données que vous venez de créer ("app1"), comme ceci :

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

Notez que vous devez d'abord basculer vers une autre base de données en utilisant la commande "\c" de psql.

Pour créer une autre base de données ou pour recréer app1 , connectez-vous en tant que superutilisateur et faites "CRÉER UNE BASE DE DONNÉES" comme avant.

Sauvegarder la base de données

Le moyen le plus simple de sauvegarder les données de votre base de données consiste à utiliser pg_dump comme ceci :

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

Cela crée un fichier SQL appelé "backup.sql" qui contient toutes les commandes SQL nécessaires pour recréer le schéma et les données dans la base de données app1 , au format texte. Vous pouvez exécuter ces commandes dans n'importe quelle base de données, et le schéma et les données seront remplis dans cette base de données.

En savoir plus sur pg_dump ici.

Restauration des données

Le fichier de commandes SQL que vous avez créé ci-dessus peut être restauré comme suit :

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

Notez que nous avons restauré le schéma et les données dans une autre base de données, app2 . La commande "\i" de psql permet d'exécuter les commandes SQL à partir d'un fichier.

Étapes suivantes

Il existe tout un tas d'articles, de tutoriels, de vidéos et de cours pour vous aider à mieux maîtriser PostgreSQL. Passez cependant un peu de temps avec la documentation officielle ici, qui fournit une couverture complète et faisant autorité de toutes les fonctionnalités, de la syntaxe et des utilitaires PostgreSQL.