Vous êtes sur la page 1sur 117

Support de cours

PostgreSQL 8
installation configuration exploitation
v_20080925 (c) 2008, Sbastien Namche (sebastien@nameche.fr)

Licence pour la diffusion de ce document


Ce document peut tre librement lu, stock, reproduit, diffus, traduit et cit par tous moyens et sur tous supports aux conditions suivantes : ! tout lecteur ou utilisateur de ce document reconnat avoir pris connaissance de ce qu'aucune garantie n'est donne quant son contenu, tous points de vue, notamment vracit, prcision et adquation pour toute utilisation ; ! il n'est procd aucune modification autre que cosmtique, changement de format de reprsentation, traduction, correction d'une erreur de syntaxe vidente ou en accord avec les clauses ci-dessous ; ! le nom, le logo et les coordonnes de l'auteur devront tre prservs sur toutes les versions drives du document tous les endroits o ils apparaissent dans l'original, les noms et logos d'autres contributeurs ne pourront pas apparatre dans une taille suprieure celle des auteurs prcdents, des commentaires ou additions peuvent tres insrs condition d'apparatre clairement comme tels ; ! les traductions ou fragments doivent faire clairement rfrence une copie originale complte, si possible une copie facilement accessible ; ! les traductions et les commentaires ou ajouts insrs doivent tre dats et leur(s) auteur(s) doi(ven)t tre identifiable(s) (ventuellement au travers d'un alias) ; ! cette licence est prserve et s'applique l'ensemble du document et des modifications et ajouts ventuels (sauf en cas de citation courte), quelqu'en soit le format de reprsentation ; ! quel que soit le mode de stockage, reproduction ou diffusion, toute version imprime doit contenir une rfrence une version numrique librement accessible au moment de la premire diffusion de la version imprime, toute personne ayant accs une version numrise de ce document doit pouvoir en faire une copie numrise dans un format directement utilisable et si possible ditable, suivant les standards publics, et publiquement documents en usage ; ! la transmission de ce document un tiers se fait avec transmission de cette licence, sans modification, et en particulier sans addition de clause ou contrainte nouvelle, explicite ou implicite, lie ou non cette transmission. En particulier, en cas d'inclusion dans une base de donnes ou une collection, le propritaire ou l'exploitant de la base ou de la collection s'interdit tout droit de regard li ce stockage et concernant l'utilisation qui pourrait tre faite du document aprs extraction de la base ou de la collection, seul ou en relation avec d'autres documents. Toute incompatibilit des clauses ci-dessus avec des dispositions ou contraintes lgales, contractuelles ou judiciaires implique une limitation correspondante : droit de lecture, utilisation ou redistribution verbatim ou modifie du document. Adapt de la licence Licence LLDD v1, octobre 1997, Libre reproduction Copyright Bernard Lang [F1450324322014]. URL : http://pauillac.inria.fr/~lang/licence/lldd.html L'original de ce document est disponible cette URL : http://sebastien.nameche.fr/cours La photographie de la couverture est Copyright (c) Shonali Laha (http://www.fiu.edu/~lahas/), tous droits rservs. Utilise ici avec son aimable autorisation, je l'en remercie. Elle a t prise en mai 2002. Il s'agit d'un lphant vivant probablement dans le Parc National de Tarangire, en Tanzanie.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 2

Plan
La formation suivra ce plan : - introduction ; - partie 1 : installation et configuration ; - partie 2 : structure et organisation des objets au sein d'un serveur PostgreSQL ; - partie 3 : administration des bases de donnes ; - partie 4 : notions avances. Il s'agit d'une formation interactive, il est donc tout fait indiqu d'interrompre le formateur pour lui poser des questions, lui faire prciser certains points, demander l'tude d'un cas particulier, etc. Ce support fait rfrence la version 8.3 de PostgreSQL.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 3

Pr-requis
Cette formation est une introduction au serveur de bases de donnes PostreSQL. Elle se focalisera sur les tches d'administration et les spcificits de PostgreSQL par rapport d'autres gestionnaires de bases de donnes. En particulier, on attend de chaque stagiaire : - des connaissances gnrales en administration des systmes informatiques ; - des notions sur les rseaux IP ; - la matrise du langage SQL (LDD et LMD) ; - la matrise d'un diteur de texte.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 4

Introduction
PostgreSQL est un gestionnaire de bases de donnes relationnelles (SGBDR) supportant le langage SQL. Il est a t dvelopp partir du projet Postgres 4.2 initi par l'Universit de Californie Berkeley (UCB), dpartement informatique, ds 1986. Postgres est luimme driv de Ingres. PostgreSQL est dvelopp selon le mode Open Source , sous licence BSD. Plusieurs dizaines de dveloppeurs et des nombreuses entreprises participent au dveloppement. L'quipe rfrente sur le projet reste, elle, indpendante. PostgreSQL dispose notamment des fonctionnalits suivantes : - respect de la norme SQL92 ; - cls trangres ; - plusieurs langages procduraux ; - dclencheurs ; - vues ; - conforme au modle transactionnel ACID.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 5

Versions de PostgreSQL
Les versions marquantes :
1995-05-01 1995-09-05 1997-01-29 1997-06-08 1998-03-01 1998-10-30 1999-06-09 2000-05-08 2001-04-13 2002-02-04 2002-11-27 2008-01-07 2003-11-17 2005-01-19 2005-11-08 2006-12-05 2008-02-04 2008-09-22 Postgres95 0.01 PostgreSQL 1.0 le code devient modifiable PostgreSQL 6.0 changement dans la numrotation, industrialisation du dveloppement PostgreSQL 6.1 nouvel optimiseur PostgreSQL 6.3 subselect, variables d'environnement ct client PostgreSQL 6.4 vues, rgles (rules), UTF rellement utilisable PostgreSQL 6.5 MVCC, sauvegardes chaud, tables temporaires PostgreSQL 7.0 cls trangres, amlioration de l'optimiseur, jointures SQL92 PostgreSQL 7.1 WAL, TOAST, jointures ouvertes, requtes complexes PostgreSQL 7.2 amliore la gestion des bases consquentes, internationalisation PostgreSQL 7.3 schmas, requtes prpares PostgreSQL 7.3.21 PostgreSQL 7.4 dictionnaire, tsearch2, autovacuum, nombreuses optimisations PostgreSQL 8.0 natif Windows, savepoints, PITR, tablespaces, prt pour l'entreprise PostgreSQL 8.1 validation en deux phases, rles PostgreSQL 8.2 nombreuses amliorations fonctionnelles et optimisations PostgreSQL 8.3 encore plus d'amliorations fonctionnelles et d'optimisations PostgreSQL 7.4.22, 8.0.18, 8.1.14, 8.2.10, 8.3.4

chaque nouvelle version, plus de compatibilit avec SQL92.


(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 6

Communaut
Le site pgFoundry.org hberge de nombreux projets dvelopps par des quipes indpendantes : - connecteurs pour les diffrents langages ; - langages procduraux ; - outils d'aide l'administration ; - logiciels pour la haute disponibilit (rplication, gestion des connexions, etc.).
Citons : - pgFouine - PGCluster - pgpool - pg-toolbox cration de rapports partir du journal d'activit de PostgreSQL rplication synchrone multi-matres gestion des connexions (limitation, rplication, rpartition, paralllisation) un ensemble de scripts pour l'aide l'administration

D'autres projets existent :


- Slony - phpPgAdmin - pgAdmin http://slony.info rplication matre vers plusieurs esclaves http://phppgadmin.sf.net interface Web d'administration http://pgadmin.org client d'administration

Le site franais PostgreSQLFr.fr propose des nouvelles et des traductions de la documentation officielle.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 7

Documentation
La documentation de PostgreSQL est riche et prcise. Elle est consultable en ligne : http://www.postgresql.org/docs/8.3/interactive/index.html Ou disponible au format PDF : http://www.postgresql.org/files/documentation/pdf/8.3/postgresql-8.3-A4.pdf L'association PostgreSQLFr maintient une traduction en ligne : http://docs.postgresql.fr/8.3/ Tlchargeable : http://docs.postgresqlfr.org/8.3/pg833.tar.gz Ou sous forme PDF ou au format d'aide Windows : http://docs.postgresqlfr.org/pg83.pdf http://docs.postgresqlfr.org/8.3/pg833.chm
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 8

Comparatif avec les autres BDD


De telles comparaisons sont souvent prilleuses. Malgr tout : PostgreSQL 8 espaces de tables tables partitionnes conforme ACID intgrit rfretielle langage procdural dclencheurs curseurs authentifications externes oui oui oui oui plusieurs oui oui LDAP, kerberos, PAM, GSSAPI, etc.

MySQL 5 non oui avec InnoDB avec InnoDB oui limits limits non

Oracle 10g oui oui oui oui PL/SQL, Java oui oui oui

Concernant les performances, il est souvent admis que MySQL est plus rapide lorsqu'il est utilis avec le moteur MyISAM. Cependant, cet environnement pose plusieurs problmes (notamment corruption possible des donnes et contention des verrous).
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 9

Partie 1

Installation et configuration

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 10

Les tapes de l'installation


Quelque soit l'environnement, ces tapes seront ncessaires : 1) Installation des binaires. 2) Prparation du systme d'exploitation. 3) Initialisation des fichiers de l'instance. 4) Configuration. 5) Installation des scripts de dmarrage sous Unix ou services sous Windows. PostgreSQL a t ports sur de trs nombreux systmes d'exploitation : Linux, Unix, Windows et Mac OS X.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 11

1 Installation des binaires


En fonction du systme d'exploitation et des contraintes de dveloppement et d'exploitation, plusieurs solutions existent pour installer les binaires : - sous Linux, partir des paquets livrs avec la distribution ; - pour les systmes BSD, en utilisant les ports ; - en rcuprant un paquet binaire sur le site officiel : (pour Solaris, Windows ou les systmes Fedora et RHEL) http://www.postgresql.org/ftp/binary - partir d'un paquet binaire compil par la socit EnterpriseDB : http://www.enterprisedb.com/products/download.do - avec Yum partir du dpt PGDG, pgsqlrpms.org (pour Fedora, CentOS et RHEL) ; - en compilant le code source : http://www.postgresql.org/ftp/source

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 12

Installer PostgreSQL sous Debian


La version stable de Debian (etch ce jour) propose une version 8.1 de PostgreSQL. Pour l'installer, il suffit d'utiliser APT :
# apt-get install postgresql-8.1 postgresql-client-8.1

Les paquets suivants sont recommands :


# apt-get install postgresql-contrib-8.1 postgresql-doc-8.1

Les paquets des langages procduraux sont :


# apt-get install postgresql-8.1-pljava-gcj postgresql-8.1-plr postgresql-8.1-plruby postgresql-8.1-plperl postgresql-plpython-8.1 postgresql-pltcl-8.1 \ \

Le dpt backports.org propose des versions plus rcentes de PostgreSQL (8.2 et 8.3) sous forme de paquets Debian.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 13

Installer PostgreSQL sous CentOS


CentOS 5.1 propose galements des paquets pour la version 8.1 de PostgreSQL. D'autres versions des paquets RPM sont disponibles sur le site de PostgreSQL ici : http://www.postgresql.org/ftp/binary/v8.x.x/linux/rpms/ Pour CentOS 5.1, utiliser les paquets disponibles dans les rpertoires redhat/rhel-5-i386 ou redhat/rhel-5-x86_64, les paquets suivants, au moins, sont ncessaires : - postgresql-libs - postgresql - postgresql-server Ceux-ci sont recommands : postgresql-contrib, postgresql-docs et postgresql-devel Langages procduraux : postgresql-plperl, postgresql-plpython et postgresql-pltcl Installation et dmarrage :
# rpm -ivh postgresql-* # service postgresql initdb # service postgresql start

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 14

Installer PostgreSQL partir du dpt PGDG


Le site pgsqlrpms.org fournit des paquets binaires pour les systmes suivants : - Fedora 7 9 ; - RedHat Enterprise Linux 4 et 5 ; - CentOS 4 et 5. Les versions de PostgreSQL disponibles sont 7.3 et 7.4 ainsi que 8.0 8.4. Les tapes sont : - choisir un fichier RPM pour la distribution et la version de PostgreSQL partir de : http://yum.pgsqlrpms.org/reporpms/repoview/letter_p.group.html - installer ce paquet, par exemple :
# rpm -ivh pgdg-fedora-8.4-1.noarch.rpm

- supprimer les paquets PostgreSQL ventuellement installs :


# rpm -qa |grep -i postgres |xargs rpm -e

- installer les paquets avec Yum :


# yum install postgresql postgresql-server

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 15

Compiler PostgreSQL sous Unix


PostgreSQL utilise l'outil de configuration configure. Sa compilation est donc relativement simple. Le code source est disponible partir de : http://www.postgresql.org/ftp/source/ Les outils de compilation et bibliothques ncessaires sont : - GNU make ; - compilateur C ANSI (tel que gcc) ; - tar et gzip ou bzip2 ; - la bibliothque GNU readline (optionnelle) ; - la bibliothque zlib (optionnelle) ; - une implmentation de l'API gettext pour activer NLS (Native Language Support) ; - les bibliothques Kerberos, OpenSSL, OpenLDAP et/ou PAM pour activer des types d'authentification et de chiffrements spcifiques. D'autres composants logiciels sont ncessaires pour certains langages procduraux : - Perl et la bibliothque libperl pour PL/Perl ; - Python et le module distutils pour PL/Python ; - Tcl pour PL/Tcl.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 16

Compiler PostgreSQL sous Unix


Le processus gnral suivre pour compiler PostgreSQL est le suivant :
# # # # # # # # wget ftp://ftp.postgresql.org/pub/source/v8.x.x/postgresql-8.x.x.tar.gz zcat postgresql-8.x.x.tar.gz | tar xf cd postgresql-8.x.x ./configure --prefix=/usr/local/postgresql8xx --with-openssl make make install echo 'PATH=/usr/local/postgresql8xx/bin:$PATH' >> /etc/profile echo 'export PATH' >> /etc/profile

D'autres options de configure sont :


--without-readline --without-zlib --enable-nls='fr de' --with-ldap --with-pam --with-perl --with-python --with-tcl

Pour obtenir toutes les options, excuter :


# ./configure --help

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 17

Installer PostgreSQL sous Windows


Une version de PostgreSQL compile pour Windows est disponible sous forme de paquet installable cet endroit : http://www.postgresql.org/ftp/binary/v8.x.x/win32/ Tlcharger le fichier postgresql-8.x.x-x.zip, en extraire le fichier postgresql-8.x.msi et l'excuter. Drouler les crans d'installation. La procdure prend en charge la cration d'un service Windows ainsi que la cration d'un premier groupe de bases de donnes pour le serveur PostgreSQL. L'installation des diffrents langages procduraux est possible si ceux-ci sont dj installs sur le systme d'exploitation. Parmi les contributions utiles installer figure notamment adminpack qui permet d'tendre les fonctions de l'interface graphique pgAdminIII.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 18

2 Prparation du systme d'exploitation


Trois tches essentielles : 1) Cration d'un utilisateur systme. 2) Choix des rpertoires pour les fichiers de l'instance. 3) Paramtrage de la mmoire partage. Le serveur PostgreSQL n'est jamais excut en tant que root. L'utilisateur systme utilis est traditionnellement postgres et n'a pas besoin de mot de passe. Le choix du rpertoire de l'instance est important : - prendre en compte la capacit et la vitesse du disque ; - prvoir la possibilit de crer plusieurs instances ; - les fichiers de donnes, les index et les journaux des transactions pourront tre rpartis sur plusieurs disques grce aux espaces de tables (tablespaces) ; - ce rpertoire doit tre accessible en lecture et criture pour l'utilisateur postgres (et uniquement cet utilisateur). Par exemple : /var/postgres/u01/inst1
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 19

