PostgreSQL
PostgreSQL est un système de gestion de base de données. C'est un outil libre disponible sous license BSD.
Il fonctionne sur un grand nombre d'OS dont Linux/BSD/Windows/Solaris
et est utilisable par pleins de langages dont:
C/C++
Python
Perl
Php
java
.NET
Installation
Avant de pouvoir commencer a gérer sa base de données, il va avant tout falloir installer postgreSQL, pour cela:
Debian:
apt-get install postgresql
Centos:
yum install postgresql94-server
FreeBSD:
#On se rend dans le port de postgresql cd /usr/ports/databases/postgresql94-server #On choisit les modules que l'on souhaite installer make config-recursive #On installe make install clean #Via pkg pkg install postgresql #On oublie pas d'ajouter postgresql au fichier rc.conf echo 'postgresql_enable="YES"' >>/etc/rc.conf
L'utilisateur root n'a pas le droit de toucher a la bdd pour des raisons de sécurité,si vous essayez, ce message devrait apparaitre:
“root” execution of the PostgreSQL server is not permitted.
The server must be started under an unprivileged user ID to prevent possible system security compromise. See the documentation for more information on how to properly start the server.
donc normalement l'utilisateur pgsql a été crée lors de l’installation, si ce n'est pas le cas, il faut le faire.
Une fois postgreSQL installé et notre utilisateur présent, le SGBD a encore besoin d'être initialisé pour pouvoir être utilisé, pour cela on va utiliser la commande initdb:
initdb initdb: no data directory specified You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA.
Si vous avez un message d'erreur dit que la variable PGDATA n'existe pas, il suffis juste de la définir via:
set PGDATA = ( /usr/local/pgsql/data )
ou:
initdb -D /usr/local/pgsql/data
PGDATA va permettre de dire a Postgres où aller chercher les données.
La base de données est maintenant créee et initialisée, il reste cependant quelques paramétrages a faire, notamment au niveau des droits d'accès et de la sécurité parce que bon, une base de données en libre accès sans mot de passe ou quoi ça craint un peu.
On va commencer par modifier le fichier /usr/local/pgsql/data/pg_hba.conf on va régler ici les droits d'accès au serveur.
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust host all all 192.168.0.0/24 trust host all all 192.168.1.42/24 password host all all 192.168.1.43/24 md5
Ici on autorise tout le monde dans le réseau 192.168.0.0/24 sans mot de passe
l'hôte 192.168.1.42 utilisera un mot de passe non chiffrée, pour une connexion sure, a l’intérieur d'un LAN par exemple
et 192.168.1.43 utilisera un mot de passe chiffré en md5, pour une connexion non sécurisée.
et bien évidemment, le serveur lui même.
On va aussi activer les connexions distantes, pour cela il faut modifier le fichier /usr/local/pgsql/data/postgresql.conf et modifier la valeur de listen_address:
listen_address = '*'
Si le format de date ne convient pas, il suffis de modifier dans le même fichier, la ligne datestyle
datestyle | Input Ordering | Example Output |
---|---|---|
SQL, DMY | day/month/year | 17/12/1997 15:37:16.00 CET |
SQL, DMY | month/day/year | 12/17/1997 07:37:16.00 PST |
Postgres, DMY | day/month/year | Wed 17 Dec 07:37:16 1997 PST |
Voilà la base de données est maintenant prête a être utilisée.
Administration
Maintenant, postgreSQL est configuré et est prêt a être utilisée, mais pour le moment c'est vide, on va donc créer une base:
/usr/local/bin/createdb toto
On va créer un utilisateur par la même occasion
/usr/local/bin/createuser toto CREATE USER
cependant notre nouvel utilisateur n'a pas de mot de passe, on va donc lui en ajouter un,ainsi que les droits de création de base de données et d'utilisateurs pour cela, on va se connecter a notre nouvelle base de données avec l'utilisateur principal:
$psql -U pgsql -d toto psql (9.3.9) Type "help" for help. toto=#ALTER USER toto WITH PASSWORD 'totopasswd'; toto=#ALTER USER toto CREATEUSER CREATEDB;
Voici d'autres commandes d'administrations pour créer/supprimer des utilisateurs et de même pour les databases:
toto=#CREATE USER tutu WITH PASSWORD 'tutupasswd'; toto=#DROP USER tutu; toto=#CREATE DATABASE tutudb; toto=#DROP DATABASE tutudb;
Voici une liste des principaux types de données utilisées dans postgreSQL:
Name | Aliase | Description |
---|---|---|
boolean | bool | logical Boolean (true/false) |
character | [ (n) ] char [ (n) ] | fixed-length character string |
text | variable-length character string | |
character varying | [ (n) ] varchar [ (n) ] | variable-length character string |
double precision | float8 | double precision floating-point number (8 bytes) |
real | float4 | single precision floating-point number (4 bytes) |
integer | int, int4 | signed four-byte integer |
numeric | [ (p, s) ] decimal [ (p, s) ] | exact numeric of selectable precision |
smallint | int2 | signed two-byte integer |
smallserial | serial2 | autoincrementing two-byte integer |
serial | serial4 | autoincrementing four-byte integer |
date | calendar date (year, month, day) | |
time | [ (p) ] [ without time zone ] | time of day (no time zone) |
time | [ (p) ] with time zone timetz | time of day, including time zone |
timestamp | [ (p) ] [ without time zone ] | date and time (no time zone) |
timestamp | [ (p) ] with time zone timestamptz | date and time, including time zone |
json | JSON data | |
money | currency amount | |
inet | IPv4 or IPv6 host address |
La liste complète est disponible a cette adresse
Utilisation
La gestions des données reste principalement la même que avec les autres SGBD:
Le datatype “serial” permet de définir un type qui s'auto-incrémente
toto=# CREATE TABLE totofamily ( id serial PRIMARY KEY NOT NULL, name VARCHAR(100)NOT NULL, lastname VARCHAR(100) NOT NULL, age INTEGER NOT NULL, member VARCHAR(100) NOT NULL); CREATE TABLE toto=# INSERT INTO totofamily (name,lastname,age,member) VALUES ('toto','toto',20,'son'); INSERT 0 1 toto=# INSERT INTO totofamily (name,lastname,age,member) VALUES ('toto','tutu',20,'mother'); INSERT 0 1 toto=# INSERT INTO totofamily (name,lastname,age,member) VALUES ('toto','titi',20,'father'); INSERT 0 1 toto=# SELECT * FROM totofamily; id | name | lastname | age | member ----+------+----------+-----+-------- 1 | toto | toto | 20 | son 2 | toto | tutu | 20 | mother 3 | toto | titi | 20 | father (3 ROWS) toto=# DELETE FROM totofamily WHERE id=3; DELETE 1
Même si quelques commandes sont tout de même spécifiques a postgreSQL:
COPY (SELECT * FROM totofamily) TO '/home/toto/mafamille.csv' WITH CSV HEADER
qui permet de copier toute la table totofamilly et de l'exporter sous format csv avec le nom des champs en header.
Sauvegarde et restauration
ou encore pour dumper toute la base de données
pg_dump toto > /home/bckbdd/toto.sql
Dumper seulement la table totofamily de la base toto:
pg_dump toto -t totofamily > /home/bckbdd/totofamily.sql
Si la taille de la base de données est imposante:
pg_dump toto | bzip2 -c > /home/bckbdd/toto.sql.bz2
et pour restaurer la base:
psql toto < toto.sql
bunzip2 toto.sql.bz2 | psql toto