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;

Pool de connexions :

  • pgpool
  • pgbouncer

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…