Paramtres de la mmoire partage sous Unix


PostgreSQL utilise des segments de mmoire partage entre les diffrents processus du serveur. Cette fonction est propre aux systmes Unix. Les valeurs de ces paramtres sont souvent trop faibles :
[root@pga ~]# kernel.shmall kernel.shmmax kernel.shmmni sysctl -a |grep kernel.shm |sort = 2097152 (soit 8 Go, car exprim en nombre de blocs) = 33554432 (soit 32 Mo) = 4096

[root@pga ~]# ipcs -m -l ------ Shared Memory Limits -------max number of segments = 4096 max seg size (kbytes) = 32768 max total shared memory (kbytes) = 8388608 min seg size (bytes) = 1

En gnral, mais cela dpend des systmes Unix, les paramtres du noyau sont configurs par l'intermdiaire du fichier /etc/sysctl.conf :
kern.shmall = 2097152 kern.shmmax = 134217728 kern.shmmni = 256 (soit 8 Go, car exprim en nombre de blocs) (soit 128 Mo)

Attention, le paramtre SHMALL peut s'exprimer en octets ou nombre de blocs.


(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 20

3 Initialiser une instance


Une instance PostgreSQL est compose : - d'un ensemble de processus dont un coutant sur un port TCP (5432 par dfaut) ; - d'un rpertoire (appel groupe de bases de donnes ) contenant notamment : * les bases de donnes (dans le rpertoire base) ; * un fichier de configuration postgresql.conf ; * un fichier pour la gestion de l'authentification pg_hba.conf. Il est possible de configurer plusieurs instances actives simultanment sur un mme serveur condition d'allouer un rpertoire et un port TCP distincts pour chacune. Ces instances peuvent mme excuter des versions diffrentes de PostgreSQL. En fonction de la manire dont PostgreSQL a t install, il peut tre ncessaire de crer ou non le premier groupe de bases de donnes et de l'initialiser.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 21

Initialiser une instance


La procdure est la suivante : 1) Crer l'utilisateur et le groupe postgres :
# groupadd postgres # useradd -g postgres -d /var/pg -c "PostgreSQL Software Owner" -s /bin/sh postgres \

2) Crer le rpertoire et lui associer les droits adquats :


# mkdir /var/pg # chown postgres:postgres /var/pg # chmod 700 /var/pg

3) Initialiser les fichiers de l'instance :


# su - postgres $ initdb --encoding=UTF8 --locale=C --pwprompt /var/pg/u01/inst1 $ ls /var/pg/u01/inst1 base pg_clog pg_ident.conf pg_subtrans pg_twophase pg_xlog global pg_hba.conf pg_multixact pg_tblspc PG_VERSION postgresql.conf

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 22

4 Configurer l'instance
Le fichier postgresql.conf contient les diffrents paramtres de l'instance. Les valeurs par dfaut permettent d'excuter une instance de taille modeste sans problme particulier. Nous reviendrons sur diffrents paramtres de ce fichier. Pour l'instant, seuls ceux destins configurer les accs rseau nous intressent. Le paramtre port (dont la valeur par dfaut est 5432) permet de choisir un port TCP diffrent, ce qui est ncessaire si plusieurs instances sont excutes sur une mme machine. Le paramtre listen_addresses liste les adresses IP sur lesquelles PostgreSQL coutera. Par dfaut seule l'adresse locale 127.0.0.1 sera utilise. Pour permettre la connexion de puis d'autres machines du rseau, il faut donc modifier ce paramtre. Par exemple :
listen_adresses = '*'

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 23

Configurer l'authentification
L'authentification est gre par : - le fichier pg_hba.conf ; - les objets rles. Le fichier pg_hba.conf est utilis pour configurer la manire d'authentifier les connexions en fonction de leur origine et de la base de donnes concerne. Attention ! Le fichier pg_hba.conf par dfaut autorise toutes les connexions locales de n'importe quel utilisateur vers n'importe quelle base de donnes sans authentification. Aucune connexion ne sera accepte depuis une autre machine du rseau. Il donc ncessaire de modifier ce fichier la plupart du temps.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 24

Configurer l'authentification
Le format d'une ligne du fichier pg_hba.conf est le suivant :
type base_de_donnes utilisateur addresse mthode option

Les types supports sont : - local : connexion par une socket du domaine Unix (la colonne adresse est vide) ; - host : connexion chiffre ou non par une socket TCP/IP ; - hostssl : connexion chiffrepar une socket TCP/IP ; - hostnossl : connexion non chiffre par une socket TCP/IP. La colonne base_de_donnes peut contenir le nom d'une base de donnes ou : - all ; - samerole ; - une liste de ces lments spars par une virgule. La colonne utilisateur peut contenir le nom d'un utilisateur ou : - all ; - le nom d'un groupe (rle) prcd du caractre + ; - une liste de ces lments spars par une virgule.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 25

Configurer l'authentification
La colonne adresse contient l'adresse IP d'origine de la connexion au format CIDR. Elle doit tre vide lorsque le type de connexion est local. Enfin, la mthode d'authentification est choisie parmi : - trust : autoriser sans mme vrifier le mot de passe ; - reject : rejeter la connexion ; - md5 : vrifier le mot de passe fourni (ne plus utiliser crypt ou password) ; - ident : utiliser le protocole IDENT pour vrifier l'utilisateur ; - krb5, pam ou ldap : authentifications spcifiques. La colonne option n'est employe que lorsque la mthode d'authentification l'exige (par exemple, pour ident ou pam).

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 26

Configurer l'authentification
Voici un exemple sens (lire recommand ) pour le fichier pg_hba.conf :
# TYPE local host host DATABASE all all all USER postgres all all CIDR-ADDRESS 192.168.1.0/24 0.0.0.0/0 METHOD ident sameuser md5 reject

Il est important de noter que l'ordre des lignes dans ce fichier est important car elles sont values les unes la suite des autres. La premire correspondant aux critres type/base de donnes/utilisateur/origine l'emporte. Ce fichier permet l'utilisateur postgres de se connecter en local condition que cette connexion soit ralise par l'utilisateur du systme qui porte le mme nom. Les connexions partir du rseau 192.168.1.0/24 seront autorises mais ncessiteront un mot de passe. Un utilisateur (rle) devra exister pour cela dans l'instance. Toutes les autres connexions seront refuses.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 27

Dmarrer et arrter l'instance


La commande pg_ctl peut tre utilise pour contrler une instance. Notamment pour la dmarrer, l'arrter, obtenir son tat ou lui faire relire ses fichiers de configuration :
# $ $ $ $ su - postgres pg_ctl -D /var/pg/u01/inst1 pg_ctl -D /var/pg/u01/inst1 pg_ctl -D /var/pg/u01/inst1 pg_ctl -D /var/pg/u01/inst1 -l /var/pg/u01/inst1/stderr.log start status reload stop

Si PostgreSQL a t install avec un paquet d'une distribution, il est prfrable d'utiliser les scripts fournis. Sous Debian :
# /etc/init.d/postgresq-8.1 start/stop/status/reload

Sous RedHat ou CentOS :


# service postgresql start/stop/status/reload

Enfin, sous Windows :


> net start/stop pgsql

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 28

Processus de l'instance
Les processus associs l'instance sont les suivantes :
# ps faux postgres 30603 postgres 30605 postgres 30606 postgres 30607 postgres 30608 postgres 30617 ? ? ? ? ? ? S /usr/local/postgresql834/bin/postmaster -D /var/pg/u01/inst1 Ss \_ postgres: writer process Ss \_ postgres: wal writer process Ss \_ postgres: autovacuum launcher process Ss \_ postgres: stats collector process Ss \_ postgres: postgres postgres 127.0.0.1(35342) idle

Le processus pre de tous les autres est le Postmaster. Certains processus fils ne sont prsents que lorsque certains paramtres sont activs. Le dernier processus de cette liste est un processus associ un client. Un tel processus sera cr pour chaque nouvelle session.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 29

5 Configurer le dmarrage
Sous Unix, lorsque PostgreSQL est compil, les scripts de dmarrage ne sont pas installs. Pour Linux, un script de dmarrage est disponible dans le rpertoire contrib/start-scripts du code source. Par exemple :
# cp contrib/start-scripts/linux /etc/init.d/postgresql_inst1 # chmod 755 /etc/init.d/postgresql_inst1 # /etc/init.d/postgresql_inst1 Modifier les variables suivantes : prefix=/usr/local/postgresql834 PGDATA="/var/pg/u01/inst1" # ln -s /etc/init.d/postgresl_inst1 /etc/rc2.d/S30postresql_inst1 # ln -s /etc/init.d/postgresl_inst1 /etc/rc0.d/K70postresql_inst1 # ln -s /etc/init.d/postgresl_inst1 /etc/rc6.d/K70postresql_inst1

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 30

Instances supplmentaires
Pourquoi utiliser de nouvelles instances : - pour excuter des versions diffrentes de PostgreSQL ; - pour excuter des instances de PostgreSQL avec des paramtres diffrents ; - pour des environnements diffrents (dveloppement, pr-production, production) ; - pour isoler des bases de donnes. Pour crer une nouvelle instance sur le mme serveur, il faut : 1) Choisir un port TCP et un rpertoire diffrent pour l'instance. 2) Crer les fichiers de l'instance avec initdb. 3) Modifier la configuration de l'instance. 4) Installer le script de dmarrage.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 31

Instances supplmentaires
Par exemple :
# su - postgres $ initdb --encoding=UTF8 --locale=C --pwprompt /var/pg/u01/inst2 $ vi /var/pg/u01/inst2/postgresql.conf Modifier la variable suivante : port = 5433 $ exit # cp /etc/init.d/postgresql_inst1 /etc/init.d/postgresql_inst2 # vi /etc/init.d/postgresql_inst2 Modifier la variable suivante : PGDATA="/var/pg/u01/inst2" # ln -s /etc/init.d/postgresl_inst2 /etc/rc2.d/S30postresql_inst2 # ln -s /etc/init.d/postgresl_inst2 /etc/rc0.d/K70postresql_inst2 # ln -s /etc/init.d/postgresl_inst2 /etc/rc6.d/K70postresql_inst2

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 32

Les scripts installs par Debian


Les dveloppeurs Debian des paquets PostgreSQL ont cr des scripts qui facilitent la gestion des versions de PostgreSQL et des instances sur un mme serveur. Les scripts pour la gestion des instances sont : - pg_createcluster cration d'une instance ; - pg_lsclusters liste des instances existantes ; - pg_ctlclusters arrt/dmarrage des instances ; - pg_dropcluster suppression d'une instance ; - pg_upgradecluster migration d'une instance vers une version plus rcente ; - pg_maintenance excution des actions de maintenance sur toutes les instances. Le dmarrage des instances lors du dmarrage du systme est galement pris en charge, il n'est donc pas ncessaire de crer et modifier des scripts dans /etc/init.d.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 33

Sessions
Les clients se connectent au serveur par l'intermdiaire d'une socket Unix ou d'une socket TCP (sur le port 5432 par dfaut). Deux informations sont ncessaires pour ouvrir une session : - le nom d'une base de donnes ; - le nom d'un rle. Un mot de passe est requis selon la configuration de pg_hba.conf. Le jeu de caractres utilis par le client peut tre diffrent de celui de la base de donnes. Le r-encodage sera effectu par le serveur.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 34

Sessions
Pour utiliser des sessions chiffres en SSL, trois tapes sont ncessaires : 1) Gnrer une cl prive et un certificat x509 pour le serveur. 2) Activer l'option ssl dans le fichier postgresql.conf de l'instance. 3) Redmarrer l'instance. La cl prive et le certificat x509 doivent tre enregistrs respectivement dans les fichiers server.key et server.crt du rpertoire de l'instance. Par exemple, pour gnrer un certificat auto-sign avec OpenSSL :
# # # # # cd /var/pg/u01/inst1 openssl req -new -text -nodes -out server.req -keyout server.key openssl req -x509 -in server.req -text -key server.key -out server.crt chown postgres server.* chmod 600 server.key

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 35

Clients
Plusieurs outils sont installs avec PostgreSQL :
clusterdb createdb createlang createuser dropdb droplang dropuser ecpg initdb ipcclean pg_config pg_controldata pg_ctl pg_dump pg_dumpall pg_resetxlog pg_restore postgres postmaster psql reindexdb vacuumdb vacuumlo

Beaucoup permettent d'excuter des actions qui peuvent l'tre en SQL. Nous nous concentrerons sur leur quivalent SQL. Pour cela, le client principal est l'interprteur de commandes psql. Ses principaux paramres (tous optionnels) sont :
$ psql -h machine -p port nombdd utilisateur

Par exemple :
$ psql -h 192.168.1.42 postgres postgres Password for user postgres: Welcome to psql 8.2.7, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit

postgres=#
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 36

Client psql
En plus des instructions SQL LDD et LMD, l'interprteur psql comprend certaines commandes qui lui sont propres. Ces commandes sont prcdes du caractre \ . Voici celles qui sont le plus souvents utilises :
- \q quitter psql - \c [nombdd|- utilisateur|- machine|- port|-] se connecter une autre instance PostgreSQL - \i fichier excuter un fichier SQL - \o fichier envoyer la sortie vers un fichier - \d nom dcrire une table, index, sequence, or view - \d{t|i|s|v|S} [modle] lister tables/indexes/squences/vues/objets systme - \db [modle] lister les espaces de tables - \du [modle] lister les utilisateurs - \dg [modle] lister les groupes - \dn [modle] lister les schmas - \l lister toutes les bases de donnes - \z nom afficher les privilges - \? lister les commandes de psql - \h instruction obtenir de l'aide sur une instruction SQL - \encoding obtenir ou configurer l'encodage pour la session
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 37

Client pgAdminIII

Le logiciel pgAdminIII est souvent utilis comme alternative graphique psql.


(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 38

Client pgAdminIII
L'installation de pgAdminIII dpend du systme d'exploitation. Pour Debian :
# apt-get install pgadmin3

Des versions compiles sont disponibles pour FreeBSD, Mac OS X et certaines distributions de Linux cet endroit : http://www.postgresql.org/ftp/pgadmin3/release/ Pour RedHat, CentOS et Fedora, le dpt de logiciels Dag en fournit une version cette adresse : http://dag.wieers.com/rpm/packages/pgadmin3/ Par exemple, sous CentOS ou RHEL 5 :
# wget http://dag.wieers.com/rpm/packages/pgadmin3/pgadmin3-1.4.3-1.el5.rf.i386.rpm # rpm -ivh pgadmin3-1.4.3-1.el5.rf.i386.rpm

Pour Windows, pgAdminIII est compris dans le paquet d'installation prsent prcdemment.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 39

Client pgAdminIII
Afin de pouvoir utiliser toutes les fonctions de pgAdminIII, il est ncessaire de crer certaines fonctions dans chaque base de donnes. Le paquet postgresql-contrib fournit les fichiers ncessaires pour cela, notamment le fichier adminpack.sql. Par exemple, sous CentOS 5, il suffit d'excuter :
# su - postgres $ psql base_de_donnes < /usr/share/pgsql/contrib/adminpack.sql

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 40

Client phpPgAdmin
Le client d'administration pgAdmin requiert un accs direct au serveur via le port TCP 5432. Cela n'est pas toujours possible, ni souhaitable. L'application Web phpPgAdmin peut tre utilise dans cette situation. Il s'installe sur le serveur. Il est disponible cette adresse : http://phppgadmin.sourceforge.net Son installation requiert un serveur Web et le langage PHP avec l'extension pgsql.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 41

Client phpPgAdmin

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 42

Partie 2

Structure et organisation d'une instance PostgreSQL

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 43

Instances, bases de donnes, schmas


Une instance est constitue par : - un ensemble de fichiers (groupe de bases de donnes, ou database cluster) ; - un ensemble de processus. Une instance gre plusieurs bases de donnes. Pour chaque instance, il existe au moins ces bases de donnes : - postgres ; - template1. Les objets (tables, index, etc.) sont stocks dans les bases de donnes. Chaque base de donnes est compartimente en espaces de noms galement appels schmas. Pour chaque base de donnes il existe au moins l'espaces de noms public et les catalogues : - information_schema ; - pg_catalog.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 44

Notion de OID
Les OID (Object Identifiers) sont utiliss par PostgreSQL pour la cl primaire d'un certain nombre de tables systme. Par exemple :
postgres=# \d pg_database Table "pg_catalog.pg_database" Column | Type | Modifiers ---------------+-----------+----------datname | name | not null datdba | oid | not null encoding | integer | not null datistemplate | boolean | not null datallowconn | boolean | not null datconnlimit | integer | not null .../... postgres=# select oid, datname from pg_database; oid | datname -------+----------1 | template1 11510 | template0 11511 | postgres 16395 | bla (4 rows)
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 45

Arborescence des rpertoires et des fichiers


Le rpertoire de chaque instance contient les fichiers et sous-rpertoires suivants :
$PGDATA PG_VERSION pg_hba.conf pg_ident.conf postgresql.conf postmaster.opts postmaster.pid version de PostgreSQL associe cette instance configuration de l'authentification configuration de l'authentification ident configuration de l'instance options de dmarrage du processus postmaster PID du postmaster

$PGDATA/base rpertoire associ l'espace de tables pg_default $PGDATA/base/oid rpertoire de la base de donnes associes l'OID oid $PGDATA/base/pgsql_tmp fichiers temporaires pour certaines oprations $PGDATA/global $PGDATA/pg_clog $PGDATA/pg_log $PGDATA/pg_multixact $PGDATA/pg_subtrans $PGDATA/pg_tblspc $PGDATA/pg_twophase $PGDATA/pg_xlog tables systme (espace de tables pg_global) donnes relatives au statut de validation des transactions journaux d'activit donnes relatives au statut des transactions multiples donnes relatives au statut des transactions imbriques contient un lien symbolique pour chaque espace de tables donnes pour les transactions prpares journaux binaires (WAL)

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 46

Arborescence des rpertoires et des fichiers


Toutes les relations (terme utilis par PostgreSQL pour dsigner un ensemble d'objets tels que les tables, index, squences, etc.) appartiennent une base de donnes. Les donnes associes chaque relation sont stockes dans un fichier dont le nom est l'OID de la relation dans le rpertoire de la base de donnes :
$PGDATA/base/oid_bdd/oid_relation

La base de donnes postgres fait exception la rgle, ses relations sont enregistres dans le rpertoire $PGDATA/global. Ce rpertoire contient les fichiers suivants :
$PGDATA/global pg_auth pg_control pg_database pgstat.stat oid fichier texte, copie des identifiants et mots de passe des rles utilisateurs positions et donnes de contrle des journaux et transactions fichier texte, copie des bases de donnes prsentes dans l'instance statistiques collectes par PostgreSQL OID de la relation associe
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 47 (c) 2008, Sbastien Namche (sebastien@nameche.fr) - 47

LDD/LMD
Le langage SQL est constitu de deux sous-ensembles : - le Langage de Description des Donnes (LDD) ; - le Langage de Manipulation des Donnes (LMD). Le langage de description des donnes est utilis pour crer, modifier et dtruire les objets de la base de donnes (tables, index, squences, procdures, rles, etc.). Ce sousensemble est reprsent par les verbes : create alter drop grant revoke

Souvent, un groupe d'instructions LDD qui dcrivent un ensemble d'objets lis est appel schma de donnes. Le langage de manipulation des donnes permet d'ajouter, modifier, supprimer et rcuprer les donnes qui sont stockes dans les objets crs avec le langage de description des donnes. Ce sous-ensemble est reprsent par les verbes : insert select update delete

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 48

Bases de donnes
instance client
port TCP 5432 rles

base de donnes 1
schma 1 relations

base de donnes 2
schma 1 relations

schma 2 relations

schma 2 relations

Organisation des bases de donnes dans une instance PostgreSQL.

pg_global

pg_default

tblspc1

tblspc2

disque 1

disque 2

disque 3

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 49

Bases de donnes
La cration d'une base de donnes se fait avec l'instruction :
CREATE DATABASE nom [ [ WITH ] [ OWNER [=] utilisateur ] [ TEMPLATE [=] modle ] [ ENCODING [=] encodage ] [ TABLESPACE [=] espace_de_tables ]

Le propritaire par dfaut est l'utilisateur connect. La base de donnes modle par dfaut est template1. L'encodage par dfaut est celui de l'instance. D'autres sont UTF8, WIN1252, LATIN1, LATIN9 et SQL_ASCII. L'espace de tables par dfaut est pg_default. Seul un administrateur ou un utilisateur qui dispose l'attribut CREATEDB peut crer une base de donnes (mais elle lui appartiendra obligatoirement). Par exemple :
postgres=# create database test; CREATE DATABASE postgres=# \c test You are now connected to database "test".
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 50

Bases de donnes
Pour supprimer une base de donnes :
DROP DATABASE [ IF EXISTS ] nom

Une base de donnes ne peut tre supprime tant que des utilisateurs y sont connects. Seul l'administrateur ou le propritaire d'une base de donnes peut la dtruire. Attention ! Lors de la suppression d'une base de donnes, tous les objets qu'elle contient sont dtruits sans avertissement et sans possibilit de retour en arrire. Par exemple :
test=# drop database test; ERREUR: n'a pas pu supprimer la base de donnes actuellement ouverte test=# \c postgres You are now connected to database "postgres". postgres=# drop database test; DROP DATABASE postgres=#
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 51

Schmas
Les schmas sont simplement des espaces de noms. Ainsi, il est possible de crer dans une mme base de donnes des objets qui portent le mme nom tant qu'ils le sont dans des schmas diffrents. Les objets d'un schma sont accessibles en prfixant leur nom par le nom du schma suivit d'un point : schema.objet . La variable search_path contient une liste de noms de schma qui seront considrs pour trouver des noms d'objet qui ne sont pas qualifis. Cette variable contient par dfaut :
"$user",public

La commande \dn de psql permet de lister les schmas prsents dans la base de donnes. Pour crer un schma :
CREATE SCHEMA nom [ AUTHORIZATION utilisateur ]

Le propritaire par dfaut est l'utilisateur connect. Seuls les administrateurs et les utilisateurs qui disposent du privilge CREATE sur la base de donnes peuvent crer de nouveaux schmas.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 52

Schmas
Pour dtruire un schma :
DROP SCHEMA [ IF EXISTS ] nom [ CASCADE ]

Seuls un administrateur et le propritaire du schma peuvent le dtruire. L'option CASCADE permet la suppression d'un schma qui contient des objets. Par exemple :
test=# create schema compta; CREATE SCHEMA test=# create table compta.clients (id int, nom varchar); CREATE TABLE test=# drop schema compta; INFO: table compta.clients dpend de schma compta ERREUR: n'a pas pu supprimer schma compta car d'autres objets en dpendent HINT: Utilisez DROP ... CASCADE pour supprimer aussi les objets dpendants. test=# drop schema compta cascade; INFO: DROP cascade sur table compta.clients DROP SCHEMA

Note : par dfaut tous les droits sont octroys tous les utilisateurs sur le schma public.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 53

Types de donnes lmentaires


PostgreSQL supporte les types de donnes SQL standards :
boolean smallint integer bigint numeric(p, s) real double precision date time timestamp [with time zone] interval char(n) varchar(n) box circle line path point polygon

entier sur 2 octets entier sur 4 octets entier sur 8 octets numrique exacte virgule flotante sur 4 octets virgule flotante sur 8 octets date heure date et heure intervalle de temps

Ainsi que des types lmentaires plus volus :


lseg bytea text cidr inet macaddr

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 54

Relations, tables
Les tables sont cres ainsi :
CREATE [ TEMPORARY ] TABLE nom_table ( nom_colonne nom_type [ DEFAULT expression ] [ contrainte ] [, ...] [ contrainte_table [, ...] ] ) [ WITH ( parametre_stockage [= valeur] [, ... ] ) ] [ TABLESPACE tablespace ]

Les contraintes sur les colonnes et les tables s'expriment ainsi :


[ CONSTRAINT nom_contrainte ] { | | | NOT NULL | UNIQUE parametres_index PRIMARY KEY parametres_index CHECK ( expression ) REFERENCES autre_table [ (colonne) ] [ ON DELETE action ] [ ON UPDATE action ] } ) parametres_index ... ] ) parametres_index ... ] ) [ ( colonne [, ... ] ) ] ON UPDATE action ] }

