{{tag>sgbd serveur réseau BROUILLON}}
----
====== PostgreSQL ======
===== Introduction =====
PostgreSQL est un système de gestion de bases de données (SGBD) très performant sous licence BSD dont les performances sont comparables à Oracle 9.
Il propose de très nombreuses fonctionnalités, tout en respectant les standards SQL : SQL 92, 99 et en partie la norme SQL2003. En outre, il intègre plusieurs langages embarqués (Perl, Python, Java) depuis de nombreuses années. [[http://www.postgresql.org/about/|Pour en savoir plus]]
===== Documentation =====
La documentation ainsi que d'autres informations sont disponibles sur le [[http://www.postgresql.org/|site officiel de PostgreSQL]].
La communauté [[http://www.postgresqlfr.org/|postgresqlfr.org]] la reprend en français.
Il semble que l'installateur sur Ubuntu hardy 8.04 ne fasse pas tout : [[https://bugs.launchpad.net/ubuntu/+source/postgresql-common/+bug/193696|bug launchpad]] avec pour conséquence le message :
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Pour régler ceci il faut entrer dans le terminal :
sudo pg_createcluster 8.3 main --start
===== Installation du serveur PostgreSQL=====
On commence par [[:tutoriel/comment_installer_un_paquet|installer]] le paquet [[apt://postgresql|postgresql]].
Cela installera également les paquets suivants :
* openssl
* openssl-blacklist
* postgresql
* postgresql-8.4
* postgresql-client-8.4
* postgresql-client-common
* postgresql-common ssl-cert
Notez que l'installation ajoute l'utilisateur postgres à la liste des utilisateurs. Utilisez finger si vous souhaitez de plus amples informations sur ce nouvel utilisateur.
finger postgres
==== L'utilisateur postgres ====
PostgreSQL est un serveur qui permet de se connecter à différentes bases de données. Par défaut, seul l'utilisateur //postgres// peut se connecter.
Toutes les opérations d'administration se font, au départ, avec l'utilisateur //postgres//. À la fin de l'installation, celui-ci ne possède pas de mot de passe : c'est un utilisateur bloqué et le mieux est qu'il le reste. La première chose à faire sera de créer un nouvel utilisateur, mais pour ce faire, il faut se connecter au moins une fois en tant qu'utilisateur //postgres//. Pour devenir //postgres// et faire les opérations d'administration qui suivent, utilisez sudo :
$ sudo -s -u postgres
Password:
**exit** permettra, à la fin de cette session d'administration dans PostgreSQL, de reprendre la main en tant qu'utilisateur du système.
Il se peut que cette authentification retourne une erreur liée au fait qu'il est impossible pour //postgres// de lire, par exemple, le fichier ~/.bashrc (si un terminal bash est utilisé). La commande chmod ug+r ~/.bashrc règlera ce problème.
Désormais, l'invite de commande doit mentionner que vous êtes actif en tant que //postgres//. Pour lancer l'outil d'administration de PostgreSQL, tapez simplement :
psql
Vous devriez obtenir quelque chose comme :
Bienvenue dans psql 8.2.3, l'interface interactive de PostgreSQL.
Tapez: \copyright pour les termes de distribution
\h pour l'aide-mémoire des commandes SQL
\? pour l'aide-mémoire des commandes psql
\g ou point-virgule en fin d'instruction pour exécuter la requête
\q pour quitter
postgres=#
Notez que vous avez une interface en ligne de commande, et que vous êtes connecté en tant que "root", comme l'indique le ''#'' en bout de ligne.
Cette ligne de commande sera bien sûr utilisée pour exécuter des requêtes SQL, et aussi des commandes internes à postgreSQL (elles commencent toutes par un antislash)
==== Créer un utilisateur PostgreSQL ====
=== Méthode rapide, non sécurisée ===
''postgres'' est à psql ce que ''root'' est à Ubuntu. Il ne faut l'utiliser que pour les tâches d'administration, en aucun cas s'en servir pour un applicatif, sinon vous allez créer une faille de sécurité.
Par facilité, nous allons assimiler les utilisateurs du système à ceux qui se connecteront avec psql, mais ce n'est nullement obligatoire. Par la suite, nous supposerons que votre login système est ''nom_utilisateur''.
Commencez par créer un nouvel utilisateur, qui portera par exemple le même nom que vous. Dans la ligne de commande ci-dessous, tapez (rappel : la partie « postgres=# » est l'invite de commande, il ne faut pas la retaper ! Ainsi, la commande ci-dessous requiert de taper « CREATE USER ; », en remplaçant par un identifiant bien choisi) :
postgres=# CREATE USER ;
N'oubliez pas le point-virgule à la fin...
Par défaut, votre nouvel utilisateur n'a aucun droit.
Donnez-lui la possibilité de créer de nouvelles bases de données :
postgres=# ALTER ROLE WITH CREATEDB;
Ensuite, créez une base de données pour votre utilisateur. Par exemple, vous pouvez prendre comme nom : ''nom_utilisateur''. Ainsi, la connexion sera automatique.
postgres=# CREATE DATABASE OWNER ;
Attribuer un mot de passe à l'utilisateur pour qu'il puisse se connecter à la base (le ENCRYPTED permet l'utilisation de md5 dans le pg_hba.conf) :
postgres=# ALTER USER WITH ENCRYPTED PASSWORD 'mon_mot_de_passe';
Vous pouvez maintenant quitter, "redevenir vous-même" et relancer psql directement, en étant cette fois connecté sous votre propre nom :
postgres=# \q
postgres@ubuntu:~$ exit
nom_utilisateur@ubuntu:~$ psql nom_base_de_donnee
La ligne de commande est devenue :
nom_base_de_donnee=>
Notez la transformation du # en > : vous n'êtes plus superutilisateur...
==== Pour aller plus loin ====
=== Méthode alternative pour créer un utilisateur ===
Vous pouvez aussi créer vos utilisateurs directement en ligne de commande, depuis le terminal standard, mais en étant connecté en tant que postgres, bien sûr.
Cette méthode est beaucoup plus sûre que la précédente.
Tous les utilisateurs auront des mots de passe chiffrés.
(Ce qui n'est pas le cas lorsque l'on emploie la méthode précédente)
Il faut d'abord modifier le fichier de configuration pour autoriser les connexions via mot de passe chiffré :
sudo nano /etc/postgresql/x.x/main/pg_hba.conf
Remplacez "x.x" par le numéro de version de PostgreSQl installée sur votre ordinateur (exemple : 8.3).
Les utilisateurs "avancés" noteront que le fichier est amplement commenté.
Voir la [[http://www.postgresql.org/docs/8.2/static/index.html|documentation]] pour plus d'informations.
Si vous changez la sécurité, avant de relancer postgresql pensez à donner un mot de passe à l'utilisateur postgres (voir plus bas)
Modifier le fichier en remplaçant **ident sameuser** par **md5** afin d'obtenir les lignes suivantes :
...
local all postgres md5
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
On peut ensuite créer notre utilisateur :
$ sudo -s -u postgres
$ createuser
Vous devrez ensuite répondre à une série de questions :
Le nouvel rôle est-il superutilisateur ? (o/n) n
Le nouvel rôle est-il autorisé à créer des bases de données ? (o/n) o
Le nouvel rôle est-il autorisé à créer de nouveaux rôles ? (o/n) n
En revanche, ici l'utilisateur n'est pas encore opérationnel, et il faut lui attribuer un mot de passe :
$ psql -d template1 -c "alter user with password ''"
Notez bien les guillemets simples autour du mot de passe ...
darkhack : personnellement j'ai eu un problème de casse sensitive (gestion majuscule minuscule) passant par cette méthode.
au lieux de faire l'opération en deux lignes de commande :
$ createuser
$ psql -d template1 -c "alter user with password ''"
J'ai résolu mon affaire en faisant uniquement :
$ createuser -P
ainsi, le programme vous demandera naturellement 2 fois votre mot de passe.
Puis, on lui crée une base de données dédiée :
$ createdb -O -E UTF8
Par précaution, on ajoute un mot de passe postgres :
(C'est un mot de passe POUR psql)
Les utilisateurs postgres n'ont a priori rien à voir avec les utilisateurs système, mais il peut être intéressant de garder un parallèle entre les deux :
$ psql -d postgres -c "ALTER USER postgres WITH PASSWORD 'mot_de_passe'"
Il faut enfin relancer le serveur psql pour que les modifications de mots de passe soient prises en compte :
$ sudo /etc/init.d/postgresql-8.3 restart
Attention ! Le mot de passe à entrer est celui de postgres si vous êtes connecté sous ce nom-ci. (postgres a les droits d'administration standards)
Ensuite, on peut se connecter via :
$ psql -U
Mot de passe pour l'utilisateur :
ou, si le nom de la base de l'utilisateur n'est pas le même que celui de l'utilisateur :
$ psql -U
Mot de passe pour l'utilisateur :
=== Tuning ===
Le tuning d'un serveur postgreSQL se fait grâce au fichier **postgresql.conf** généralement positionné dans **/etc/postgresql/8.3/main/**
Plusieurs paramètres sont faciles à modifier et peuvent apporter un gain de performance important:
* **shared_buffers** = peut être positionné à 25% de la RAM pour un serveur dédié. Attention de ne pas trop monter ce paramètre tout de même car il faut laisser de la RAM au noyau pour gérer son cache
* **wal_buffers** = il est raisonnable de la passer à 8MB
* **work_mem** = à ajuster en fonction du nombre de connexion à la base, valeur entre 10MB et 100MB
* **maintenance_work_mem** = mémoire allouée aux actions de maintenance. Dépend de la taille des bases et de la RAM dispo. Perso, je l'a met à 25% de la RAM
* **checkpoint_segments** = mettre au moins 10
* **effective_cache_size** = pour un serveur dédié compter 2/3 de la RAM
Ces quelques paramètres doivent suffire dans la majorité des cas. Si vous souhaitez aller plus loin dans le tuning de PostgreSQL, je vous conseille d'aller voir là [[http://docs.postgresqlfr.org|documentation PostgreSQL]] (qui existe en français)
=== Rôles, privilèges ===
>En cours de rédaction ... On attend !!!!!!!!!!!!!
=== Gestion des connexions ===
>En cours de rédaction ...
=== ajout de contributions ===
Différentes contributions sont disponibles (cf la [[http://docs.postgresqlfr.org/8.4/contrib.html|documentation PostgreSQL]]). Leur installation (et désinstallation) est facilitée par des scripts que l'on peut retrouver dans **/usr/share/postgresql/*.*/contrib/*.sql**
===== Clients graphiques =====
==== Le client pgadmin3 ====
PgAdmin III est un outil graphique d'administration de votre serveur PostgreSQL. L'application pgAdmin III peut être utilisé pour administrer les serveurs PostgreSQL 7.3 et les versions supérieures. PgAdmin III existe pour toutes les plateformes dont, évidemment, Ubuntu, KUbuntu, XUbuntu.
PgAdmin III a été conçu pour répondre aux besoins de tous les utilisateurs, depuis la rédaction de simple requêtes SQL au développement complexe de base de données. L'interface graphique supporte toutes les fonctionnalités de PostGreSQL et permet une administration simple. L'application inclut aussi un éditeur de requête avec coloration syntaxique, un éditeur de code, un agent de gestion de tâche automatique, un support pour les réplication via Slony-I et bien d'autres fonctionnalités.
== Installation du client pgadmin3 ==
On commence par [[:tutoriel/comment_installer_un_paquet|installer]] les paquets nécessaires : pgadmin3
sudo apt-get install pgadmin3
Cela va également installer les paquets suivants :
* libpq4
* libwxbase2.6-0
* libwxgtk2.6-0
* pgadmin3-data
^ Installer en 1 clic ^
| [[apt://pgadmin3|{{ :apt.png |Installer en 1 clic.}}]] |
== Lancement du client pgadmin3 ==
Sous Ubuntu, pour lancer PgAdmin III, aller dans le menu **Applications** => **programmation** => **pgAdmin III**
**Remarque:**
En suivant la section ci-haut "Méthode rapide, non sécurisée" pgadmin3 n'acceptera pas la connexion aux bases de données. Il faudra definir un mot de passe à l'utilisateur avant (voir la procédure sécurisée)
$ psql -d template1 -c "alter user with password ''"
== Utilisation du client pgadmin3 via ssh ==
La connexion à la base de donnée necessite la création d'un tunnel
ssh -L 5555:localhost:5432 utilisateur@adresse_du_serveur
Le port 5555 correspond au port de redirection sur le port local (vous pouvez en choisir un autre)
Le port 5432 correspond au port d'écoute de postgres (ne pas modifier)
Cet exemple s'entend en connexion ssh sur le port standard 22
Si vous avez modifié et vous devriez le faire pour des raisons de sécurité le port d'écoute ssh, utilisez cette commande : (1444 est un exemple, vous pouvez en chosir un autre)
ssh -L 5555:localhost:5432 utilisateur@nom_du_serveur -p 1444
Le serveur vous demandera votre mot de passe
Ouvrez maintenant pgadmin3
Nom : nom_de_votre_database
Hôte : localhost
Port TCP : 5555 (selon l'exemple ci-dessus)
Vous devriez être maintenant connecté
==== Le client phppgadmin ====
=== Installation du client phppgadmin ===
Il suffit d'[[:tutoriel:comment_installer_un_paquet|installer le paquet]] **phppgadmin**, à condition que vous ayez un serveur Web fonctionnel et reconnaissant php.
^ Le serveur Web php en un clic ^
| [[apt://apache2,apache2-doc,mysql-server,php5,libapache2-mod-php5,php5-mysql,phpmyadmin
|{{ :apt.png |Installer en 1 clic.}}]] |
^ phppgadmin en un clic^
| [[apt://phppgadmin|{{ :apt.png |Installer en 1 clic.}}]] |
Sur mon installation, apache2/php5, pgsql n'était pas reconnu. J'ai du rajouter la ligne ''extension=pgsql.so'' à la main (après celle sur mysql) dans le fichier ** /etc/php5/apache2/php.ini**. A confirmer ou infirmer.
Confirmé, chez moi idem. Et sous gutsy, comme pour phpmyadmin, il faut aussi créer le lien symbolique vers /usr/share/phppgadmin.
sudo ln -s /etc/phppgadmin/apache.conf /etc/apache2/conf.d/phppgadmin.conf
puis redemarrer apache:
sudo /etc/init.d/apache2 reload
=== Lancement du client phppgadmin ===
Lance votre navigateur Web préféré à l'adresse [[http://localhost/phppgadmin/]].
Si le lien ci-dessus ne fonctionne pas (ce que j'ai eu comme problème), créer le lien symbolique suivant :
sudo ln -s /usr/share/phppgadmin/ /var/www/
=== Utilisation du client phppgadmin ===
FIXME
====Connexions vers PHP====
PHP 4 : [[:tutoriel/comment_installer_un_paquet|installer]] php4-pgsql.
PHP 5 : [[:tutoriel/comment_installer_un_paquet|installer]] php5-pgsql.
Il faut recharger Apache après avoir installé ce module : sudo /etc/init.d/apache2 reload
php5-pdo (voir la documentation officiel pour [[http://php.net/pdo|PDO]]) :
sudo pear install pecl-pdo_pgsql
PHP 5.2 : Cela se fait automatiquement.
> FIXME : A compléter
===== Postgresql 8.3 =====
Pour ceux n'ayant pas upgradé leur Ubuntu, ils peuvent installer PostgreSQL 8.3 grâce aux backports.
Il est important de remarquer que lors de l'installation, les bases de données sont créées en Unicode et qu'à cause de cela, il ne sera pas possible de créer une base de données dans un autre encodage.
La solution à ce problème est assez simple.
1. Faites un backup avec pg_dumpall
mkdir /tmp/backup
chown postgres /tmp/backup
cd /tmp/backup/
su postgres
pg_dumpall > backup.dmp
2. Recréez les fichiers d'initialisation à un autre endroit avec POSIX comme locale. Cet autre endroit doit appartenir à postgres et avoir 700 comme permission.
Si vous utilisez un backport donnez le chemin complet vers initdb
/usr/lib/postgresql/8.3/bin/initdb --locale=POSIX -D/var/lib/postgresql/8.3-posix/main
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale POSIX.
The default database encoding has accordingly been set to SQL_ASCII.
The default text search configuration will be set to "english".
fixing permissions on existing directory /var/lib/postgresql/8.3-posix/main ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers/max_fsm_pages ... 24MB/153600
creating configuration files ... ok
creating template1 database in /var/lib/postgresql/8.3-posix/main/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.
Success. You can now start the database server using:
/usr/lib/postgresql/8.3/bin/postgres -D /var/lib/postgresql/8.3-posix/main
or
/usr/lib/postgresql/8.3/bin/pg_ctl -D /var/lib/postgresql/8.3-posix/main -l logfile start
3. Changez dans le fichier de configuration le data_directory
cd /etc/postgresql/8.3/main
sudo nano postgresql.conf
Dans postgresql.conf, vous devez avoir la ligne suivante
data_directory = '/var/lib/postgresql/8.3-posix/main'
4. Relancez postgresql après avoir créer les liens des certificates et clefs (pour le SSL)
sudo -s
Password:
cd /var/lib/postgresql/8.3-posix/main
ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem server.crt
ln -s /etc/postgresql-common/root.crt root.crt
ln -s /etc/ssl/private/ssl-cert-snakeoil.key server.key
/etc/init.d/postgresql-8.3 restart
5. restaurez le backup
sudo -s -u postgres
/usr/lib/postgresql/8.3/bin/psql -f /tmp/backup/backup.dmp
5. Si vous avez utilisé les backports: Postgreql 8.3 fonctionne sur le port 5433 et la version 8.2 sur le port 5432. Vous souhaitez pouvoir utiliser par défaut la version 8.3, crééez le fichier ~/.postgresqlrc, il devrait contenir
8.3 localhost:5433 *
Le fait que le server tourne en unicode et que les bases de données soient en latin1 amène des petits bugs, migrez au plus tôt vos bases de données vers unicode
===== Récupération du contenu d'une base de données après un crash serveur =====
Supposons que vous ayez installé sous [[ubuntu_server|ubuntu server]] une application d'entreprise s'appuyant sur une base de données postgresql (cette procédure a été testée avec [[redmine|redmine]]), et qu'un crash se produise qui rende impossible de redémarrer le serveur. Se pose alors le problème de la récupération des données. La procédure est relativement simple. Il va vous falloir:
* Monter votre ancienne installation depuis une autre installation ou via un live cd
* [[chroot|chrooter ]]dessus
* changer d'utilisateur pour l'utilisateur postgres
* démarrer la base de données
* effectuer un pg_dump pour sauvegarder la base de données.
Ceci fait, après avoir réinstallé votre application d'entreprise sur un nouveau serveur ubuntu neuf, il n'y aura plus qu'à y importer la sauvegarde. Venons en aux détails techniques.
=== Montage et chroot sur votre ancienne installation depuis un live CD ou depuis le nouveau serveur ===
sudo fdisk -l # pour vous aider à trouver la bonne partition
sudo mount /dev/sdYX /mnt # montage de celle-ci en remplaçant le Y par la lettre du volume, et le X par le bon numéro de partition
sudo mount --bind /dev /mnt/dev # lien symbolique du dossier /dev en cours d'utilisation vers le disque monté
sudo mount -t proc /proc /mnt/proc # Étape facultative?
sudo chroot /mnt # mise à la racine du disque monté
=== démarrage de la base de données, changement d'utilisateur, et sauvegarde de son contenu ===
Démarrez la base de données dans le chroot
service postgresql-8.4 start # démarre postgresql dans le chroot
Si vous avez effectué le chroot depuis une installation d'Ubuntu où un serveur de base de données postgresql est déjà installé et actif, vous aurez probablement des avertissements concernant les ports non disponibles. Deux solutions existent alors, soit affecter des ports différents à l'un des deux, soit interrompre temporairement le serveur actif le temps de la sauvegarde via la commande service postgresql-8.4 stop
Maintenant, connectez-vous en tant que postgres, et effectuez la sauvegarde.
sudo su postgres # change l'utilisateur courant (root) pour l'utilisateur postgres
pg_dump -f /chemin/de/sauvegarde/choisi/NOM_BDD.sql NOM_BDD # effectue la sauvegarde de la base de données
=== Sortie du chroot en douceur ===
Au cours de ces opérations, vous avez monté des partitions et créé un chroot. Il ne faut pas oublier de les exécuter dans l'ordre inverse, si possible proprement.
exit # permet de cesser d'agir en tant qu'utilisateur postgres
service postgresql-8.4 stop # permet de stopper le serveur postgresql dans le chroot
exit # permet de quitter le chroot
sudo umount /mnt/dev/ # désactive le lien symbolique du dossier /dev en cours d'utilisation vers le disque monté
sudo umount /mnt/proc/ # désactive le lien symbolique du dossier /proc en cours d'utilisation vers le disque monté
sudo umount /mnt/ # démontage final de l'ancienne partition d'installation du serveur
Si vous avez sauvegardé votre base de données sur la partition du chroot (ce qui est déconseillé, le volume n'étant a priori pas sûr), pensez à le copier sur un support externe avant de terminer le démontage de la partition.
=== Restaurer la sauvegarde sur la nouvelle installation ===
La restauration de la sauvegarde est très simple : connectez-vous sur votre nouvelle installation, et changez d'utilisateur pour postgres. Supprimez la base de données créée par défaut pour éviter tout conflit (une petite sauvegarde préalable de celle-ci ne fera pas de mal), recréez-la, et importez-y votre base sauvegardée :
sudo su postgres # change l'utilisateur courant (root) pour l'utilisateur postgres
dropdb NOM_BDD # efface la base de données existante
createdb --owner=NOM_APPLI --encoding=utf-8 NOM_BDD # recréée une base de données vide
psql -f /chemin/de/sauvegarde/choisi/redmine.sql NOM_BDD # importe la base de données sauvegardée
L'option ''--owner=NOM_APPLI'' de la troisième commande suppose que vous avez configuré un utilisateur système pour votre application
----
//Contributeurs : [[utilisateurs:yannick_LM|Yannick]], [[utilisateurs:sparky|Sparky]], [[utilisateurs:elemmire|Elemmire]], [[utilisateurs:aldian|Aldian]]. //