relecture / amélioration

This commit is contained in:
Gregory Colpart 2018-01-26 15:24:41 +01:00
parent 529f04be8d
commit 230e301dd6

View file

@ -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/<version>/<instance>/`
* 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 : <http://pgtune.leopard.in.ua/>
## 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 <base> > 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 : <http://www.postgresql.org/docs/9.6/static/continuous-archiving.html>
@ -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