diff --git a/HowtoPostgreSQL.md b/HowtoPostgreSQL.md index 85d39580..697d8f7d 100644 --- a/HowtoPostgreSQL.md +++ b/HowtoPostgreSQL.md @@ -11,6 +11,8 @@ categories: databases ## Installation ~~~ +# dpkg-reconfigure locales + # apt install postgresql # /usr/lib/postgresql/9.6/bin/postgres -V @@ -24,40 +26,52 @@ postgres (PostgreSQL) 9.6.6 Memory: 0B CPU: 0 CGroup: /system.slice/postgresql.service + +# pg_lsclusters +Ver Cluster Port Status Owner Data directory Log file +9.6 main 5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log ~~~ -> **Note** : Assurez-vous d'avoir configuré votre locale système avec `dpkg-reconfigure locales`. L'initialisation des bases de données de template sera faite avec la locale du système. +> *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. -Suite à l'installation, une première instance *main* est créée avec les paramètres par défaut. -### apt.postgresql.org +### Installation via apt.postgresql.org -Le *PostgreSQL Global Development Group (PGDG)* maintient un dépôt Debian qui contient plusieurs versions majeures de PostgreSQL (plus récentes et plus anciennes) que celle disponible dans Debian stable, ainsi que plusieurs extensions au serveur. +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. -Ajouter le dépôt un fichier sources.list `/etc/apt/sources.list.d/jessie-pgdg.list` : +Ajouter le dépôt un fichier `/etc/apt/sources.list.d/postgresql.list` : ~~~ -deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main +deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main ~~~ -Puis définir les priorités pour DPkg dans `/etc/apt/preferences.d/postgresql` : +Puis réécupérer la clé GPG : ~~~ -Package: postgresql-9.5 postgresql-client-common postgresql-common libpq5 -Pin: release a=jessie-pgdg +# wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | apt-key add - +~~~ + +On peut ainsi installer proprement PostgresSQL 10 - par exemple - en définissant les priorités via `/etc/apt/preferences.d/postgresql` : + +~~~ +Package: postgresql-10 postgresql-client-common postgresql-common libpq5 +Pin: release a=stretch-pgdg Pin-Priority: 999 ~~~ -Enfin, récupérer la clé publique GPG : +Puis : ~~~ -# wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc |apt-key add - -~~~ +# apt install postgresql-10 +# pg_lsclusters +Ver Cluster Port Status Owner Data directory Log file +10 main 5433 online postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log +~~~ ## Administration basique -### Pour lister les instances existantes : +### Lister les instances existantes ~~~ # pg_lsclusters @@ -65,7 +79,7 @@ Ver Cluster Port Status Owner Data directory Log file 9.6 main 5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log ~~~ -### lister les requêtes actives (PostgreSQL >= 9.2) +### Lister les requêtes actives (PostgreSQL >= 9.2) ~~~ # su - postgres @@ -124,11 +138,35 @@ t - Toggle between cumulative or differential statistics when viewing u - display processes for only one user (+ selects all users) ~~~ +## Configuration + +Fichiers de configuration : + +~~~ +/etc/postgresql/ +└── 9.6 + └── main + ├── environment + ├── pg_ctl.conf + ├── pg_hba.conf + ├── pg_ident.conf + ├── postgresql.conf + └── start.conf +~~~ + +La plupart des changements de configuration peuvent être pris en compte à chaud avec un `reload`. + +On verra dans ce cas les changements dans les logs : + +~~~ +2016-12-20 17:02:58 CET [13555]: [2-1] user=,db= LOG: received SIGHUP, reloading configuration files +2016-12-20 17:02:58 CET [13555]: [3-1] user=,db= LOG: parameter "log_temp_files" changed to "6MB" +~~~ -### Multiples versions et instances (clusters) +## Instances PostgreSQL -Une surcouche Debian permet de gérer très 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. +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. Par défaut le script d'init contrôle toutes les instances actives. Pour contrôler seulement une instance en particulier : @@ -160,6 +198,7 @@ On peut remarquer que toute l'arborescence est organisée en fonction des versio * binaires et bibliothèques : `/usr/lib/postgresql///` * etc… + ## 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*. @@ -190,15 +229,6 @@ 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). -## Configuration - -La plupart des changements de configuration peuvent être pris en compte à chaud avec un `reload`. On verra dans ce cas les changements dans les logs : - -~~~ -2016-12-20 17:02:58 CET [13555]: [2-1] user=,db= LOG: received SIGHUP, reloading configuration files -2016-12-20 17:02:58 CET [13555]: [3-1] user=,db= LOG: parameter "log_temp_files" changed to "6MB" -~~~ - ### pgpass Pour se connecter plus facilement à postgresql (avec `psql` mais aussi `pgdump` etc), on peut utiliser le fichier `~/.pgpass` avec comme format @@ -209,7 +239,10 @@ hostname:port:database:username:password Ce fichier doit être `-rw-------` (600). -### Optimisation + + + +## Optimisation La configuration par défaut est fait pour s'adapter à toutes sortes de machines, elle n'est donc pas adapté en terme de performances. Nous allons voir ici quelques paramètres qui peuvent améliorer les performances de PostgreSQL. @@ -241,6 +274,7 @@ La configuration par défaut est fait pour s'adapter à toutes sortes de machine * Calculateur automatique : + ## Administration Toutes les commandes d'administration doivent être exécutées depuis l'utilisateur Unix *postgres*. @@ -391,14 +425,55 @@ foo=# \d+ =# \timing ~~~ -### Sauvegardes et restaurations des données de PostgreSQL +* Lister les connections en idle qui n'ont effectué aucune requête depuis plus d'un jour : + +~~~ +SELECT pid, query FROM pg_stat_activity WHERE state_change < now() - +interval '1d' and state = 'idle' ; +~~~ + +* Tuer toutes les requêtes en idle en cas de saturation : + +~~~ +ps aux|grep postgres|grep idle|awk '//{print $2}'|while read pid;do kill $pid;done +~~~ + + + +### Ajouter un langage + +On peut installer un "langage" (PL/PGSL, PL/Perl, PL/TCP) pour une base. Exemple : + +~~~ +# su postgres +$ createlang plpgsql production +~~~ + +On peut voir tous les langages disponibles via : + +~~~ +postgres=# select * from pg_pltemplate; + tmplname | tmpltrusted | tmpldbacreate | tmplhandler | tmplvalidator | tmpllibrary | tmplacl +-----------+-------------+---------------+-----------------------+-------------------+------------------+--------- + plpgsql | t | t | plpgsql_call_handler | plpgsql_validator | $libdir/plpgsql | + pltcl | t | t | pltcl_call_handler | | $libdir/pltcl | + pltclu | f | f | pltclu_call_handler | | $libdir/pltcl | + plperl | t | t | plperl_call_handler | plperl_validator | $libdir/plperl | + plperlu | f | f | plperl_call_handler | plperl_validator | $libdir/plperl | + plpythonu | f | f | plpython_call_handler | | $libdir/plpython | +(6 rows) +~~~ + + + +## Sauvegardes et restaurations des données de PostgreSQL Deux principales possibilités existent pour sauvegarder les bases de données PostgreSQL : * sauvegarde SQL : simple à mettre en place, mais lent, impacte les requêtes en cours (locks) et consomme beaucoup de place ; * 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 : @@ -443,7 +518,7 @@ $ pg_dump -F c > dump.sql $ pg_dumpall | gzip > dump.sql.gz ~~~ -#### Restauration SQL +### Restauration SQL * Restauration de données au format SQL : @@ -465,7 +540,7 @@ Optimisations pour la restauration : * augmenter autant que possible le `_maintenance_work_mem_` (attention, il sera multiplié par le nombre de processus utilisés pour la restauration). Dans tous les cas, ne pas dépasser les 2 Go. Peut être fait dans la conf ou dans une session ; * Mettre la directive `synchronous_commit` à `off`. -#### Sauvegarde du datadir +### Sauvegarde du datadir Doc de référence : @@ -514,31 +589,8 @@ 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`). -### Langage -On peut installer un "langage" (PL/PGSL, PL/Perl, PL/TCP) pour une base. Exemple : - -~~~ -# su postgres -$ createlang plpgsql production -~~~ - -On peut voir tous les langages disponibles via : - -~~~ -postgres=# select * from pg_pltemplate; - tmplname | tmpltrusted | tmpldbacreate | tmplhandler | tmplvalidator | tmpllibrary | tmplacl ------------+-------------+---------------+-----------------------+-------------------+------------------+--------- - plpgsql | t | t | plpgsql_call_handler | plpgsql_validator | $libdir/plpgsql | - pltcl | t | t | pltcl_call_handler | | $libdir/pltcl | - pltclu | f | f | pltclu_call_handler | | $libdir/pltcl | - plperl | t | t | plperl_call_handler | plperl_validator | $libdir/plperl | - plperlu | f | f | plperl_call_handler | plperl_validator | $libdir/plperl | - plpythonu | f | f | plpython_call_handler | | $libdir/plpython | -(6 rows) -~~~ - -## Mettre à jour un cluster +## Mise à jour La mise à jour de PostgreSQL d'une version majeure à une autre implique une mise à jour du datadir. @@ -794,58 +846,6 @@ Par défaut, PostgreSQL utilise le schéma *public* mais il est possible d'utili ## Monitoring -* lister les connections en idle qui n'ont effectué aucune requête depuis plus d'un jour : - -~~~ -SELECT pid, query FROM pg_stat_activity WHERE state_change < now() - -interval '1d' and state = 'idle' ; -~~~ - -* Tuer toutes les requêtes en idle en cas de saturation : - -~~~ -ps aux|grep postgres|grep idle|awk '//{print $2}'|while read pid;do kill $pid;done -~~~ - -### pg_top - -pg_top permet de lister et trier les processus clients connectés à Postgresql. - -Installation : - -~~~ -# aptitude install ptop -~~~ - -Puis en tant que postgres : - -~~~ -$ pg_top -~~~ - -***Quelques combinaisons utiles*** - -**Afficher la requête complète** - -~~~ -"Q" + pid de la req -~~~ - -**Plan de la requête** - -*Explain (estimation)* - -~~~ -"E" + pid de la req -~~~ - -*Explain Analyse (exécute)* - -~~~ -"A" + pid de la req -~~~ - -Et taper `?` pour la liste de toutes les commandes possibles. ## VACUUM et ANALYZE