[ CONSTRAINT nom_contrainte ] { UNIQUE ( colonne [, ... ] | PRIMARY KEY ( colonne [, | CHECK ( expression ) | FOREIGN KEY ( colonne [, REFERENCES autre_table [ ON DELETE action ] [

Les paramtres des index s'expriment ainsi :


[ WITH ( parametre_stockage [= valeur] [, ... ] ) ] [ USING INDEX TABLESPACE tablespace ]

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 55

Relations, index
Les indexes peuvent tre ajouts une table dj cre :
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] nom ON nom_table ( { colonne | ( expression ) } [, ...] ) [ WITH ( parametre_stockage = valeur [, ... ] ) ] [ TABLESPACE tablespace ]

Le seul paramtre de stockage support ce jour est :


FILLFACTOR = { 0-100 }

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 56

Relations, squences
Les squences sont des objets qui fournissent des suites d'entiers garantis uniques et ce travers les transactions. Pour crer une squence :
CREATE [ TEMPORARY ] SEQUENCE nom [ INCREMENT [ BY ] increment ] [ MINVALUE valeur ] [ MAXVALUE valeur ] [ START [ WITH ] valeur ] [ [ NO ] CYCLE ] [ OWNED BY table.colonne } ]

Par exemple :
plop=# create sequence journal.seq_article_id; CREATE SEQUENCE plop=# insert into journal.articles plop-# values ( nextval('journal.seq_article_id'), 'Bla...' ); INSERT 0 1 plop=# select currval('journal.seq_article_id'); currval --------1 (1 row)

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 57

Relations, vues
Pour crer une vue, la syntaxe est :
CREATE [ OR REPLACE ] [ TEMPORARY ] VIEW nom [ ( nom_colonne [, ...] ) ] AS requte

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 58

Langage de manipulation des donnes


Les verbes create, select, update et delete du langage de manipulation de donnes se comportent conformment la norme SQL.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 59

L'instruction copy
L'instruction copy permet de transfrer un nombre important de lignes d'une table vers un fichier ou inversement. Pour copier les lignes d'un fichier vers une table :
COPY table [ (colonnes) ] FROM { 'nom_fichier' | STDIN } [ DELIMITER 'sparateur' ] [ NULL 'chane nulle' ] [ CSV [ HEADER ] [ QUOTE 'quote' ] [ ESCAPE 'escape' ] ]

Pour copier les lignes d'une table vers un fichier :


COPY { table [ (colonnes) ] | requte } TO { 'nom_fichier' | STDOUT } [ DELIMITER 'sparateur' ] [ NULL 'chane nulle' ] [ CSV [ HEADER ] [ QUOTE 'quote' ] [ ESCAPE 'escape' ] ]

Seul un utilisateur de la base de donnes disposant des privilges administrateur peut utiliser un nom de fichier. De plus, ce fichier doit se trouver sur le serveur et est tre accessible en lecture ou en criture par le serveur PostgreSQL.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 60

Transactions
PostgreSQL implmente les transactions conforment au standard ACID :
Atomicit Cohrence Isolation Durabilit toutes les instructions de la transaction sont valides ou aucune ne l'est chaque transaction valide garantit un tat cohrent de la base de donnes les modifications d'une transaction sont invisibles aux autres transactions si la transaction est valide, les modifications engendres sont prennes

Par dfaut, chaque instruction est ralise dans le cadre d'une transaction qui est automatiquement valide. Pour commencer une nouvelle transaction, il faut utiliser explicitement l'instruction begin. Les instructions commit et rollback permettent respectivement de valider et d'annuler la transaction. Les instructions LDD sont prises en charge par les transactions. La fermeture d'une session provoque un rollback implicite.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 61

Niveaux d'isolation
Le standard SQL dfinit quatre niveaux d'isolation entre les transactions : read uncommited read commited repeatable read serializable dirty read possible impossible impossible impossible non-repeatable read possible possible impossible impossible phantom read possible possible possible impossible

PostgreSQL accepte ces quatre niveaux d'isolation mais n'implmente que les niveaux read commited et serializable. Le niveau read uncommited correspond read commited et repeatable read serializable. L'instruction est set transaction :
SET TRANSACTION ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }

L'isolation entre les transactions est implment par le mcanisme MVCC (Multi-Version Concurrency Control) qui gnre bien moins de soucis qu'une implmentation base sur les verrous.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 62

Verrous
L'utilisation des verrous est devenue inutile grce MVCC. Il est nanmoins possible d'utiliser des verrous explicites. De plus, certaines oprations requirent un accs exclusifs aux objets de la base de donnes (notamment les instructions LDD), PostgreSQL est donc amen poser des verrous automatiquement. Les verrous peuvent tre poss : - avec l'instruction lock ; - en utilisant les clauses for update et for share de l'instruction select. Il existe pas moins de 8 niveaux de verrous sur les tables (et 2 sur les lignes) :
LOCK table [, ...] [ IN ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE MODE ] [ NOWAIT ]

Les verrous ne peuvent tre poss que dans le cadre d'une transaction commence avec begin. Ils sont librs lorsque la transaction est termine. La liste des verrous actifs est consultable dans la vue systme pg_locks.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 63

Recherche de texte avec tsearch2


tsearch2 est une contribution qui a t intgre PostreSQL 8.3, elle permet d'effectuer des recherches intgrales de texte (full text searches). Une recherche avec tsearch2 ncessite deux objets : - un vecteur tsvector construit partir du jeux de donnes parcourir ; - une requte tsquery qui reprsente les critres de la recherche. Les fonctions to_tsvector et to_tsquery permettent d'obtenir ces objets qu'il suffit ensuite de combiner avec l'oprateur @@. Par exemple :
bdd=> select to_tsvector('french', 'il tait un petit navire qui n''avait jamais navigu hoh hoh'); to_tsvector --------------------------------------------------'hoh':11,12 'jam':9 'pet':4 'navir':5 'navigu':10 postgres=> select to_tsquery('french', 'un & petit & naviguer'); to_tsquery -----------------'pet' & 'navigu' bdd=> select to_tsvector( 'french', 'il tait un petit navire qui n''avait jamais navigu hoh hoh') bdd-> @@ to_tsquery('french', 'un & petit & naviguer'); ?column? ---------t bdd=> select to_tsvector( 'french', 'il tait un petit navire qui n''avait jamais navigu hoh hoh') bdd-> @@ to_tsquery('french', 'un & petit & bateau'); ?column? ---------f

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 64

Recherche de texte avec tsearch2


Pour recherche dans une table :
select art_id, art_titre from articles where to_tsvector('french', art_texte) @@ to_tsquery('french', 'premier & homme & lune');

Pour amliorer la vitesse de recherche, il est possible de crer un index GIN :


create index idx_art_tsearch on articles using gin(to_tsvector('french', art_texte));

D'autres fonctions permettent de classer les rsultats (ts_rank et ts_rank_cd) ou mme de mettre en valeur dans le texte les termes recherchs (ts_headline).

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 65

Rles
Pour grer l'ensemble des droits d'accs, PostgreSQL utilise le concept des rles. Un rle peut reprsenter un utilisateur ou un groupe d'utilisateurs en fonction de la manire dont il est configur. Un rle peut : - tre propritaire d'objets de l'instance (bases de donnes, tables, etc.) ; - se voir octroyer des droits d'accs des objets ou des droit systme ; - tre membre d'un autre rle ; - se voir attribuer un mot de passe. Les rles remplacent donc les notions d'utilisateurs et de groupes qui taient encore utiliss par PostgreSQL 8.1. Les rles ne sont pas lis aux utilisateurs et groupes du systme d'exploitation. Ils sont associs une instance.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 66

Rles
Pour crer un rle :
CREATE ROLE nom_role [ [ WITH ] [ [ [ [ [ SUPERUSER ] [ CREATEDB ] CREATEROLE ] [ LOGIN ] ENCRYPTED PASSWORD 'mot_de_passe' ] IN ROLE nom_role [, ...] ] ROLE nom_role [, ...] ] ]

Seul l'administrateur ou un utilisateur disposant de l'attribut CREATEROLE peut crer un rle. Par exemple, pour crer un rle modlisant un utilisateur, on utilisera :
postgres=# create role sebastien login encrypted password 'blabla'; postgres=# \c postgres sebastien Password for user "sebastien": You are now connected to database "postgres" as user "sebastien". postgres=>

Pour supprimer un rle :


DROP ROLE [ IF EXISTS ] nom_role

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 67

Rles, groupes
Les rles sont galement utiliss pour modliser la notion de groupes d'utilisateurs. Il suffit pour cela de crer un rle sans mot de passe et ne disposant pas du privilge LOGIN. Par exemple, l'instruction suivante cre un rle (groupe) compta et lui associe deux autres rles. Ces derniers hriteront des droits octroys au rle compta :
create role compta role sebastien, dominique;

Cette instruction cre un autre rle (utilisateur) et l'ajoute au rle (groupe) compta :
create role daniel login encrypted password 'abcde' in role compta;

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 68

Droits
Le systme des droits de PostgreSQL est bas sur les rles et utilise les instructions SQL GRANT et REVOKE. Ces instructions sont utilises pour : - octroyer ou rvoquer des droits d'accs sur des objets ; - ajouter ou retirer des rles (utilisateurs) d'autres rles (groupes). Les rles dispose galement d'un certains nombres d'attributs : - LOGIN / NOLOGIN ; - SUPERUSER / NOSUPERUSER ; - CREATEDB / NOCREATEDB ; - CREATEROLE / NOCREATEROLE ; - PASSWORD. Ces attributs sont associs aux rles lors de leur cration (CREATE ROLE) ou avec l'instruction ALTER ROLE. Les rles qui disposent de l'attribut SUPERUSER contournent le systme des privilges (c'est--dire qu'ils ont tous les privilges).

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 69

Droits, accs aux objets


Par dfaut, seul le propritaire d'un objet (souvent son crateur) a accs cet objet. Des privilges supplmentaires peuvent tre associs aux objets avec l'instruction GRANT comme ceci :
GRANT { privilge [,...] | ALL } ON [ type_objet ] nom_objet [, ...] TO { nom_role | PUBLIC } [, ...] [ WITH GRANT OPTION ]

Les privilges octroys dpendent du type d'objet : - tables : SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER - squences : USAGE | SELECT | UPDATE - base de donnes : CREATE | CONNECT | TEMPORARY - fonctions : EXECUTE - langage : USAGE - schmas : CREATE | USAGE - espaces de tables : CREATE ALL reprsente tous les privilges et PUBLIC tous les rles. L'option WITH GRANT OPTION autorise le ou les rles cibles octroyer ces privilges.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 70

Droits, accs aux objets


La rvocation des droits utilise cette syntaxe :
REVOKE [ GRANT OPTION FOR ] { privilge [,...] | ALL } ON [ type_objet ] nom_objet [, ...] FROM { nom_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

Par exemple, pour rvoquer tous les droits sur le schma public :
revoke all on schema public from public;

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 71

Droits, accs aux objets


Exemple :
plop=# revoke all on schema public from public; REVOKE plop=# create table public.test (id int); CREATE TABLE plop=# insert into test values (1); INSERT 0 1 plop=# \c plop sebastien Password for user "sebastien": You are now connected to database "plop" as user "sebastien". plop=> select * from public.test; ERREUR: droit refus pour le schma public plop=> \c plop postgres You are now connected to database "plop" as user "postgres". plop=# grant select on table public.test to sebastien; GRANT plop=# grant usage on schema public to sebastien; GRANT plop=# \c plop sebastien Password for user "sebastien": You are now connected to database "plop" as user "sebastien". plop=> select * from public.test; id ---1 (1 row)
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 72

Droits, notion de groupes


Les instructions SQL sont galement utilises pour ajouter ou retirer des rles d'autres rles. Il est ainsi possible de simuler la notion de groupes. Par exemple :
plop=# create schema journal; CREATE SCHEMA plop=# create table journal.articles (id int, contenu text); CREATE TABLE plop=# create role utilisateurs; CREATE ROLE plop=# grant usage on schema journal to utilisateurs; GRANT plop=# alter role utilisateurs set search_path = 'journal'; ALTER ROLE plop=# create role lecteur in role utilisateurs; CREATE ROLE plop=# create role auteur in role utilisateurs; CREATE ROLE plop=# grant select on journal.articles to lecteur; GRANT plop=# grant insert, update on journal.articles to auteur; GRANT plop=# create role daniel login encrypted password 'blabla' in role lecteur; CREATE ROLE plop=# create role marc login encrypted password 'plopplop' in role auteur; CREATE ROLE
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 73

Droits, bonnes pratiques


Plusieurs politiques peuvent tre mises en uvre : 1) Une base de donnes est associe un rle utilisateur. En gnral le nom de la base de donnes est identique celui du propritaire. Souvent, une base de donnes est cre pour une application. 2) Un schma est associ un utilisateur. Le nom du schma est identique celui de l'utilisateur (cf. variable search_path dont la valeur par dfaut est "$user",public). 3) Un schma est associ un rle utilisateur, tous les objets utiliss par une application sont crs dans ce schma et appartiennent cet utilisateur qui est l'administrateur de l'application. Un rle groupe est cr, des droits lui sont affects pour utiliser les objets du schma. Les utilisateurs de l'application sont des rles utilisateurs et son membre du rle groupe.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 74

Espaces de tables
Un espace de tables (ou tablespace) est un rpertoire du systme de fichiers qui peut tre utilis pour stocker les donnes de relations (tables et indexes). Ils sont utiliss pour deux raisons : 1) Pour tendre des bases de donnes contraintes par la taille d'un systme de fichiers qui ne peut tre agrandi. 2) Plus frquemment, pour optimiser la vitesse d'excution des requtes en stockant, par exemple, les tables sur un disque et les indexes sur un autre. Les espaces de tables sont associs l'instance, ils sont dons disponibles pour l'ensemble des bases de donnes de l'instance.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 75

Espaces de tables
Pour crer un espace de tables :
CREATE TABLESPACE nom [ OWNER utilisateur ] LOCATION 'rpertoire'

Seul l'administrateur peut crer un espace de tables. Le propritaire par dfaut est l'utilisateur connect. Le rpertoire doit exister et l'utilisateur systme qui excute PostgreSQL doit y avoir accs en criture. Sous psql, \db permet de lister les espaces de tables existants. Ou :
SELECT spcname FROM pg_tablespace;

Seul un administrateur ou son propritaire peut dtruire un espace de tables. Pour supprimer un espace de tables :
DROP TABLESPACE [ IF EXISTS ] nom

Il ne peut l'tre s'il contient des objets. Mais il est possible de dplacer une table d'un espace de tables un autre :
ALTER TABLE nom_table SET TABLESPACE nom_espace
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 76

Espaces de tables
Par exemple :
# mkdir -m 700 /var/pg/u02/inst1 # chown postgres:postgres /var/pg/u02/inst1 # su - postgres -c psql Bienvenue dans psql 8.2.7, l'interface interactive de PostgreSQL. postgres=# create tablespace tbl_data location '/var/pg/u02/inst1'; CREATE TABLESPACE postgres=# \c test You are now connected to database "test". test=# \db List of tablespaces Name | Owner | Location ------------+----------+------------------pg_default | postgres | pg_global | postgres | tbl_data | postgres | /var/pg/u02/inst1 (3 rows) test=# create table big_data (id int, data text) tablespace tbl_data; CREATE TABLE postgres=# \!ls -l /var/pg/u02/inst1 total 8 drwx------ 2 postgres postgres 4096 jan 23 11:56 16390 -rw------- 1 postgres postgres 4 jan 23 11:50 PG_VERSION
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 77

Langages procduraux
Pour crire des procdures stockes excutables sur le serveur de bases de donnes, PotgreSQL permet l'utilisation de plusieurs langages, notamment : - PL/pgSQL, le langage procdural fournit avec PostgreSQL ; - PL/Perl ; - PL/Python ; - PL/Tcl ; - PL/Java. Ces langages sont implments par des bibliothques externes et ils doivent tre crs avant d'tre utiliss. l'exception, du langage PL/pgSQL, ces bibliothques sont souvent disponibles dans des paquets spars des distributions Linux. Pour obtenir la liste des langages crs dans une base de donnes :
postgres=# select lanname from pg_language where lanispl = true; lanname --------(0 rows)

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 78

Langages procduraux
Pour obtenir la liste des langages disponibles pour une base de donnes :
postgres=# select tmplname, tmpltrusted from pg_pltemplate; tmplname | tmpltrusted -----------+------------plperl | t plperlu | f plpgsql | t plpythonu | f pltcl | t pltclu | f (6 rows)

Un langage dit sr (trusted) est un langage qui ne permet pas d'outrepasser le systme des privilges de PostgreSQL. Seul les rles disposants de l'attribut administrateur auront l'autorisation de crer des fonctions crites avec un langage non sr (untrusted). Pour crer un langage dont un modle est disponible, par exemple PL/pgSQL :
postgres=# create language plpgsql; CREATE LANGUAGE

Le privilge USAGE est octroy PUBLIC pour un langage sr lors de sa cration.


(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 79

PL/pgSQL, fonctions
Par exemple, si le fichier repete.sql contient ce code :
create function repete(str varchar, nb int) returns varchar as $$ declare res varchar := ''; begin for i in 1..nb loop res := res || str; end loop; return res; end; $$ language plpgsql;

Alors, la cration et l'excution de cette fonction se font ainsi :


plop=# \i repete.sql CREATE FUNCTION plop=# select repete('x', 20); repete ---------------------xxxxxxxxxxxxxxxxxxxx (1 row)
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 80

PL/pgSQL, procdures
Les procdures PostgreSQL sont des fonctions qui retournent void. Par exemple :
drop table if exists scores; create table scores ( equipe varchar(20), points int ); create or replace function maj_points( i_equipe varchar, i_score int ) returns void as $$ begin update scores set points = points + i_score where equipe = i_equipe; if not found then insert into scores ( equipe, points ) values ( i_equipe, i_score ); end if; end; $$ language plpgsql;

Cette procdure stocke est cre et utilise ainsi :


postgres=# select maj_points( 'Grand-Champ', 10 ); maj_points -----------(1 row) plop=# select * from scores; equipe | points -------------+-------Grand-Champ | 10 (1 row)
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 81

Dclencheurs
Les dclencheurs (ou triggers) sont des fonctions qui sont excutes automatiquement lorsqu'une action spcifique (insertion, mise--jour, suppression d'enregistrements) a lieu sur une table. Les dclencheurs sont crs avec cette instruction SQL :
CREATE TRIGGER nom [ BEFORE | AFTER ] { vnement [ OR ... ] } ON table [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDURE fonction ( paramtres )

Les vnements autoriss sont INSERT, UPDATE ou DELETE. Une image de l'enregistrement en cours de traitement est disponible dans les pseudoenregistrements NEW (pour les insertions et mises--jour) et OLD (mises--jour et suppression). Un dclencheur appelle une fonction, il est donc ncessaire de commencer par crire cette fonction.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 82

Dclencheurs, premier exemple


Une utilisation des dclencheurs est, parmi d'autres, l'historisation des modifications de valeurs sur une table. Par exemple :
drop table if exists histo; create table histo (equipe varchar(20), jour date, avant int, apres int); create or replace function trig_histo_scores() returns trigger as $$ begin if OLD.points <> NEW.points then insert into histo ( equipe, jour, avant, apres ) values ( NEW.equipe, current_date, OLD.points, NEW.points ); end if; return NEW; end; $$ language plpgsql; drop trigger if exists trig_after_update_scores on scores; create trigger trig_after_update_scores after update on scores for each row execute procedure trig_histo_scores();

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 83

Dclencheurs, premier exemple


Suite de l'exemple :
plop=# \i histo.sql DROP TABLE CREATE TABLE CREATE FUNCTION DROP TRIGGER CREATE TRIGGER postgres=# select maj_points( 'Grand-Champ', 5 ); maj_points -----------(1 row) postgres=# select * from scores; equipe | points -------------+-------Grand-Champ | 15 (1 row) postgres=# select * from histo; equipe | jour | avant | apres -------------+------------+-------+------Grand-Champ | 2008-05-09 | 10 | 15 (1 row)

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 84

Dclencheurs, second exemple


Autre exemple :
create or replace function trig_update_timestamp() returns trigger as $$ begin NEW.when_modified = current_timestamp; NEW.who_modified = current_user; return NEW; end; $$ language plpgsql; create or replace function trig_insert_timestamp() returns trigger as $$ begin NEW.when_created = current_timestamp; NEW.who_created = current_user; return NEW; end; $$ language plpgsql; drop trigger if exists trig_before_update_testtg on testtg; create trigger trig_before_update_testtg before insert or update on testtg for each row execute procedure trig_update_timestamp(); drop trigger if exists trig_before_insert_testtg on testtg; create trigger trig_before_insert_testtg before insert or update on testtg for each row execute procedure trig_insert_timestamp();

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 85

Les extensions en C
Le serveur PostgreSQL est extensible : il est possible d'crire de nouvelles fonctions en C et de les compiler sous forme de bibliothques dynamiques utilisables ensuite dans les instructions SQL. Une fois la bibliothque compile et place au bonne endroit, il suffit d'utiliser l'instruction create function ainsi :
CREATE [ OR REPLACE ] FUNCTION nom ( [ paramtres... ] ) [ RETURNS type ] LANGUAGE c AS 'fichier', 'symbole'

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 86

Programmation ct client PHP


La version 5 de PHP offre un pilote gnrique pour l'accs aux donnes, PDO (PHP Data Objects), compatible avec PostgreSQL. Par exemple :
<?php header("Content-Type: text/plain; charset=ISO-8859-1"); $user = 'sebastien'; $pass = 'plopplop'; $dsn = 'pgsql:host=localhost;dbname=test'; try { $dbh = new PDO($dsn, $user, $pass); foreach ( $dbh->query('select * from articles') as $row ){ print_r($row); } $dbh = null; } catch (PDOException $e) { print "Erreur ! : " . $e->getMessage(); die(); } ?>
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 87

Programmation ct client Java


Un pilote JDBC de type IV est disponible sur le site de PostgreSQL cette adresse : http://jdbc.postgresql.org/ Il est recommand d'utiliser un gestionnaire de sessions JNDI dans les serveurs d'applications afin d'optimiser la gestion des connexions. Par exemple :
import java.sql.*; Class.forName("org.postgresql.Driver"); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("select * FROM articles"); while ( rs.next() ){ System.out.println(rs.getString(1)); } rs.close(); st.close();

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 88

Partie 3

Administration, exploitation

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 89

Les journaux binaires


Les journaux binaires sont utiliss pour garantir la durabilit (le D de ACID) des transactions valides en vitant de grever significativement les performances. Plutt que d'crire directement dans les fichiers de donnes chaque fois qu'une transaction est valide, les donnes modifies sous crites dans un journal linaire. De nombreux dplacement des ttes de lecture des disques sont ainsi vits. Ce journal linaire est lui-mme enregistrs squentiellement dans des fichiers du rpertoire $PGBASE/pg_xlog dont le nom est un entier qui est incrment. Sous PostgreSQL, ces journaux sont appels WAL (Write Ahead Logs). intervalles rguliers un mcanisme appel point de contrle (checkpoint) permet de basculer les transactions prsentes dans les journaux binaires vers les fichiers de donnes. Le processus wal writer process est charg de cette tche. Si un arrt intempestif survient, PostgreSQL utilise les journaux binaires pour appliquer aux fichiers de donnes les modifications gnres par les dernires transactions valides avant l'arrt.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 90

Les journaux binaires


chaque point de contrle un enregistrement spcifique est crit dans les journaux binaires. Toutes les donnes antrieures contenues dans ces journaux deviennent inutiles. Les fichiers (appels segments) qui contiennent des journaux binaires dont toutes les donnes sont antrieures au dernier point de contrle sont recycls. Les journaux binaires peuvent galement tre archivs. Ils permettent ainsi d'effectuer une sauvegarde au fil de l'eau et fournissent un mcanisme de retour en arrire (nomm PITR, pour Point-In-Time Recovery). Un point de contrle est excut lorsque l'une de ces situations survient : - checkpoint_segments segments sont actifs ; - checkpoint_timeout secondes ce sont coules depuis le dernier point de contrle ; - l'instruction checkpoint est excute. La taille des segments est fige (16 Mo par dfaut). Si la base de donnes subit une forte activit transactionnelle, les performances seront largement amliores si les fichiers de donnes sont stocks sur des disques diffrents des journaux binaires.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 91

Gestion de la mmoire
Pour dterminer les valeurs des paramtres de PostgreSQL lis l'utilisation de la mmoire, il est ncessaire de garder l'esprit que ces zones de mmoires peuvent tre partages en deux grandes catgories : 1) les zones de mmoires locales alloues par processus ; 2) les zones de mmoires partages entre tous les processus de l'instance. Ces paramtres sont fixs dans le fichier postgresql.conf. Elles sont exprimes en Ko, mais il est possible d'utiliser des units de taille dans le fichier de configuration. Dans psql, il est possible de voir les valeurs avec l'instruction show et de les modifier avec l'instruction set pour celles qui peuvent l'tre en fonctionnement. Par exemple :
postgres=# show work_mem; work_mem ---------2MB (1 row) postgres=# set work_mem = 4096; SET
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 92

Gestion de la mmoire
Il y a essentiellement six paramtres importants : shared_buffers (32 Mo par dfaut, mmoire partage) Tampons de mmoire partage entre tous les processus (ne peut dpasser SHMMAX). La valeur de ce paramtre a un impact important sur les performances. temp_buffers (8 Mo par dfaut, mmoire locale) Taille maximum des tampons locaux pour l'accs aux tables temporaires. work_mem (1Mo par dfaut, mmoire locale) Mmoire utilise pour les oprations de tri et hash en avant utilisation du disque. maintenance_work_mem (16Mo, mmoire locale) Mmoire utilise pour les oprations de maintenance (vacuum, create index, etc.) Peu d'utilisations simultanes, possibilit d'augmenter significativement. max_stack_depth (2Mo par dfaut, mmoire locale) Taille maximum de la pile d'excution (utiliser ulimit -s moins 1 ou 2 Mo). Peut gner l'excution de requtes ou procdures complexes si trop faible. wal_buffers (64 Ko par dfaut, mmoire partage) Doit tre assez grand pour stocker les donnes d'une transaction type.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 93

Le collecteur de statistiques
Le collecteur de statistiques est un processus (stats collector process) qui maintient un certains nombres de compteurs qui aident l'optimiseur de requtes fournir des plans d'excution optimaux. Ces indicateurs sont galement utiles pour l'administration de la base de donnes. La collecte des statistiques est active avec le paramtre track_counts. Les statistiques collectes sont accessibles par l'intermdiaire des vues pg_stat_* et pg_statio_* ainsi que des fonctions pg_stat_get_* du catalogue pg_catalog. La fonction pg_stat_reset permet de rinitialiser les statistiques de la base de donnes active.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 94

Le journal d'activit
Le journal d'activit est l'endroit o PostgreSQL consigne l'ensemble des messages gnrs pendant son excution, du plus insignifiant l'erreur fatale selon la configuration des paramtres du fichier postgresql.conf : log_destination logging_collector log_directory log_statement une combinaison de stderr, csvlog, syslog et eventlog (Windows) active l'envoi des messages vers des fichiers rpertoire dans lequel seront enregistrs ces fichiers crire les requtes excutes (none, ddl, mod ou all)

Des dizaines d'autres paramtres sont disponibles pour slectionner les informations qui doivent tre envoyes dans le journal d'activit.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 95

Catalogue systme
Le catalogue pg_catalog contient notamment : - l'ensemble des fonctions et types implmentes par le moteur de PostgreSQL ; - un ensemble de tables dont certaines en criture servent contrler certains aspects du fonctionnement du serveur ; - un ensemble de vues permettant de comprendre le comportement de l'instance.
Par exemple : La table pg_autovacuum permet de contrler le nettoyage automatique des tables. La table pg_database contient la liste des bases de donnes de l'instance. La table pg_tablespace contient la liste espaces de table de l'instance. La table pg_namespace contient la liste des schmas de la base de donnes. La vue pg_roles liste les rles prsents dans l'instance. La vue pg_stat_activity liste l'activit (les sessions) sur le serveur. La vue pg_stat_user_tables donne des statistiques sur les tables de la base de donnes. La vue pg_stat_user_index donne des statistiques sur les index de la base de donnes.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 96

Sauvegardes
Trois stratgies de sauvegardes sont possibles : 1) Export partir d'une base de donnes active en utilisant le programme pg_dump. 2) Sauvegarde des fichiers de l'instance lorsqu'elle est arrte. 3) Archivage des journaux des transactions. L'outil pg_dump est intressant car : - il permet de transfrer rapidement des donnes entre bases de donnes ; - il support trois types de format, dont le SQL ; - il est simple d'emploi. Mais il ne peut sauvegarder des bases de taille importante.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 97

