diff --git a/HowtoPostgreSQL.md b/HowtoPostgreSQL.md index 070fe332..55387de1 100644 --- a/HowtoPostgreSQL.md +++ b/HowtoPostgreSQL.md @@ -6,38 +6,39 @@ categories: databases * Documentation : * Rôle Ansible : * The Internals of PostgreSQL : +* 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!=''; ~~~ - -## 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 d’exé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 l’encodage 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 l’option `-E`. - - ### Créer un utilisateur et une base de données +*Note* : Par défaut la base sera créée avec l’encodage 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 l’option `-E`. + + * En mode `shell` avec l'utilisateur Unix `postgres` : ~~~ @@ -324,7 +317,6 @@ postgres=# CREATE ROLE WITH LOGIN PASSWORD '' postgres=# CREATE DATABASE OWNER ; ~~~ - ### Créer un utilisateur avec des droits en lecture seule sur une ou plusieurs bases ~~~ @@ -343,18 +335,16 @@ $ psql -d =# ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO ; ~~~ -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 WITH PASSWORD ''" ~~~ - -## Supprimer un utilisateur +### Supprimer un utilisateur ~~~ $ su - postgres @@ -362,7 +352,7 @@ $ dropuser ~~~ -# 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 : -## 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 ` : @@ -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';" ` ; do echo psql -c "alter table \"$tbl\" owner to " ; 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 : @@ -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 : * Article de Dalibo (ancien mais presque encore exact) : @@ -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 : -## barman +### barman * Documentation : @@ -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