relecture / amélioration
This commit is contained in:
parent
529f04be8d
commit
230e301dd6
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue