relecture / amélioration
This commit is contained in:
parent
529f04be8d
commit
230e301dd6
|
@ -11,6 +11,8 @@ categories: databases
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
|
# dpkg-reconfigure locales
|
||||||
|
|
||||||
# apt install postgresql
|
# apt install postgresql
|
||||||
|
|
||||||
# /usr/lib/postgresql/9.6/bin/postgres -V
|
# /usr/lib/postgresql/9.6/bin/postgres -V
|
||||||
|
@ -24,40 +26,52 @@ postgres (PostgreSQL) 9.6.6
|
||||||
Memory: 0B
|
Memory: 0B
|
||||||
CPU: 0
|
CPU: 0
|
||||||
CGroup: /system.slice/postgresql.service
|
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
|
# wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | apt-key add -
|
||||||
Pin: release a=jessie-pgdg
|
~~~
|
||||||
|
|
||||||
|
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
|
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
|
## Administration basique
|
||||||
|
|
||||||
### Pour lister les instances existantes :
|
### Lister les instances existantes
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
# pg_lsclusters
|
# 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
|
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
|
# 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)
|
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 :
|
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>/`
|
* binaires et bibliothèques : `/usr/lib/postgresql/<version>/<instance>/`
|
||||||
* etc…
|
* etc…
|
||||||
|
|
||||||
|
|
||||||
## 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*.
|
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).
|
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
|
### pgpass
|
||||||
|
|
||||||
Pour se connecter plus facilement à postgresql (avec `psql` mais aussi `pgdump` etc), on peut utiliser le fichier `~/.pgpass` avec comme format
|
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).
|
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.
|
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/>
|
* Calculateur automatique : <http://pgtune.leopard.in.ua/>
|
||||||
|
|
||||||
|
|
||||||
## Administration
|
## Administration
|
||||||
|
|
||||||
Toutes les commandes d'administration doivent être exécutées depuis l'utilisateur Unix *postgres*.
|
Toutes les commandes d'administration doivent être exécutées depuis l'utilisateur Unix *postgres*.
|
||||||
|
@ -391,14 +425,55 @@ foo=# \d+
|
||||||
=# \timing
|
=# \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 :
|
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 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 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 :
|
* Sauvegarde d'une seule base :
|
||||||
|
|
||||||
|
@ -443,7 +518,7 @@ $ pg_dump -F c <base> > dump.sql
|
||||||
$ pg_dumpall | gzip > dump.sql.gz
|
$ pg_dumpall | gzip > dump.sql.gz
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
#### Restauration SQL
|
### Restauration SQL
|
||||||
|
|
||||||
* Restauration de données au format 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 ;
|
* 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`.
|
* 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>
|
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`).
|
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 :
|
## Mise à jour
|
||||||
|
|
||||||
~~~
|
|
||||||
# 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
|
|
||||||
|
|
||||||
La mise à jour de PostgreSQL d'une version majeure à une autre implique une mise à jour du datadir.
|
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
|
## 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
|
## VACUUM et ANALYZE
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue