Formation Evolix
PostgreSQL
PostgreSQL
- le respect du standard SQL
- la sécurité des données
- journaux de transaction (WAL) avant persistence
Installation
# vim sources.list
deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main
# apt install postgresql
Instances
# pg_ctlcluster <version> <cluster> start|stop|restart|reload|status|promote
# pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
9.4 main 5432 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
Attention à la locale
# dpkg-reconfigure locales
$ /usr/bin/pg_createcluster <version> <cluster>
Fichiers
configuration : /etc/postgresql/<version>/<instance>/
journaux : /var/log/postgresql/postgresql-<version>-<instance>.log
stockage : var/lib/postgresql/<version>/<instance>/
binaires et bibliothèques : /usr/lib/postgresql/<version>/<instance>/
# sudo -u postgres psql
Contenu de pg_hba.conf :
- local all all peer
+ local all all password
$ createuser -P <login>
$ createdb -O <login> <base>
$ dropdb <base>
$ psql -c "ALTER USER <login> WITH PASSWORD 'foo'"
$ dropuser <login>
=# SELECT * FROM pg_user;
=# \du
$ psql -l
=# \d
=# SELECT * FROM pg_database;
SELECT pid, datname, usename, client_addr, query_start, waiting, query
FROM pg_stat_activity
WHERE state='active'
ORDER by query_start;
Outils complémentaires
# aptitude install ptop pgbadger pgadmin3
$ pg_top
Faire un VACUUM FULL sur toutes les bases de données
$ vacuumdb -a -f -v
ANALYSE sur toutes les tables d'une base de données
$ psql mydb
=# ANALYZE;
Optimisation
- shared_buffers : quantité de mémoire dédiée à PostgreSQL
- work_mem : quantité de mémoire par process
- max_connections
Sauvegarde
$ pg_dump <base> >dump.sql
$ pg_dumpall > dump.sql
$ psql <base> < dump.sql
Archivage de WAL :
wal_level = 'archive'
archive_command = 'rsync %p backup.example.net:/backup/…/archives/%f'
barman
Usage
CREATE TABLE weather (
city varchar(80),
temp_lo int, -- low temperature
temp_hi int, -- high temperature
prcp real, -- precipitation
date date
);
INSERT INTO weather VALUES ('San Francisco', 46,50,0.25, '1994-11-27');
SELECT * FROM weather;
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;
SELECT * FROM weatherWHERE city = 'San Francisco' AND prcp > 0.0;
SELECT DISTINCT city FROM weather ORDER BY city;
SELECT * FROM weather, cities WHERE city = name;
SELECT weather.city, weather.temp_lo, cities.location
FROM weather, cities WHERE cities.name = weather.city;
SELECT * FROM weather
INNER JOIN cities ON (weather.city = cities.name);
SELECT * FROM weather
LEFT OUTER JOIN cities ON (weather.city = cities.name);
SELECT * FROM weather w, cities c WHERE w.city = c.name;
Streaming Replication
master / slave
Slony : réplication des données par trigger
- Ne réplique pas le schéma : toutes les bases à créer
- Avoir une clé primaire sur chaque table à répliquer *
- Ne pas utiliser "TRUNCATE" (PG < 8.4)
SELECT * from pg_stat_replication;
* : peut être contourné mais fortement conseillé.
Initialise le cluster Slony
slonik_init_cluster | slonik
Initialise le set de réplication
Ensemble de tables à répliquer, y compris les triggers.
slonik_create_set set1 | slonik
# zcat /usr/share/doc/slony1-2-bin/examples/slon.conf-sample.gz \
> /etc/slony1/slon.conf
# /etc/init.d/slony1 start
$ slonik_subscribe_set set1 node2 | slonik
Autres bases de données relationnelles
- MySQL / MariaDB : base de données très populaires au sein des infrastructures web
- SQLite : faile à installer, idéal pour embarquer
Autres bases de données dites "NoSQL"
- Memcached : base de données clés/valeurs volatile et très performante
- Redis : ressemble à Memcache, mais persistent et plus riche en fonctionnalités
- InfluxDB : base de données orientée "métriques"
- Elasticsearch : moteur distribuée d'indexation et de recherche
- Neo4j : base de données orientée "graph"
- Autres : MongoDB, CouchDB, Cassandra, Riak…