relecture

This commit is contained in:
Gregory Colpart 2023-07-28 23:17:00 +02:00
parent a7e64e41dd
commit c1a79da341

View file

@ -6,38 +6,39 @@ categories: databases
* Documentation : <https://www.postgresql.org/docs/11/>
* Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/show/postgresql>
* The Internals of PostgreSQL : <http://www.interdb.jp/pg/>
* Statut de cette page : prod / bullseye
[PostgreSQL](https://www.postgresql.org/) est un système de gestion de base de données relationnelle et objet. PostgreSQL met l'accent sur le respect du standard SQL et l'intégrité des données, notamment avec le mécanisme des journaux de transactions (WAL : Write Ahead Logging) écrits sur le disque avant un enregistrement réel dans les fichiers de base de données.
# Installation
## Installation
~~~
# dpkg-reconfigure locales
# apt install postgresql
# /usr/lib/postgresql/11/bin/postgres -V
postgres (PostgreSQL) 11.5 (Debian 11.5-1+deb10u1)
# /usr/lib/postgresql/13/bin/postgres -V
postgres (PostgreSQL) 13.11 (Debian 13.11-0+deb11u1)
# systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Main PID: 5338 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 4915)
Memory: 0B
CPU: 0
CGroup: /system.slice/postgresql.service
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Fri 2023-07-28 23:08:42 CEST; 54s ago
Main PID: 523655 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 18776)
Memory: 0B
CPU: 0
CGroup: /system.slice/postgresql.service
# pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
11 main 5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
13 main 5432 online postgres /var/lib/postgresql/13/main /var/log/postgresql/postgresql-13-main.log
~~~
> *Note* : il faut s'assurer d'avoir configuré sa locale système `dpkg-reconfigure locales` avant installation car l'initialisation des bases de données est faite avec la locale du système.
## Installation via apt.postgresql.org
### Installation via apt.postgresql.org
Le dépôt **apt.postgresql.org** permet d'installer des versions différentes de PostgreSQL, ainsi que plusieurs extensions. C'est maintenu par le *PostgreSQL Global Development Group (PGDG)* qui rassemble plusieurs développeurs Debian.
@ -74,9 +75,9 @@ Ver Cluster Port Status Owner Data directory Log file
~~~
# Administration basique
## Administration basique
## Lister les requêtes actives
### Lister les requêtes actives
Pour PostgreSQL >= 9.2 :
@ -98,8 +99,7 @@ $ psql
postgres=# SELECT * FROM pg_stat_activity WHERE current_query!='<IDLE>';
~~~
## psql
### psql
Voici quelques astuces utilisables en ligne de commande `psql` :
@ -114,8 +114,7 @@ postgres=# \timing on : affiche le temps d'exécution des requêtes
postgres=# \! commande : permet dexécuter des commandes shell, ex: \! mkdir /home/foo/bar
~~~
## pg_top
### pg_top
~~~
# apt install ptop
@ -155,7 +154,7 @@ u - display processes for only one user (+ selects all users)
~~~
# Configuration
## Configuration
Fichiers de configuration :
@ -180,8 +179,7 @@ On verra dans ce cas les changements dans les logs :
2016-12-20 17:02:58 CET [13555]: [3-1] user=,db= LOG: parameter "log_temp_files" changed to "6MB"
~~~
## Instances PostgreSQL
### Instances PostgreSQL
Une surcouche Debian permet de gérer simplement plusieurs versions et plusieurs instances d'une même version de PostgreSQL. Cela permet entre autre de faciliter les migrations d'une version majeure à une autre.
@ -224,7 +222,7 @@ On peut remarquer que toute l'arborescence est organisée en fonction des versio
* etc…
## pgpass
### pgpass
Pour se connecter plus facilement à postgresql (avec `psql` mais aussi `pgdump` etc), on peut utiliser le fichier `~/.pgpass` avec comme format :
@ -234,8 +232,7 @@ hostname:port:database:username:password
> *Note* : Ce fichier doit avoir des droits en _600_ et on peux utilisé des wilcards '*' pour autorisés le ou les champs souhaitez.
## Fichier .pg_service.conf
### Fichier .pg_service.conf
Pour se connecter a différentes instances postgresql, en local ou distante, à la racine de l'utilisateur postgres, créer un fichier .pg_service.conf comme ceci :
@ -248,15 +245,14 @@ user=role_pg
password=bar
~~~
## Log des requêtes lentes / slow queries
### Log des requêtes lentes / slow queries
Il n'y a pas de fichier de log séparé pour logger les requêtes lentes, elles sont mises dans les logs principaux.
Il faut définir la variable `log_min_duration_statement`, par exemple à `1s`.
# Gestion des utilisateurs et permissions
## Gestion des utilisateurs et permissions
PostgreSQL permet de lier un utilisateur Unix à un utilisateur PostgreSQL. C'est le cas pour l'utilisateur *postgres* (superadmin PostgreSQL), qui est lié à l'utilisateur Unix *postgres*.
@ -287,8 +283,7 @@ Bien s'assurer que les utilisateurs PostgreSQL ont un mot de passe de défini av
Pour plus de détails on pourra consulter la [documentation](https://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html).
## Lister les utilisateurs (ou rôles)
### Lister les utilisateurs (ou rôles)
~~~
$ su - postgres
@ -299,13 +294,11 @@ $ psql
On peut utiliser aussi la commande courte PostgreSQL `\du`.
## Créer un utilisateur et une base de données
Note : Par défaut la base sera créée avec lencodage du système. Si le système est en UTF-8 par défaut, la base créée sera en UTF-8. On peut spécifier un encodage alternatif avec loption `-E`.
### Créer un utilisateur et une base de données
*Note* : Par défaut la base sera créée avec lencodage du système. Si le système est en UTF-8 par défaut, la base créée sera en UTF-8. On peut spécifier un encodage alternatif avec loption `-E`.
* En mode `shell` avec l'utilisateur Unix `postgres` :
~~~
@ -324,7 +317,6 @@ postgres=# CREATE ROLE <user> WITH LOGIN PASSWORD '<password>'
postgres=# CREATE DATABASE <database> OWNER <user>;
~~~
### Créer un utilisateur avec des droits en lecture seule sur une ou plusieurs bases
~~~
@ -343,18 +335,16 @@ $ psql -d <database>
=# ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO <user>;
~~~
Note : Le schéma `public` est celui par défaut à la création de la base, si aucun schéma n'a été spécifié.
*Note* : Le schéma `public` est celui par défaut à la création de la base, si aucun schéma n'a été spécifié.
## Changer le mot de passe d'un utilisateur
### Changer le mot de passe d'un utilisateur
~~~
$ su - postgres
$ psql -c "ALTER USER <login> WITH PASSWORD '<pass>'"
~~~
## Supprimer un utilisateur
### Supprimer un utilisateur
~~~
$ su - postgres
@ -362,7 +352,7 @@ $ dropuser <login>
~~~
# Optimisation
## Optimisation
La configuration par défaut est faite pour s'adapter à toutes sortes de machines, elle n'est donc pas adaptée en terme de performances. Nous allons voir ici quelques paramètres qui peuvent améliorer les performances de PostgreSQL. Vous pouvez utilisez le site [PgTune](http://pgtune.leopard.in.ua/) pour avoir une idée des paramètres à utiliser en fonction de vos ressources.
@ -389,7 +379,7 @@ La configuration par défaut est faite pour s'adapter à toutes sortes de machin
* Article intéressant : <https://pgdash.io/blog/scaling-postgres.html>
## Modifier un paramètre
### Modifier un paramètre
Pour changer la valeur d'une directive, il y a besoin de vérifier qu'[elle peut être modifiable à chaud](https://postgresqlco.nf/doc/fr/param/log_min_duration_statement/).
@ -406,7 +396,7 @@ UPDATE pg_settings SET setting = 5000 WHERE name = 'log_min_duration_statement';
~~~
# Administration
## Administration
Toutes les commandes d'administration doivent être exécutées depuis l'utilisateur Unix *postgres*.
@ -589,7 +579,7 @@ ou si on veux également lister les tables en incluant les schémas interne à P
~~~
## Ajouter un langage
### Ajouter un langage
On peut installer un "langage" (PL/PGSL, PL/Perl, PL/TCP) pour une base. Exemple :
@ -614,7 +604,7 @@ postgres=# select * from pg_pltemplate;
~~~
# Sauvegardes et restaurations des données de PostgreSQL
## Sauvegardes et restaurations des données de PostgreSQL
Deux principales possibilités existent pour sauvegarder les bases de données PostgreSQL :
@ -622,7 +612,7 @@ Deux principales possibilités existent pour sauvegarder les bases de données P
* sauvegarde du datadir : complètement transparent pour les connexions actives, synchro uniquement des fichiers modifiés par rapport à la dernière sauvegarde, mais plus complexe à mettre en place (gestion des WAL).
## Sauvegarde SQL
### Sauvegarde SQL
* Sauvegarde d'une seule base (**Attention :** ne sauvegarde ni les tablespaces, ni les roles.) :
@ -673,9 +663,9 @@ $ pg_dumpall | gzip > dump.sql.gz
~~~
## Restauration SQL
### Restauration SQL
### Restauration de données au format texte SQL
#### Restauration de données au format texte SQL
La base doit exister, sinon il faut la créer avec `createdb -O <owner> <db>` :
@ -697,7 +687,7 @@ Attention: si on restaure de cette manière il faut vérifier que les droits de
# for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" <base>` ; do echo psql -c "alter table \"$tbl\" owner to <user>" <base>; done
~~~
### Restauration de données au format _custom_ :
#### Restauration de données au format _custom_ :
~~~
$ pg_restore -F c all.dump
@ -734,7 +724,7 @@ Optimisations pour la restauration :
* Mettre la directive `synchronous_commit` à `off`.
## Sauvegarde du datadir
### Sauvegarde du datadir
Doc de référence : <http://www.postgresql.org/docs/9.6/static/continuous-archiving.html>
@ -785,14 +775,14 @@ PostgreSQL va rejouer tous les WAL, exactement de la même manière qu'il le fai
Il est possible de rejouer les WAL jusqu'à une certaine date (`recovery_target_time`) ou un certain identifiant de transaction (`recovery_target_xid`).
# Mise à jour
## Mise à jour
La mise à jour de PostgreSQL d'une version majeure à une autre implique une mise à jour du datadir.
Dans Debian, chaque version de PostgreSQL a son propre paquet (*postgresql-9.3*, *postgresql-9.4*, etc…). La mise à jour doit donc forcément se faire de manière explicite par un `apt install` du paquet en question. Il n'est pas obligatoire de faire chaque mise à jour intermédiaire pour arriver à celle voulue (i.e. on peut passer de la 9.1 à la 9.6 sans devoir passer par la 9.2, 9.3, etc…).
## Procédure à suivre pour la mise à jour
### Procédure à suivre pour la mise à jour
Dans la procédure suivante, on suppose que l'on met à jour un cluster en version 9.3 vers la version 9.6. Le cluster s'appelle *main* (nom par défaut).
@ -833,9 +823,9 @@ psql (9.6.5)
~~~
# Monitoring
## Monitoring
## Munin
### Munin
On peut utiliser les plugins standards suivants :
@ -844,8 +834,7 @@ postgres_bgwriter postgres_connections_db postgres_xlog
postgres_checkpoints postgres_users
~~~
## Nagios
### Nagios
Vérification via le check *historique*:
@ -862,9 +851,9 @@ En Debian 10, on installe le paquet *check-pgactivity*
Ce check permet de monitorer différents point, comme les process *idle in transaction*, la réplication logique et streaming, etc...
# Plomberie
## Plomberie
## WAL
### WAL
* The Internals of PostgreSQL Chapter 9 WAL : <http://www.interdb.jp/pg/pgsql09.html>
* Article de Dalibo (ancien mais presque encore exact) : <https://www.dalibo.org/glmf108_postgresql_et_ses_journaux_de_transactions>
@ -918,7 +907,7 @@ Ce mécanisme de WAL est à la base de PostgreSQL, et il sert notamment pour la
Pour la sauvegarde on peut ainsi envoyer automatiquement un fichier de WAL dès qu'il est fermé avec l'option `archive_command = 'cp %p /tmp/pg_xlog_archives/%f'`.
## VACUUM et ANALYZE
### VACUUM et ANALYZE
`VACUUM` permet de nettoyer les données obsolètes (lignes d'une table qui ont été modifiées par un `UPDATE` par exemple) que PostgreSQL n'efface pas volontairement du disque puisque d'autres requêtes plus anciennes peuvent encore y accéder.
@ -947,7 +936,7 @@ $ vacuumdb -a -f -v
~~~
# Benchmark
## Benchmark
`pgbench` est un outil intégré à PostgreSQL (dans Debian, il est dans le paquet `postgresql-contrib`), il permet de réaliser des tests, et d'avoir les résultats en transactions par secondes (tps). Plus d'inos sur la [doc officielle](https://www.postgresql.org/docs/9.6/static/pgbench.html).
Il est recommandé de réaliser 3 fois le bench pour avoir une meilleure précision.
@ -961,7 +950,7 @@ $ createdb -O postgres -E UNICODE pgbench
$ /usr/lib/postgresql/9.6/bin/pgbench -i pgbench -s 50
~~~
## Exemple avant optimisation
### Exemple avant optimisation
~~~
$ php -f script.php
@ -988,7 +977,7 @@ Testing: 10 clients with 50 transactions (5 samples)
pg_benchmark executed 30 tests in about 39 seconds
~~~
## Exemple après optimisation
### Exemple après optimisation
~~~
Shared Memory Max is 3,072.00Mb
@ -1015,9 +1004,9 @@ pg_benchmark executed 30 tests in about 5 seconds
~~~
# Outils
## Outils
## PgBouncer
### PgBouncer
[PgBouncer](https://pgbouncer.github.io/), de même que PgPool-II, permet de multiplexer plusieurs connexions à PostgreSQL en une seule : PgBouncer va recevoir les multiples connexions des clients et les envoyer à PostgreSQL à travers un pool de connexions qu'il maintient de manière persistente avec le serveur. L'intérêt principal est d'offrir un gain de performance puisque, avec PostgreSQL, une nouvelle connexion signifie un fork d'un nouveau processus, ce qui coûteux pour le système.
@ -1091,7 +1080,7 @@ pgbouncer=# show help;
Il existe un plugin Munin pour PgBouncer : <https://github.com/munin-monitoring/contrib/blob/master/plugins/postgresql/pgbouncer_>
## barman
### barman
* Documentation : <http://docs.pgbarman.org/release/2.4/>
@ -1175,7 +1164,7 @@ qui nécessite les droits sudo suivants:
nagios ALL = (barman) NOPASSWD: /usr/bin/barman check --nagios all
~~~
## pgbadger
### pgbadger
[PgBadger](https://github.com/dalibo/pgbadger) permet d'analyser des logs PostgreSQL et de générer une page HTML représentant les résultats sous forme de graphes et tableau de données.
@ -1230,7 +1219,7 @@ Installation :
~~~
## pg_stat_statements
### pg_stat_statements
`pg_stat_statements` est une extension PostgreSQL permettant de collecter des statistiques sur les requêtes reçues.
@ -1253,7 +1242,7 @@ bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit / nullif(
~~~
# Activation du support des larges pages (Hugepages)
## Activation du support des larges pages (Hugepages)
Le support des Hugepages permet une optimisation de postgresql et du kernel, pour les requêtes avec un besoin important de mémoire.
@ -1370,7 +1359,7 @@ huge_pages = on
~~~
# Réplication
## Réplication
Plusieurs solutions de réplication plus ou moins avancées existent avec PostgreSQL :
@ -1386,34 +1375,34 @@ Pour plus de détails sur ces solutions, voir ce post sur [dba.stackexange.com](
> *Note* : l'expédition des logs entre des serveurs pgsql nécessite qu'ils soient à la même version majeure.
## Streaming Réplication
### Streaming Réplication
Voir [/HowtoPostgreSQL/ReplicationPhysique]().
## Réplication Logique
### Réplication Logique
Voir [/HowtoPostgreSQL/ReplicationLogique]().
## Slony
### Slony
Voir [/HowtoPostgreSQL/Slony]().
# Utilisation
## Utilisation
Voir [/HowtoPostgreSQL/Utilisation]().
# FAQ
## FAQ
## J'ai lancé `pg_top` mais je n'ai aucun résultat
### J'ai lancé `pg_top` mais je n'ai aucun résultat
Vous utilisez une version non compatible avec votre base, essayez avec une version du paquet `ptop`.
## Rendre PostgreSQL moins susceptible d'être killer par l'OMkiller
### Rendre PostgreSQL moins susceptible d'être killer par l'OMkiller
Voici une unité systemd avec des ajustements sur les variables d'environnement pour rendre PostgreSQL moins killable par l'OMkiller
@ -1440,7 +1429,7 @@ WantedBy=multi-user.target
~~~
## Activer module `pgcrypto`
### Activer module `pgcrypto`
Dans le *shell* `psql` :
@ -1465,7 +1454,7 @@ hostname=# select pg_get_functiondef(to_regproc('gen_random_uuid'));
~~~
## Activer module `postgis`
### Activer module `postgis`
Il faut en premier installé les paquets suivants, exemple sur une instance postgresql 11 :
@ -1494,7 +1483,7 @@ foo=# CREATE EXTENSION IF NOT EXISTS postgis_topology;
~~~
## Commande COPY
### Commande COPY
<https://docs.postgresql.fr/current/sql-copy.html>