Sauvegardes, pg_dump
La commande pg_dump exporte une base de donnes d'une instance. Elle peut tre excute sur le serveur PostgreSQL (connexion par socket Unix) ou partir d'une machine du rseau (avec les mmes options -h et -p que psql). L'outil pg_dump supporte trois types de format : 1) Format texte (par dfaut), les donnes seront restaures avec psql. 2) Format tar, les donnes seront restaures avec pg_restore. 3) Format spcifique, restauration avec pg_restore. Par exemple :
$ pg_dump -h 192.168.2.42 -p 5433 compta > compta.sql

Quelques options : -C ajouter les commandes pour crer la base de donnes dans l'export -a n'exporter que les donnes (LMD) -s n'exporter que le schma (LDD) -Ft utiliser le format tar -Fc utiliser le format spcifique
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 98

Sauvegardes, pg_restore
Pour restaure un export ralis au format texte :
$ pg_dump -h 192.168.2.42 -p 5433 -U postgres -C compta > compta.sql $ psql -h 192.168.2.42 -p 5433 -U postgres postgres < compta.sql

Autres exemples :
$ pg_dump -h host1 db | psql -h host2 db $ pg_dump db | gzip > db.sql.gz $ zcat db.sql.gz | psql db

Pour les formats tar et spcifique, la restauration est faite avec pg_restore :
$ pg_dump -Ft db > db.tar $ dropdb db $ pg_restore -C -d postgres < db.tar $ pg_dump -Fc db > db.dump $ dropdb db $ pg_restore -C -d postgres < db.dump $ pg_dump -Fc db > db.dump $ createdb copy $ pg_restore -d copy < db.dump
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 99

Sauvegardes, systme de fichiers


l'exception de cas simples, la sauvegarde des fichiers d'une instance doit se faire lorsque celle-ci est arrte. Si la taille des fichiers de l'instance est importante, l'utilisation d'un gestionnaire de volumes logiques avec possibilit de raliser des clichs peut aider rduire les temps d'interruption. Le rpertoire de l'instance doit tre sauvegard ainsi que les rpertoires des espaces de tables supplmentaires. Le principe est le suivant :
$ pg_ctl stop $ tar czfC /backups/AAAA-MM-JJ.tar.gz / var/pg/u01/inst1 var/pg/u02/inst1 $ pg_ctl start

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 100

Sauvegarde en continu (journaux des transactions)


Les journaux des transactions (WAL) contiennent les donnes de toutes les transactions excutes sur une instance. L'ide de la sauvegarde en continu consiste sauvegarder chacun de ces journaux ds qu'il est rempli ou lorsqu'un dlai est dpass. Ces journaux pourront ensuite tre rejous sur une base de donnes restaures partir d'une sauvegarde complte. Deux tapes sont ncessaires : 1) Activer l'archivage des journaux des transactions. 2) Excuter rgulirement une sauvegarde complte de l'instance. L'archivage des journaux est contrl avec ces options de postgresql.conf :
archive_command = test ! -f /mnt/logarch/%f && cp %p /mnt/logarch/%f archive_timeout = 1h

%f est le nom du fichier qui contient le journal archiver, %p contient son chemin complet (relativement $PGDATA). La commande doit retourner le code sortie 0 si la copie a t ralise correctement.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 101

Sauvegarde en continu (journaux des transactions)


Les sauvegardes compltes de l'instance doivent tre ralises d'une manire particulire : 1) Excution de la function SQL pg_start_backup. 2) Sauvegarde des fichiers de l'instances l'exception du rpertoire pg_xlog. 3) Excution de la fonction pg_stop_backup. Par exemple :
$ psql postgres=# postgres=# $ tar czfC $ psql postgres=# postgres=# select pg_start_backup(Sauvegarde du AAAA-MM-JJ); \q /backups/AAAA-MM-JJ.tar.gz / var/pg/u01/inst1 var/pg/u02/inst1 select pg_stop_backup(); \q

L'tiquette est conserve dans le fichier $PGDATA/backup_label. Un fichier $PGDATA/pg_xlog/0000000100001234000055CD.007C9330.backup est cr pour indiquer le dernier journal utilis avant la sauvegarde.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 102

Sauvegarde en continu, restauration


Le processus de restauration est assez complexe, il est recommand de l'crire dans une procdure et de la rejouer rgulirement afin de valider que l'environnement ncessaire la restauration n'a pas chang. Le schma est le suivant : 1) Installer un nouveau serveur identique ou arrter l'instance actuelle. 2) Si disponibles, mettre de ct les journaux du rpertoire $PGDATA/pg_xlog. 3) Supprimer tous les fichiers et rpertoires de l'instance et ses espaces de tables. 4) Restaurer la sauvegarde complte en prenant garde rtablir les permissions. 5) Supprimer les fichiers dans $PGDATA/pg_xlog ou recrer ce rpertoire. 6) S'asssurer que le rpertoire $PGDATA/pg_xlog/archive_status existe. 7) Recopier les journaux ventuellement mis de ct en 2) dans $PGDATA/pg_xlog. 8) Crer un fichier recovery.conf dans $PGDATA partir de recovery.conf.sample. 9) Dmarrer PostgreSQL en s'assurant que les utilisateurs ne pourront se connecter. Les deux paramtres importants de recovery.conf sont :
restore_command = 'cp /mnt/logarch/%f %p' #recovery_target_time = '2008-04-23 11:20:55 EST'
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 103

L'analyse des requtes avec explain


Pour chaque requte, l'optimiseur labore un plan d'excution. De sa pertinence dpend la performance du serveur. L'instruction explain permet d'afficher le plan d'excution prvu pour une requte :
EXPLAIN [ ANALYZE ] requte

La requte ne sera pas excute moins que la clause analyze ne soit utilise. Pour tre certain de ne modifier aucune donne, utiliser :
bdd=> begin; bdd=> explain analyze requte; bdd=> rollback;

Chaque ligne correspond un nud d'excution, pour chaque nud sont affiches les informations suivantes : - le type de l'action (parcours squentiel, parcours d'un index, jointure, etc.) ; - le cot estim pour le dmarrage du parcours ; - le cot total estim ; - le nombre estim de lignes renvoyes par le nud d'excution ; - la largeur moyenne estime des lignes.
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 104

L'analyse des requtes avec explain


Avec la clause analyze, les donnes estimes sont compltes par les donne relles. Par exemple :
pagila=# explain select count(*) from film where language_id=1; QUERY PLAN -------------------------------------------------------------Aggregate (cost=69.00..69.01 rows=1 width=0) -> Seq Scan on film (cost=0.00..66.50 rows=1000 width=0) Filter: (language_id = 1) (3 rows) pagila=# explain analyze select count(*) from film where language_id=1; QUERY PLAN ----------------------------------------------------------------------------------------------------------Aggregate (cost=69.00..69.01 rows=1 width=0) (actual time=5.086..5.088 rows=1 loops=1) -> Seq Scan on film (cost=0.00..66.50 rows=1000 width=0) (actual time=0.014..2.558 rows=1000 loops=1) Filter: (language_id = 1) Total runtime: 5.135 ms (4 rows)

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 105

L'analyse des requtes avec explain


explain nous permet de comparer les plans d'excution avec ou sans utilisation d'un index :
pagila=# explain select rental_id from rental where return_date is null; QUERY PLAN ---------------------------------------------------------Seq Scan on rental (cost=0.00..294.44 rows=166 width=4) Filter: (return_date IS NULL) (2 rows) pagila=# create index idx_rental_return on rental (return_date); CREATE INDEX pagila=# explain select rental_id from rental where return_date is null; QUERY PLAN ---------------------------------------------------------------------------------Index Scan using idx_rental_return on rental (cost=0.00..32.97 rows=166 width=4) Index Cond: (return_date IS NULL) (2 rows)

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 106

La reconstruction d'index avec reindex


L'instruction reindex permet de reconstruire le contenu d'un index partir des donnes de la table. Cela peut tre ncessaire : - si l'index est corrompu ; - s'il est trop fragment ; - si l'un de ses paramtres a chang (soit, fillfactor). Plusieurs syntaxes sont possibles :
REINDEX INDEX nom_index REINDEX TABLE nom_table REINDEX DATABASE nom_bdd

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 107

chantillonnage avec analyze


L'instruction analyze est utilise pour chantillonner les donnes contenues dans une table. Ces informations statistiques sont stockes dans la table pg_statistic du catalogue pg_catalog. L'optimiseur de requtes les utilisera afin d'laborer le meilleur plan d'excution. Il est donc important de les mettre jour rgulirement. Sa syntaxe est :
ANALYZE [ VERBOSE ] nom_table

Par exemple :
pagila=# analyze verbose rental; INFO: analyzing "public.rental" INFO: "rental": scanned 134 of 134 pages, containing 16045 live rows and 7 dead rows; 3000 rows in sample, 16045 estimated total rows ANALYZE

Les statistiques ainsi chantillonnes ne doivent pas tre confondues avec celles qui sont maintenues par le collecteur de statistiques (processus stats collector process).
(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 108

Vacuum
Le processus nomm Vacuum (littralement aspirateur ) doit tre excut rgulirement sur une base de donnes PostgreSQL. Il permet de : - rcuprer l'espace libr suite la mise--jour ou la suppression d'enregistrements ; - mettre jour les statistiques utilises par l'optimiseur de requtes (analyze) ; - prvenir la perte d'anciennes donnes par la rotation des identifiants de transaction. Avant PostgreSQL 8.1, ce processus devait tre planifi intervalles rguliers. Depuis, un processus (Autovacuum) prend en charge son excution. La procdure peut tre excute pendant que la base de donnes est utilise. Mais : - un ralentissement sera perceptible ; - les instructions qui modifient le schma (LDD) ne pouront pas tre utilises. Pour rduire le temps ncessaire l'excution de Vacuum, certains paramtres peuvent tre ajusts. Par exemple, les tables qui contiennent des enregistrements qui sont peu modifis et rarement supprims n'ont pas besoin d'tre nettoyes aussi souvent que d'autres tables plus volatiles .

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 109

Autovacuum
Pour excuter le processus vacuum manuellement, la syntaxe est :
VACUUM [ FULL ] [ ANALYZE ] table

L'option full permet de rcuprer tout l'espace libre (dfragmentation), mais le processus peut s'avrer bien plus long et ncessite la pose d'un verrou exclusif sur les tables. L'option analyze dclenche, en plus, l'chantillonnage des statistiques. partir de la version 8.1 de PostgreSQL, un dmon, pg_autovocuum (processus autovacuum launcher process), est charg d'excuter rgulirement les processus vacuum et analyze sur les tables de l'instance. Pour le configurer, modifier ces paramtres de postgresql.conf :
autovacuum = on superuser_reserved_connections = 4 autovacuum_naptime = 5min

Puis redmarrer PostgreSQL.


(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 110

Optimisation
L'optimisation d'une base de donnes dpend de plusieurs paramtres : - le schma de la base de donnes (tables, index, vues, dclencheurs) ; - sa volumtrie ; - son usage (OLTP, data warehouse). Les informations utiles sont obtenues : - dans le journal d'activit ; - dans les objets du catalogue pg_catalog ; - en excutant l'instruction explain ; - partir du rsultat de l'instruction vacuum. Les rglages sur lesquels il est possible d'intervenir sont : - les paramtres du fichier postgresql.conf ; - le matriel (mmoire, disques durs, processeur) ; - les paramtres du systme d'exploitation.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 111

Partie 1

Notions avances

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 112 (c) 2008, Sbastien Namche (sebastien@nameche.fr) - 112

Le gestionnaire de connexions PgPool


PgPool est hberg sur pgFoundry. Il permet de : - limiter le nombre de connexions au serveur PostgreSQL ; - rutiliser des sessions dont les proprits sont identiques ; - rpliquer les instructions SQL vers plusieurs serveurs ; - distribuer l'excution des requtes sur plusieurs serveurs ; - rpartir l'excution d'une requte sur plusieurs serveurs (paralllisation). Le site du projet est : http://pgpool.projects.postgresql.org/

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 113

Le gestionnaire de connexions PgPool

Une interface Web, pgPoolAdmin, peut tre utilise pour la gestion de pgPool.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 114

Notions avances
PostgreSQL gre les types avancs suivants : - domaines ; - tableaux ; - types composites. Les relations (tables) peuvent hrites les unes des autres. Le mcanisme Toast permet de stocker des lignes de taille importante. Les espaces libres dans les fichiers de donnes sont grs par l'intermdiaire d'un mcanisme connu sous le nom de FSM (Free Space Map). Un systme de rgles (rules) permet de dtourner l'excution des instructions LMD sur les relations (tables et vues). Le langage procdural PL/pgSQL dispose de la notion de curseur.

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 115

Rfrences
Livres PostgreSQL 2me dition - Sbastien Lardire ENI ditions Sites Web Site officiel http://www.postgresql.org/ Site de la communaut francophone http://www.postgresqlfr.org/ Site du projet pgAdmin http://www.pgadmin.org/

(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 116

Pour en savoir plus...


Sbastien Namche
Conseil
Architecture des systmes et rseaux Scurit transverse

Formation
Logiciels Libres Systmes Unix Rseaux et protocoles IP Base de donnes (Oracle, PostgreSQL, MySQL) annuaires Messageries Supervision

Mob. +33 6 0373 1442 http://sebastien.nameche.fr sebastien@nameche.fr


(c) 2008, Sbastien Namche (sebastien@nameche.fr) - 117

Vous aimerez peut-être aussi