PostgreSQL Avancé

Formation DBA2

Dalibo SCOP

8 janvier 2018

Licence Creative Commons CC-BY-NC-SA

Vous êtes libres de redistribuer et/ou modifier cette création selon les conditions suivantes :

  • PaternitĂ©

  • Pas d'utilisation commerciale

  • Partage des conditions initiales Ă  l'identique

Richesses de l'écosystème PostgreSQL

PostgreSQL

Préambule

  • Projet horizontal & dĂ©centralisĂ©
  • La « biodiversitĂ© » est une force
  • Le meilleur SGBD du marchĂ© ?

Au menu

  • Projets satellites
  • Comparatifs
  • CommunautĂ©
  • Avenir

Objectifs

  • ConnaĂ®tre les logiciels connexes
  • Exploiter toute la puissance du SGBD
  • Participer !

Les projets satellites

  • Administration
  • Supervision et monitoring
  • Migrations
  • SIG
  • ModĂ©lisation

pgAdmin IV

Logo pgAdmin
  • Site officiel : http://www.pgadmin.org/
  • Version : 2.0
  • Licence : PostgreSQL
  • Gestion graphique de l'administration des bases
  • Éditeur de requĂŞtes
  • Supervision

pgAdmin III

Logo pgAdmin
  • Site officieux : https://www.openscg.com/bigsql/pgadmin3/
  • Version : 1.23
  • Licence : PostgreSQL
  • Gestion graphique de l'administration des bases
  • Éditeur de requĂŞtes / EXPLAIN graphique
  • Gestion de Slony

PhpPgAdmin

  • Site officiel : http://phppgadmin.sourceforge.net/
  • Version : 5.1
  • Licence : GPL
  • Gestion graphique de l'administration des bases
  • Interface web
  • Mais ne semble plus maintenu
    • pas de nouvelles versions depuis avril 2013
    • pas de commit depuis avril 2016
  • Utiliser plutĂ´t pgAdmin IV sur un serveur web

pgBadger

  • Site officiel : http://projects.dalibo.org/pgbadger/
  • Version : 9.2
  • Licence : PostgreSQL
  • Analyse des traces de durĂ©e d'exĂ©cution des requĂŞtes
  • Analyse des traces du VACUUM, des connexions, des checkpoints
  • Compatible syslog, stderr, csvlog

OPM

Logo OPM
  • Open PostgreSQL Monitoring
  • Site officiel : http://opm.io/
  • Version : 2.4
  • Licence : PostgreSQL
  • Suite de supervision lancĂ©e par Dalibo en septembre 2014
  • Projet indĂ©pendant menĂ© par OPMDG (OPM Development Group)

PoWA

Logo PoWA

ora2pg

  • Site officiel : http://ora2pg.darold.net/
  • Version : 18.2
  • Licence : GPL
  • Migration de la structure d'une base Oracle...
  • ... des procĂ©dures stockĂ©es et des donnĂ©es

sqlserver2pg

  • Site officiel : http://dalibo.github.io/sqlserver2pgsql/
  • Version : sans
  • Licence : GPL v3
  • Convertit un schĂ©ma SQL Server en un schĂ©ma PostgreSQL
  • Produit en option un job Pentaho Data Integrator (Kettle) pour migrer toutes les donnĂ©es de SQL Server vers PostgreSQL

db2topg

PostGIS

Logo Postgis
  • Site officiel : http://postgis.net/
  • Version : 2.4
  • Licence : BSD
  • Module spatial pour PostgreSQL
  • Conforme aux spĂ©cifications de l'OpenGIS Consortium
  • Compatible avec MapServer

pgmodeler

Logo Pgmodeler
  • Site officiel : http://pgmodeler.com.br/
  • Version : 0.9
  • Licence : GPLv3
  • ModĂ©lisation de base de donnĂ©es
  • FonctionnalitĂ© d'import export

Comparatifs

  • Pas de SGBD universel
  • S'inspirer des concurrents plutĂ´t que de les combattre
  • PostgreSQL vs.
    • MySQL
    • SQL Server
    • Oracle
    • Informix
    • NoSQL
  • Attention aux benchmarks !

PostgreSQL vs. MySQL

  • DiffĂ©rents moteurs
    • MyISAM ou InnoDB ?
  • Points forts de PostgreSQL
    • DDL transactionnel
  • Points faibles de PostgreSQL
    • lenteur du SELECT count(*) (amĂ©lioration en 9.2)
  • Quel avenir pour MySQL ?

PostgreSQL vs. SQL Server

  • Des performances difficile Ă  battre sous Windows
    • ... mais PostgreSQL reste plus efficace sous Linux
  • IntĂ©gration Ă  l'Ă©cosystème Microsoft
    • avantage, excellents outils graphiques (Studio)
    • inconvĂ©nient, peu de choix dans les outils
  • Points faibles de PostgreSQL
    • un partitionnement perfectible (amĂ©lioration en 10)
    • pas de vues matĂ©rialisĂ©es (amĂ©lioration en 9.3)

PostgreSQL vs. Oracle

  • PostgreSQL est le SGBD le plus proche d'Oracle
  • Points forts de PostgreSQL
    • respect des standards
    • DDL transactionnel
    • pas de gestion et de coĂ»t de licence
  • Points faibles de PostgreSQL
    • manque certains objets (synonymes, packages)
    • un parallĂ©lisme perfectible (amĂ©lioration en 9.6)
    • un partitionnement perfectible (amĂ©lioration en 10)
    • pas de vues matĂ©rialisĂ©es (amĂ©lioration en 9.3)
    • lenteur du SELECT count(*) (amĂ©lioration en 9.2)
    • pas d'Ă©quivalent de RAC
  • Deux produits Ă  prĂ©sent dans la mĂŞme catĂ©gorie

PostgreSQL vs. Informix

  • Informix est un lointain cousin de PostgreSQL
  • Points forts de PostgreSQL
    • un vrai CREATER USER
    • pas de double quote (") pour les chaĂ®nes
  • Points faibles de PostgreSQL
    • pas de synonym

PostgreSQL vs. NoSQL

  • 4 technologies majeures dans le monde NoSQL
    • stockage clĂ©->valeur (Redis, Apache Cassandra, Riak, MongoDB)
    • stockage documents (Apache CouchDB, MongoDB)
    • stockage colonnes (Apache Hbase, Google BigTable)
    • stockage graphes (Neo4j)
  • PostgreSQL rĂ©unit le monde relationnel et le monde NoSQL
    • stockage clĂ©->valeur : hstore
    • stockage documents : xml, json et jsonb (plus performant que MongoDB)
    • procĂ©dure stockĂ©e en Javascript : PL/V8
    • stockage colonnes : cstore_fdw

À la rencontre de la communauté

  • Cartographie du projet
  • Pourquoi participer
  • Comment participer

PostgreSQL, un projet mondial

Carte des hackers
Carte des hackers

PostgreSQL Core Team

Core team

Contributeurs

Contributeurs

Utilisateurs

  • Vous !
  • Le succès d'un logiciel libre dĂ©pend de ses utilisateurs.

Pourquoi participer

  • RapiditĂ© des corrections de bugs
  • PrĂ©parer les migrations
  • Augmenter la visibilitĂ© du projet
  • CrĂ©er un rĂ©seau d'entraide

Serveurs

Serveurs francophones

Listes de discussions / Listes d'annonces

  • pgsql-announce
  • pgsql-general
  • pgsql-admin
  • pgsql-sql
  • pgsql-performance
  • pgsql-fr-generale
  • pgsql-advocacy

IRC

  • RĂ©seau Freenode
  • IRC anglophone
    • #postgresql
    • #postgresql-eu
  • IRC francophone
    • #postgresqlfr

Wiki

L'avenir de PostgreSQL

  • PostgreSQL 10 est sortie en septembre 2017
  • Grandes orientations :
    • rĂ©plication logique
    • meilleur parallĂ©lisme
    • gros volumes
  • Prochaine version, la 11
  • StabilitĂ© Ă©conomique
  • Le futur de PostgreSQL dĂ©pend de vous !

Conclusion

  • Beaucoup de projets complĂ©mentaires
  • Une communautĂ© active
  • Concurrent solide face aux SGBD propriĂ©taires
  • De nombreuses conversions en cours vers PostgreSQL

Bibliographie

Questions

N'hésitez pas, c'est le moment !

Fonctionnement interne

PostgreSQL

Introduction

Présenter le fonctionnement de PostgreSQL en profondeur :

  • Comprendre :
    • Le paramĂ©trage
    • Les choix d’architecture
    • Et ce que cela implique
  • Deux modules (une journĂ©e) :
    • Fonctionnement interne
    • Transactions

Au menu

  • les processus
  • gestion de la mĂ©moire
  • les fichiers
  • shared buffers
  • journalisation
  • statistiques
  • optimiseur de requĂŞte
  • gestion des connexions

Objectifs

  • Premier module : fonctionnement interne
  • Second module : implĂ©mentation MVCC
  • Tous les paramètres ne sont pas abordĂ©s

Les processus

  • PostgreSQL est :

    • multi-processus et non multi-thread
    • Ă  mĂ©moire partagĂ©e
    • client-serveur

Processus d’arrière-plan (1/2)

# ps f -e --format=pid,command | grep postgres
 7771 /usr/local/pgsql/bin/postgres -D /var/lib/postgresql/10/data
 7773  \_ postgres: checkpointer process   
 7774  \_ postgres: writer process   
 7775  \_ postgres: wal writer process   
 7776  \_ postgres: autovacuum launcher process   
 7777  \_ postgres: stats collector process   
 7778  \_ postgres: bgworker: logical replication launcher  

Processus d’arrière plan (2/2)

  • Les processus prĂ©sents au dĂ©marrage :

    • Un processus père, appelĂ© le postmaster
    • Un writer ou background writer
    • Un checkpointer
    • Un wal writer
    • Un autovacuum launcher
    • Un stats collector
    • Un bgwriter

Processus par client

  • Pour chaque client, nous avons un processus :
    • crĂ©Ă© Ă  la connexion
    • dĂ©diĂ© au client ...
    • ... et qui dialogue avec lui
    • dĂ©truit Ă  la dĂ©connexion
  • Un processus gère une requĂŞte
    • mais peut ĂŞtre aidĂ© par d’autres processus (>= 9.6)
  • Le nombre de processus est rĂ©gi par les paramètres :
    • max_connections
    • superuser_reserved_connections

Gestion de la mémoire

Structure de la mémoire sous PostgreSQL

  • Zone de mĂ©moire partagĂ©e :
    • shared_buffers
    • wal_buffers
    • DonnĂ©es de session
    • Verrous
  • Par processus :
    • work_mem
    • maintenance_work_mem
    • temp_buffers

Mémoire partagée

  • Zone de mĂ©moire partagĂ©e :
    • shared_buffers
    • wal_buffers
    • DonnĂ©es de session (paramètres max_connections et track_activity_query_size)
    • Verrous (paramètres max_connections et max_locks_per_transaction)

MĂ©moire par processus

  • Par processus :
    • work_mem
    • maintenance_work_mem
    • temp_buffers
  • Pas de limite stricte Ă  la consommation mĂ©moire d'une session

Les fichiers

  • Une instance est composĂ©e de fichiers :

    • RĂ©pertoire de donnĂ©es
    • Fichiers de configuration
    • Fichier PID
    • Tablespaces
    • Statistiques
    • Fichiers de trace

Répertoire de données

postgres$ ls $PGDATA
# ls $PGDATA
base          pg_ident.conf  pg_serial     pg_tblspc    postgresql.auto.conf
global        pg_logical     pg_snapshots  pg_twophase  postgresql.conf
pg_commit_ts  pg_multixact   pg_stat       PG_VERSION   postmaster.opts
pg_dynshmem   pg_notify      pg_stat_tmp   pg_wal       postmaster.pid
pg_hba.conf   pg_replslot    pg_subtrans   pg_xact

Fichiers de données

  • Contient de quoi dĂ©marrer l’instance :
    • base/ : contient les fichiers de donnĂ©es (un sous-rĂ©pertoire par base)
    • global/ : contient les objets globaux Ă  toute l'instance

Gestion des transactions

  • pg_wal/ : contient les journaux de transactions
    • pg_xlog/ avant la v10
  • pg_xact/ : contient l’état des transactions
    • pg_clog/ avant la v10
  • pg_commit_ts/
  • pg_multixact/
  • pg_serial/
  • pg_snapshots/
  • pg_subtrans/
  • pg_twophase/

  • Ces fichiers sont vitaux !

Gestion de la réplication

  • pg_logical/
  • pg_repslot/

Le répertoire des tablespaces

  • pg_tblspc/ : contient des liens symboliques vers les rĂ©pertoires contenant des tablespaces

Statistiques d'activité

  • pg_stat/
  • pg_stat_tmp/

Autres répertoires

  • pg_dynshmem/
  • pg_notify/

Fichiers de configuration

  • pg_hba.conf
  • pg_ident.conf
  • postgresql.conf
  • postgresql.auto.conf

Autres fichiers

  • PG_VERSION : fichier contenant la version majeure de l'instance
  • postmaster.pid
    • contient de nombreuses informations sur le processus maĂ®tre
    • fichier externe possible, paramètre external_pid_file
  • postmaster.opts

Paramètres en lecture seule

  • DĂ©pendent d’options de compilation
  • Quasiment jamais modifiĂ©s
  • Tailles de bloc ou de fichier
  • block_size
  • wal_block_size
  • segment_size
  • wal_segment_size

postgresql.conf

  • Le fichier principal de configuration :

    • format clĂ© = valeur
    • valeur entre « ' » (single quote) si chaĂ®ne de caractère
    • classĂ© par sections
    • commentĂ© (change requires restart)
    • paramètre config_file
    • inclusion externe supportĂ©e avec les clauses include et include_if_exists

pg_hba.conf et pg_ident.conf

  • Authentification multiple, suivant l’utilisateur, la base et la source de la connexion.

    • pg_hba.conf (Host Based Authentication)
    • pg_ident.conf, si mĂ©canisme externe d’authentification
    • paramètres hba_file et ident_file

Les tablespaces

  • Espace de stockage d’objets
  • Un simple rĂ©pertoire
  • RĂ©partit la charge et la volumĂ©trie sur plusieurs disques
  • paramètres default_tablespace et temp_tablespaces

Les fichiers de traces (journaux)

  • Fichiers texte traçant l’activitĂ©
  • Très paramĂ©trables
  • Gestion des fichiers soit :
    • Par PostgreSQL
    • DĂ©lĂ©guĂ©s au système d’exploitation (syslog, eventlog)

Shared buffers

  • Shared buffers ou blocs de mĂ©moire partagĂ©e

    • Partage les blocs entre les processus
    • Cache en lecture ET Ă©criture
    • Double emploi partiel avec le cache du système
    • Importants pour les performances

Notions essentielles

  • Buffer pin
  • Buffer dirty/clean
  • Compteur d’utilisation (usagecount)
  • Clocksweep

Synchronisation en arrière plan

  • Le Background Writer synchronise les buffers :
    • de façon anticipĂ©e
    • une portion des pages Ă  synchroniser
    • paramètres : bgwriter_delay, bgwriter_lru_maxpages, bgwriter_lru_multiplier et bgwriter_flush_after
  • Le checkpointer synchronise les buffers :
    • lors des checkpoints
    • synchronise toutes les dirty pages

Journalisation

  • Garantir la durabilitĂ© des donnĂ©es
  • Base encore cohĂ©rente après :
    • Un arrĂŞt brutal des processus
    • Un crash machine
    • …
  • AppelĂ©e Write Ahead Logging
  • Écriture des modifications dans un journal avant de les effectuer.

Checkpoint

  • Point de reprise
  • D’oĂą doit-on rejouer le journal ?
  • DonnĂ©es Ă©crites au moins au niveau du checkpoint
  • Deux moyens pour dĂ©clencher automatiquement et pĂ©riodiquement un CHECKPOINT
    • max_wal_size
    • checkpoint_timeout
  • Dilution des Ă©critures
    • checkpoint_completion_target

WAL buffers : journalisation en mémoire

  • RĂ©duire les appels Ă  fsync
  • Mutualiser les Ă©critures entre transactions
  • Un processus d’arrière plan
  • Paramètres importants :
    • wal_buffers
    • wal_writer_delay
    • wal_writer_flush_after
    • synchronous_commit
  • Attention au paramètre fsync

Archivage : conservation des journaux

  • RĂ©cupĂ©ration Ă  partir de vieille sauvegarde
  • Sauvegarde Ă  chaud
  • Sauvegarde en continu
  • Paramètres : wal_level, archive_mode, archive_command et archive_timeout

Streaming Replication

  • Appliquer les journaux :

    • Non plus fichier par fichier
    • Mais entrĂ©e par entrĂ©e (en flux continu)
    • Base de Standby très proche de la production
    • Paramètres : max_wal_senders, wal_keep_segments, wal_sender_delay et wal_level

Hot Standby

  • Base de Standby accessible en lecture
  • Peut basculer en lecture/Ă©criture sans redĂ©marrage (sessions conservĂ©es)
  • Peut fonctionner avec la Streaming Replication
  • Paramètres
    • sur l’esclave :

    hot_standby, max_standby_archive_delay, max_standby_streaming_delay

    • sur le maĂ®tre :
    wal_level

Statistiques

  • Collecte de deux types de statistiques diffĂ©rents :

    • Statistiques d’activitĂ©
    • Statistiques sur les donnĂ©es

Statistiques sur l’activité

  • CollectĂ©es par chaque session durant son travail
  • RemontĂ©es au Stats Collector
  • StockĂ©es rĂ©gulièrement dans un fichier, consultable par des vues systèmes
  • Paramètres :
    • track_activities, track_activity_query_size, track_counts, track_io_timing et track_functions
    • update_process_title et stats_temp_directory

Statistiques collectées

  • Statistiques d’activitĂ© collectĂ©es :

    • Accès logiques (INSERT, SELECT…) par table et index
    • Accès physiques (blocs) par table, index et sĂ©quence
    • ActivitĂ© du Background Writer
    • ActivitĂ© par base
    • Liste des sessions et informations sur leur activitĂ©

Statistiques sur les données

  • Statistiques sur les donnĂ©es :

    • CollectĂ©es par Ă©chantillonnage
    • Table par table (et pour certains index)
    • Colonne par colonne
    • Pour de meilleurs plans d’exĂ©cution

Optimiseur

  • SQL est un langage dĂ©claratif :

    • DĂ©crit le rĂ©sultat attendu (projection, sĂ©lection, jointure, etc.)…
    • … mais pas comment l’obtenir
    • C’est le rĂ´le de l’optimiseur

Optimisation par les coûts

  • L’optimiseur Ă©value les coĂ»ts respectifs des diffĂ©rents plans
  • Il calcule tous les plans possibles tant que c’est possible
  • Le coĂ»t de planification exhaustif est exponentiel par rapport au nombre de jointures de la requĂŞte
  • Il peut falloir d’autres stratĂ©gies
  • Paramètres :
    • seq_page_cost, random_page_cost, cpu_tuple_cost, cpu_index_tuple_cost et cpu_operator_cost
    • parallel_setup_cost et parallel_tuple_cost
    • effective_cache_size

Paramètres supplémentaires de l’optimiseur 1/2

  • Pour le partitionnement : constraint_exclusion
  • Pour limiter les rĂ©Ă©critures : from_collapse_limit et join_collapse_limit
  • Pour les curseurs : cursor_tuple_fraction
  • Pour mutualiser les entrĂ©es-sorties : synchronize_seqscans

Paramètres supplémentaires de l’optimiseur 2/2

  • GEQO :

    • Un optimiseur gĂ©nĂ©tique
    • État initial, puis mutations alĂ©atoires
    • Rapide, mais non optimal
    • Paramètes : geqo et geqo_threshold

Déboggage de l’optimiseur

  • Permet de valider qu’on est en face d’un problème d’optimiseur.

  • Les paramètres sont assez grossiers :

    • DĂ©favoriser très fortement un type d’opĂ©ration
    • Pour du diagnostic, pas pour de la production

Gestion des connexions

  • L’accès Ă  la base se fait par un protocole rĂ©seau clairement dĂ©fini :

    • Sur des sockets TCP (IPV4 ou IPV6)
    • Sur des sockets Unix (sous Unix uniquement)
  • Les demandes de connexion sont gĂ©rĂ©es par le postmaster.

  • Paramètres : port, listen_adresses, unix_socket_directory, unix_socket_group et unix_socket_permissions

Paramètres liés aux sockets TCP

  • Paramètres de keepalive TCP
    • tcp_keepalives_idle
    • tcp_keepalives_interval
    • tcp_keepalives_count
  • Paramètres SSL
    • ssl
    • ssl_ciphers
    • ssl_renegotiation_limit
  • Autres paramètres

Conclusion

  • PostgreSQL est un SGBD complet.

  • Cela impose une conception complexe, et l’interaction de nombreux composants.

  • Une bonne comprĂ©hension de cette architecture est la clĂ© d’une bonne administration :

    • Le paramĂ©trage est compris
    • La supervision est plus rigoureuse
  • Le second module traite de la gestion des transactions (MVCC).

Questions

N’hésitez pas, c’est le moment !

Travaux Pratiques

MĂ©canique du moteur transactionnel

PostgreSQL
PostgreSQL

Introduction

PostgreSQL utilise un modèle appelé MVCC (Multi-Version Concurrency Control).

  • Gestion concurrente des transactions
  • Excellente concurrence
  • Impacts sur l’architecture

Au menu

  • Nous allons aborder :

    • PrĂ©sentation de MVCC
    • Niveaux d’isolation
    • ImplĂ©mentation de MVCC de PostgreSQL
    • Vacuum et son paramĂ©trage
    • Autovacuum et son paramĂ©trage
    • Verrouillage

Présentation de MVCC

  • Que signifie MVCC
  • Quelles solutions alternatives
  • ImplĂ©mentations possibles de MVCC

Présentation de MVCC

  • MultiVersion Concurrency Control
  • ContrĂ´le de Concurrence Multi-Version
  • Plusieurs versions du mĂŞme enregistrement

Alternatives Ă  MVCC

  • Une seule version de l’enregistrement en base
  • Verrouillage (granularitĂ© ?)
  • Contention ?
  • CohĂ©rence ?
  • Annulation ?

Implémentation de MVCC par UNDO

  • MVCC par UNDO :

    • Une version de l’enregistrement dans la table
    • Sauvegarde des anciennes versions
    • L’adresse physique d’un enregistrement ne change pas
    • La lecture cohĂ©rente est complexe
    • L’UNDO est complexe Ă  dimensionner
    • L’annulation est lente

L’implémentation MVCC de PostgreSQL

  • Copy On Write (duplication Ă  l’écriture)
  • Une version d’enregistrement n’est jamais modifiĂ©e
  • Toute modification entraĂ®ne une nouvelle version

Niveaux d’isolation

  • Chaque transaction (et donc session) est isolĂ©e Ă  un certain point :
    • elle ne voit pas les opĂ©rations des autres
    • elle s’exĂ©cute indĂ©pendamment des autres
  • On peut spĂ©cifier le niveau d’isolation au dĂ©marrage d’une transaction :
    • BEGIN ISOLATION LEVEL xxx;

Niveau READ UNCOMMITTED

  • Autorise la lecture de donnĂ©es modifiĂ©es mais non validĂ©es par d’autres transactions
  • Aussi appelĂ© DIRTY READS par d’autres moteurs
  • Pas de blocage entre les sessions
  • Inutile sous PostgreSQL en raison du MVCC
  • Si demandĂ©, la transaction s’exĂ©cute en READ COMMITTED

Niveau READ COMMITTED

  • La transaction ne lit que les donnĂ©es validĂ©es en base
  • Niveau d’isolation par dĂ©faut
  • Un ordre SQL s’exĂ©cute dans un instantanĂ© (les tables semblent figĂ©es sur la durĂ©e de l’ordre)
  • L’ordre suivant s’exĂ©cute dans un instantanĂ© diffĂ©rent

Niveau REPEATABLE READ

  • InstantanĂ© au dĂ©but de la transaction
  • Ne voit donc plus les modifications des autres transactions
  • Voit toujours ses propres modifications
  • Peut entrer en conflit avec d’autres transactions en cas de modification des mĂŞmes enregistrements

Niveau SERIALIZABLE

  • Niveau d’isolation maximum
  • Plus de lectures non rĂ©pĂ©tables
  • Plus de lectures fantĂ´mes
  • InstantanĂ© au dĂ©marrage de la transaction
  • Verrouillage informatif des enregistrements consultĂ©s (verrouillage des prĂ©dicats)
  • Erreurs de sĂ©rialisation en cas d’incompatibilitĂ©

L’implémentation MVCC de PostgreSQL

  • Colonnes xmin/xmax
  • Fichiers clog
  • Avantages/inconvĂ©nients
  • OpĂ©ration VACUUM
  • Structure Free Space Map (FSM)
  • Wrap-Around
  • Heap-Only Tuples (HOT)
  • Visibility Map

xmin et xmax (1/4)

Table initiale :

xmin xmax Nom Solde

100 100

 

M. Durand M. Dupond

1500 2200

xmin et xmax (2/4)

BEGIN;
UPDATE soldes SET solde=solde-200 WHERE nom = 'M. Durand';
xmin xmax Nom Solde

100 100 150

150

M. Durand M. Dupond M. Durand

1500 2200 1300

xmin et xmax (3/4)

UPDATE soldes SET solde=solde+200 WHERE nom = 'M. Dupond';
xmin xmax Nom Solde

100 100 150 150

150 150

M. Durand M. Dupond M. Durand M. Dupond

1500 2200 1300 2400

xmin et xmax (4/4)

xmin xmax Nom Solde

100 100 150 150

150 150

M. Durand M. Dupond M. Durand M. Dupond

1500 2200 1300 2400

  • Comment est effectuĂ©e la suppression d’un enregistrement ?
  • Comment est effectuĂ©e l’annulation de la transaction 150 ?

CLOG

  • La CLOG (Commit Log) enregistre l’état des transactions.
  • Chaque transaction occupe 2 bits de CLOG

Avantages du MVCC PostgreSQL

  • Avantages :
    • avantages classiques de MVCC (concurrence d’accès)
    • implĂ©mentation simple et performante
    • peu de sources de contention
    • verrouillage simple d’enregistrement
    • rollback instantanĂ©
    • donnĂ©es conservĂ©es aussi longtemps que nĂ©cessaire

Inconvénients du MVCC PostgreSQL

  • InconvĂ©nients :
    • Nettoyage des enregistrements (VACUUM)
    • Tables plus volumineuses
    • Pas de visibilitĂ© dans les index

Fonctionnement de VACUUM (1/3)

Algorithme du vacuum 1/3
Algorithme du vacuum 1/3

Fonctionnement de VACUUM (2/3)

Algorithme du vacuum 2/3
Algorithme du vacuum 2/3

Fonctionnement de VACUUM (3/3)

Algorithme du vacuum 3/3
Algorithme du vacuum 3/3

Progression du VACUUM

  • Vue pg_stat_progress_vacuum
    • disponible dès la 9.6
  • heap_blks_scanned, blocs parcourus
  • heap_blks_vacuumed, blocs nettoyĂ©s
  • index_vacuum_count, nombre de passes dans l’index

Optimisations de MVCC

  • MVCC a Ă©tĂ© affinĂ© au fil des versions :

    • Heap-Only Tuples
    • Free Space Map dynamique
    • Visibility Map

Le problème du Wraparound

Wraparound : bouclage d’un compteur

  • Le compteur de transactions : 32 bits
  • 4 milliards de transactions
  • Qu’arrive-t-il si on boucle ?
  • Quelles protections ?

Vacuum et son paramétrage 1/2

  • MĂ©moire
    • maintenance_work_mem
  • Gestion du coĂ»t
    • vacuum_cost_delay
    • vacuum_cost_page_hit
    • vacuum_cost_page_miss
    • vacuum_cost_page_dirty
    • vacuum_cost_limit

Vacuum et son paramétrage 2/2

  • Gel des lignes
    • vacuum_freeze_min_age
    • vacuum_freeze_table_age
    • vacuum_multixact_freeze_min_age
    • vacuum_multixact_freeze_table_age

Vacuum : maintenance_work_mem

  • QuantitĂ© de mĂ©moire allouable
  • Impact sur VACUUM
  • Sur construction d’index (hors sujet)

Vacuum : vacuum_cost_*

  • vacuum_cost_page_hit
  • vacuum_cost_page_miss
  • vacuum_cost_page_dirty
  • vacuum_cost_limit
  • vacuum_cost_delay

VACUUM FREEZE

  • Principe de FREEZE
  • vacuum_freeze_min_age
  • vacuum_freeze_table_age
  • vacuum_multixact_freeze_min_age
  • vacuum_multixact_freeze_table_age

Autovacuum et son paramétrage

  • Autovacuum :

    • Ne plus s’occuper de VACUUM
    • Automatique
    • Suit l’activitĂ©
    • S’occupe aussi des statistiques

Autovacuum - Paramétrage

  • autovacuum
  • autovacuum_naptime
  • autovacuum_max_workers
  • autovacuum_work_mem

Autovacuum - Paramétrage

  • autovacuum_vacuum_threshold
  • autovacuum_vacuum_scale_factor
  • autovacuum_analyze_threshold
  • autovacuum_analyze_scale_factor

Autovacuum - Paramétrage

  • autovacuum_vacuum_cost_delay
  • autovacuum_vacuum_cost_limit

Autovacuum - Paramétrage

  • autovacuum_freeze_max_age
  • autovacuum_multixact_freeze_max_age

Verrouillage et MVCC

La gestion des verrous est liée à l’implémentation de MVCC.

  • Verrouillage d’objets en mĂ©moire
  • Verrouillage d’objets sur disque
  • Paramètres

Le gestionnaire de verrous

PostgreSQL possède un gestionnaire de verrous

  • Verrous d’objet
  • Niveaux de verrouillage
  • Deadlock
  • Vue pg_locks

Verrous sur enregistrement

  • Le gestionnaire de verrous possède des verrous sur enregistrements.

  • Ils sont :

    • transitoires
    • pas utilisĂ©s pour prendre les verrous dĂ©finitifs
  • Utilisation de verrous sur disque.

  • Pas de risque de pĂ©nurie de verrous.

Verrous - Paramètres

  • max_locks_per_transaction et max_pred_locks_per_transaction
  • lock_timeout
  • deadlock_timeout
  • log_lock_waits

Conclusion

  • PostgreSQL dispose d’une implĂ©mentation MVCC complète, permettant :
    • Que les lecteurs ne bloquent pas les Ă©crivains
    • Que les Ă©crivains ne bloquent pas les lecteurs
    • Que les verrous en mĂ©moire soient d’un nombre limitĂ©
  • Cela impose par contre une mĂ©canique un peu complexe, dont les parties visibles sont la commande VACUUM et le processus d’arrière-plan Autovacuum.

Questions

N’hésitez pas, c’est le moment !

Travaux Pratiques

Point In Time Recovery

PostgreSQL
PostgreSQL

Introduction

  • Sauvegarde traditionnelle
    • sauvegarde pg_dump Ă  chaud
    • sauvegarde des fichiers Ă  froid
  • Insuffisant pour les grosses bases
    • Long Ă  sauvegarder
    • Encore plus long Ă  restaurer
  • Perte de donnĂ©es potentiellement importante
    • car impossible de rĂ©aliser frĂ©quemment une sauvegarde
  • Une solution : la sauvegarde PITR

Au menu

  • Mettre en place la sauvegarde PITR
    • archivage manuel ou avec pg_receivewal
    • sauvegarde manuelle ou avec pg_basebackup
  • Restaurer une sauvegarde PITR
  • Quelques outils pour aller plus loin
    • barman
    • pitrery

PITR

  • Point In Time Recovery
  • Ă€ chaud
  • En continu
  • CohĂ©rente

Principes

  • Les journaux de transactions contiennent toutes les modifications
  • Il faut les archiver
  • ... et avoir une image des fichiers Ă  un instant t
  • La restauration se fait en restaurant cette image
  • ... et en rejouant les journaux
    • entièrement
    • partiellement (ie jusqu'Ă  un certain moment)

Avantages

  • Sauvegarde Ă  chaud
  • Rejeu d'un grand nombre de journaux
  • Moins de perte de donnĂ©es

Inconvénients

  • Sauvegarde de l'instance complète
  • NĂ©cessite un grand espace de stockage (donnĂ©es + journaux)
  • Risque d'accumulation des journaux en cas d'Ă©chec d'archivage
  • Restauration de l'instance complète
  • Impossible de changer d'architecture
  • Plus complexe

Mise en place

  • 2 Ă©tapes :
    • Archivage des journaux de transactions
    • par archiver
    • par pg_receivewal
    • Sauvegarde des fichiers
    • manuellement (outils de copie classiques)
    • pg_basebackup

MĂ©thodes d'archivage

  • Deux mĂ©thodes
    • processus archiver
    • pg_receivewal sur un serveur secondaire

Choix du répertoire d'archivage

  • Ă€ faire quelle que soit la mĂ©thode d'archivage
  • Attention aux droits d'Ă©criture dans le rĂ©pertoire
    • la commande configurĂ©e pour la copie doit pouvoir Ă©crire dedans
    • et potentiellement y lire

Processus archiver - configuration

  • configuration (postgresql.conf)
    • wal_level = replica
    • archive_mode = on ou always
    • archive_command = '... une commande ...'
    • archive_timeout = 0
  • Ne pas oublier de forcer l'Ă©criture de l'archive sur disque

Processus archiver - rechargement de la configuration

  • Par redĂ©marrage de PostgreSQL
    • si modification de wal_level et/ou archive_mode
  • Par envoi d'un signal Ă  PostgreSQL

pg_receivewal - explications

  • Utilise le protocole de rĂ©plication
  • Enregistre en local les journaux de transactions
  • Permet de faire de l'archivage PITR
  • Va plus loin que l'archivage standard
    • pas de archive_timeout car toujours au plus près du maĂ®tre
  • NĂ©cessitĂ© d'utiliser les slots de rĂ©plication

pg_receivewal - configuration serveur

  • Modification du fichier postgresql.conf
max_wal_senders = 3
max_replication_slots = 1
  • Modification du fichier pg_hba.conf
host  replication  repli_user  192.168.0.0/24  md5
  • CrĂ©ation de l'utilisateur de rĂ©plication
CREATE ROLE repli_user LOGIN REPLICATION PASSWORD 'supersecret'
  • RedĂ©marrage du serveur PostgreSQL
  • CrĂ©ation d'un slot de rĂ©plication
SELECT pg_create_physical_replication_slot('archivage');

pg_receivewal - lancement de l'outil

  • Exemple de lancement
pg_receivewal -D /data/archives -S archivage
  • Plein d'autres options
    • notamment pour la connexion (-h, -p, -U)
  • Journaux crĂ©Ă©s en temps rĂ©el dans le rĂ©pertoire de stockage
  • Mise en place d'un script de dĂ©marrage
  • S'il n'arrive pas Ă  joindre le maĂ®tre
    • pg_receivewal s'arrĂŞte

Avantages et inconvénients

  • MĂ©thode archiver
    • simple Ă  mettre en place
    • perte au maximum d'un journal de transactions
  • MĂ©thode pg_receivewal
    • mise en place plus complexe
    • perte minimale (les quelques dernières transactions)

Sauvegarde manuelle - 1/3

  • Appel de la procĂ©dure stockĂ©e pg_start_backup()
  • Argument 1
    • un label, libre
  • Argument 2, optionnel
    • un boolĂ©en indiquant si le CHECKPOINT doit ĂŞtre forcĂ©
  • Argument 3, optionnel
    • un boolĂ©en indiquant si la sauvegarde est concurrente
  • Aucun impact pour les utilisateurs

Sauvegarde manuelle - 2/3

  • Sauvegarde des fichiers Ă  chaud
    • le rĂ©pertoire principal des donnĂ©es
    • les tablespaces
  • Ignorer
    • postmaster.pid
    • log
    • pg_wal
    • pg_replslot

Sauvegarde manuelle - 3/3

  • Appel de la procĂ©dure stockĂ©e pg_stop_backup()

pg_basebackup

  • RĂ©alise les diffĂ©rentes Ă©tapes d'une sauvegarde
    • ... via une connexion de rĂ©plication
  • Configuration de rĂ©plication Ă  faire sur le serveur Ă  sauvegarder
  • ExĂ©cution de pg_basebackup sur le serveur de sauvegarde
  • Copie intĂ©grale, pas d'incrĂ©mental
  • Possible d'indiquer un slot de rĂ©plication (9.6)
$ pg_basebackup -Ft -x -c fast -P \
                -h 127.0.0.1 -U sauve -D sauve_20120625

Fréquence de la sauvegarde

  • DĂ©pend des besoins
  • De tous les jours Ă  tous les mois
  • Plus elles sont espacĂ©es, plus la restauration est longue
    • et plus le risque d'un journal corrompu ou absent est important

Restaurer une sauvegarde PITR

  • Une procĂ©dure relativement simple
  • Mais qui doit ĂŞtre effectuĂ©e rigoureusement

Restaurer une sauvegarde PITR (1/4)

  • S'il s'agit du mĂŞme serveur
    • arrĂŞter PostgreSQL
    • supprimer le rĂ©pertoire des donnĂ©es
    • supprimer les tablespaces

Restaurer une sauvegarde PITR (2/4)

  • Restaurer les fichiers de la sauvegarde
  • Supprimer les fichiers compris dans le rĂ©pertoire pg_wal restaurĂ©
    • ou mieux, ne pas les avoir inclus dans la sauvegarde initialement
  • Restaurer le dernier journal de transactions connu (si disponible).

Restaurer une sauvegarde PITR (3/4)

  • Configuration (recovery.conf)
    • restore_command = '... une commande ...'
  • Si restauration jusqu'Ă  un certain moment
    • recovery_target_name, recovery_target_time
    • recovery_target_xid, recovery_target_lsn
    • recovery_target_inclusive
  • Divers
    • recovery_target_timeline
    • pause_at_recovery_target

Restaurer une sauvegarde PITR (4/4)

  • DĂ©marrer PostgreSQL

Restauration PITR : différentes timelines

  • En fin de recovery, la timeline change :
    • L'historique des donnĂ©es prend une autre voie
    • Le nom des WAL change pour Ă©viter d'Ă©craser des archives suivant le point d'arrĂŞt
    • L'aiguillage est inscrit dans un fichier .history, archivĂ©
  • Permet de faire plusieurs restaurations PITR Ă  partir du mĂŞme basebackup
  • recovery_target_timeline permet de choisir la timeline Ă  suivre

Restauration PITR : illustration des timelines

Les timelines

Pour aller plus loin

  • Gagner en place
    • ... en compressant les journaux de transactions
  • Se faciliter la vie avec diffĂ©rents outils
    • barman
    • pitrery

Compresser les journaux de transactions

  • Objectif : Ă©viter de consommer trop de place disque
  • MĂ©thode recommandĂ©e
    • outils de compression standards : gzip, bzip2, lzma
  • MĂ©thode dĂ©conseillĂ©e
    • outil de compression spĂ©cialisé : pglesslog

barman

  • Gère la sauvegarde et la restauration
    • mode pull
    • multi-serveurs
  • Une seule commande (barman)
  • Et de nombreuses actions
    • list-server, backup, list-backup, recover, ...

pitrery

  • Gère la sauvegarde et la restauration
    • mode push
    • mono-serveur
  • Multi-commandes
    • archive_xlog
    • pitrery
    • restore_xlog

Conclusion

  • Une sauvegarde
    • Fiable
    • ÉprouvĂ©e
    • Rapide
    • Continue
  • Mais
    • Plus complexe Ă  mettre en place
    • Qui restaure toute l'instance

Travaux Pratiques

PostgreSQL Avancé 1

PostgreSQL
PostgreSQL

Préambule

Comme tous les SGBD-R, PostgreSQL fournit des fonctionnalités avancées.

Ce module présente les fonctionnalités orientées DBA.

Vues Système

PostgreSQL propose de nombreuses vues système :

  • Pour monitorer/remonter de la mĂ©trologie
  • Pour diagnostiquer un incident
  • Pour rapidement obtenir des informations sur le système

pg_stat_activity

pg_stat_activity :

  • Liste des processus en cours
    • sessions
    • processus en tâche de fond (10+)
  • RequĂŞte en cours/dernière exĂ©cutĂ©e
  • IDLE IN TRANSACTION
  • Sessions en attente de verrou
  • Gagne en informations au fil des versions

pg_stat_ssl

Quand le SSL est activé sur le serveur, cette vue indique pour chaque connexion cliente les informations suivantes :

  • SSL activĂ© ou non
  • Version SSL
  • Suite de chiffrement
  • Nombre de bits pour algorithme de chiffrement
  • Compression activĂ©e ou non
  • Distinguished Name (DN) du certificat client

pg_stat_database

pg_stat_database :

Des informations globales Ă  chaque base :

  • nombre de sessions
  • transactions validĂ©es/annulĂ©es
  • accès blocs
  • accès enregistrements
  • taille et nombre de fichiers temporaires
  • temps d'entrĂ©es/sorties

pg_stat_user_tables

pg_stat_user_tables :

  • statistiques niveau « ligne »
  • insertions/mise Ă  jour/suppression
  • type et nombre d'accès
  • opĂ©rations de maintenance
  • dĂ©tection des tables mal indexĂ©es ou très accĂ©dĂ©es

pg_stat_user_indexes

pg_stat_user_indexes :

  • vue par index
  • nombre d'accès et efficacite

pg statio user tables indexes

pg_statio_user_tables, pg_statio_user_indexes :

  • opĂ©rations au niveau bloc
  • demandĂ©s Ă  l'OS ou au cache
  • calculer des hit ratios

pg_locks

  • pg_locks :
    • visualisation des verrous en place
    • tous types de verrous sur objets
  • Complexe Ă  interprĂ©ter :

pg_stat_bgwriter

pg_stat_bgwriter

  • activitĂ© des checkpoint
  • visualiser le volume d'allocations et d'Ă©critures

pg_stat_archiver

pg_stat_archiver (9.4+) :

  • bon fonctionnement de l'archivage
  • quand et combien d'erreurs d'archivages se sont produites

pg_stat_replication et pg_stat_database_conflicts

pg_stat_replication :

  • État des esclaves connectĂ©s au maĂ®tre en SR
  • Mesure du lag

pg_stat_database_conflicts :

  • nombre de conflits de rĂ©plication
  • par type

Index Avancés

De nombreuses fonctionnalités d'indexation sont disponibles dans PostgreSQL :

  • Index multi-colonnes
  • Index fonctionnels
  • Index partiels
  • Covering indexes
  • Classes d'opĂ©rateurs
  • GiN
  • GIST
  • BRIN
  • Hash

Index Multi-Colonnes

Un index peut référencer plus d'une colonne :

  • CREATE INDEX idx ON ma_table (col1,col2,col3)
  • Index triĂ© sur le n-uplet (col1,col2,col3)
  • Accès direct Ă  n'importe quelle valeur de
    • (col1,col2,col3)
    • (col1,col2)
    • (col1)

Index Fonctionnels

Il s'agit d'un index sur le résultat d'une fonction :

WHERE upper(a)='DUPOND'
  • l'index classique ne fonctionne pas
CREATE INDEX mon_idx ON ma_table ((UPPER(a))
  • La fonction doit ĂŞtre IMMUTABLE

Index partiel

  • Un index partiel n'indexe qu'une partie des donnĂ©es d'une table, en prĂ©cisant une clause WHERE Ă  la crĂ©ation de l'index :
CREATE INDEX idx_partiel ON trapsnmp (date_reception)
WHERE est_acquitte=false;
  • Beaucoup plus petit que l'index complet.
  • Souvent dĂ©diĂ© Ă  une requĂŞte prĂ©cise :
SELECT * FROM trapsnmp WHERE est_acquitte=false
ORDER BY date_reception
  • La clause WHERE ne porte pas forcĂ©ment sur la colonne indexĂ©e, c'est mĂŞme souvent plus intĂ©ressant de la faire porter sur une autre colonne.

Covering Indexes

Les Covering Indexes (on trouve parfois « index couvrants » dans la littérature française) :

  • RĂ©pondent Ă  la clause WHERE
  • ET contiennent toutes les colonnes demandĂ©es par la requĂŞte
  • SELECT col1,col2 FROM t1 WHERE col1>12
  • CREATE INDEX idx1 on T1 (col1,col2)
  • Pas de visite de la table (donc peu d'accès alĂ©atoires, l'index Ă©tant Ă  peu près triĂ© physiquement)

Classes d'opérateurs

Un index utilise des opérateurs de comparaison :

  • Il peut exister plusieurs façons de comparer deux donnĂ©es du mĂŞme type
  • Par exemple, pour les chaĂ®nes de caractères
    • DiffĂ©rentes collations
    • Tri sans collation (pour LIKE)
  • CREATE INDEX idx1 ON ma_table (col_varchar varchar_pattern_ops)
  • Permet SELECT ... FROM ma_table WHERE col_varchar LIKE 'chaine%'

Tout ensemble !

Toutes les fonctionnalités que nous venons de voir peuvent bien sûr être utilisées simultanément :

CREATE INDEX idx_adv ON ma_table
(f(col1), col2 varchar_pattern_ops) WHERE col3<12 ;

SELECT col2 FROM ma_table
WHERE col3<12 and f(col1)=7 and col2 LIKE 'toto%' ;

GIN

  • Generalized Inverted iNdex
  • Index inversĂ© ?
    • Index associe une valeur Ă  la liste de ses adresses
    • Utile pour tableaux, listes…
  • Pour chaque entrĂ©e du tableau
    • Liste d'adresses (TID) oĂą le trouver
  • Option fastupdate (8.4+)
    • Ă  dĂ©sactiver pour avoir un temps de rĂ©ponse stable
  • Liste compressĂ©e (9.4+)
    • alternative Ă  bitmap

GiST

GiST : Generalized Search Tree

  • Arbre de recherche gĂ©nĂ©ralisĂ©
  • Indexation non plus des valeurs mais de la vĂ©racitĂ© de prĂ©dicats
  • Moins performants car moins sĂ©lectifs que Btree
  • Mais peuvent indexer Ă  peu près n'importe quoi
  • Multi-colonnes dans n'importe quel ordre
  • Sur-ensemble de Btree et Rtree

BRIN

BRIN : Block Range INdex (9.5+)

  • Utile pour les tables très volumineuses
    • L'index produit est petit
  • Performant lorsque les valeurs sont corrĂ©lĂ©es Ă  leur emplacement physique
  • Types qui peuvent ĂŞtre triĂ©s linĂ©airement (pour obtenir min/max)

Hash

Index Hash :

  • Non journalisĂ©s donc facilement corrompus
  • Moins performants que les Btree
  • Ne gèrent que les Ă©galitĂ©s, pas < et >
  • Mais plus compacts
  • Ă€ ne pas utiliser

Utilisation d'index

Index inutilisé :

  • L'optimiseur pense qu'il n'est pas rentable
    • Il a le plus souvent raison
    • S'il se trompe : statistiques ? bug ?
  • La requĂŞte n'est pas compatible
    • Clause WHERE avec fonction ?
    • Cast ?
  • C'est souvent tout Ă  fait normal

Contraintes d'Exclusion

Contrainte d'exclusion : Une extension du concept d'unicité

  • UnicitĂ© : n-uplet1 = n-uplet2 interdit dans une table

  • Contrainte d'exclusion : n-uplet1 op n-uplet2 interdit dans une table

  • op est n'importe quel opĂ©rateur indexable par GiST

CREATE TABLE circles
    ( c circle,
      EXCLUDE USING gist (c WITH &&));

Partitionnement ancienne génération

  • Avant la version 10
  • Fractionner une table en plusieurs tables plus petites
    • meilleures performances
    • maintenance plus facile
  • Type de fractionnement
    • liste
    • intervalle ou Ă©chelle de valeur
    • hachage

Principe du partitionnement

  • DĂ©terminer la clĂ© de partitionnement
  • CrĂ©er la table principale
  • CrĂ©er les tables filles
  • Rediriger les Ă©critures
    • Écriture dans la dernière partition crĂ©Ă©e
    • Écriture en fonction de la clĂ©
  • ParamĂ©trer PostgreSQL pour les lectures
  • Tester les requĂŞtes (plans d'exĂ©cution)

Partitionnement et héritage

  • HĂ©ritage de tables
  • Table principale :
    • table mère dĂ©finie normalement
  • Partitions :
    • tables filles
    • hĂ©ritent des propriĂ©tĂ©s de la table mère
    • mais pas les contraintes, index et droits

Gestion des lectures

  • Les lectures sont gĂ©rĂ©es par l'optimiseur
  • constraint_exclusion change son comportement
    • off, optimisation du partitionnement dĂ©sactivĂ©e
    • partition, optimisation activĂ©e pour les tables enfants ou requĂŞtes avec UNION ALL
    • on, recherche d'une optimisation pour toutes les tables
  • constraint_exclusion = partition par dĂ©faut
  • L'optimisation consiste Ă  ne parcourir que les partitions utiles

Gestion des Ă©critures

  • PostgreSQL sait gĂ©rer
    • les DELETE
    • les UPDATE (tant que la clĂ© de partitionnement n'est pas mise Ă  jour)
  • Il faut l'aider pour :
    • rediriger les INSERT dans la bonne partition
    • aider les UPDATE sur la clĂ© de partitionnement
  • On utilisera un TRIGGER

Insertion de données

CREATE OR REPLACE FUNCTION ins_logs() RETURNS TRIGGER
LANGUAGE plpgsql AS $FUNC$
BEGIN
  IF NEW.dreception >= '2014-01-01'
  AND NEW.dreception <= '2014-12-31' THEN
    INSERT INTO logs_2014 VALUES (NEW.*);
  ELSIF NEW.dreception >= '2013-01-01'
  AND NEW.dreception <= '2013-12-31' THEN
    INSERT INTO logs_2013 VALUES (NEW.*);
  ELSIF NEW.dreception >= '2012-01-01'
  AND NEW.dreception <= '2012-12-31' THEN
    INSERT INTO logs_2012 VALUES (NEW.*);
  END IF;
  RETURN NULL;
END;
$FUNC$;

Mise à jour de la clé de partitionnement

CREATE OR REPLACE FUNCTION f_upd_logs() RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
  DELETE FROM logs_2014 WHERE dreception=OLD.dreception;
  INSERT INTO logs VALUES (NEW.*);
  RETURN NULL;
END;
$$;

Limitations du partitionnement

  • Pas de contraintes d'unicitĂ© sur l'ensemble des tables partitionnĂ©es
    • la contrainte n'est vĂ©rifiĂ©e que dans la partition
  • Performances dĂ©gradĂ©es en Ă©criture
  • Certaines requĂŞtes ont des plans d'exĂ©cution dĂ©sastreux
  • L'hĂ©ritage n'est pas conçu pour permettre plus de 100 partitions
  • Utilisation bien plus importante des verrous

Outils de partitionnement

  • Outils pour simplifier la gestion
    • pg_partman

Partitionnement nouvelle génération

  • Ă€ partir de la version 10
  • Mise en place et administration simplifiĂ©es car intĂ©grĂ©es au moteur
  • Gestion automatique des lectures et Ă©critures
  • Partitions
    • attacher/dĂ©tacher une partition
    • contrainte implicite de partitionnement
    • expression possible pour la clĂ© de partitionnement
    • sous-partitions possibles

Partitionnement par liste

  • Liste de valeurs par partition

  • CrĂ©er une table partitionnĂ©e :
    CREATE TABLE t1(c1 integer, c2 text) PARTITION BY LIST (c1);

  • Ajouter une partition :
    CREATE TABLE t1_a PARTITION of t1 FOR VALUES IN (1, 2, 3);

  • Attacher la partition :
    ALTER TABLE t1 ATTACH PARTITION t1_a FOR VALUES IN (1, 2, 3);

  • DĂ©tacher la partition :
    ALTER TABLE t1 DETACH PARTITION t1_a;

Partitionnement par intervalle

  • Intervalle de valeurs par partition
  • CrĂ©er une table partitionnĂ©e :

    CREATE TABLE t2(c1 integer, c2 text) PARTITION BY RANGE (c1);

  • Ajouter une partition :

    CREATE TABLE t2_1 PARTITION OF t2 FOR VALUES FROM (1) TO (100);

  • DĂ©tacher une partition :

    ALTER TABLE t2 DETACH PARTITION t2_1;

Clé de partitionnement multi-colonnes

  • ClĂ© sur plusieurs colonnes acceptĂ©e
    • uniquement pour le partitionnement par intervalle
  • CrĂ©er une table partitionnĂ©e avec une clĂ© multi-colonnes :
    CREATE TABLE t1(c1 integer, c2 text, c3 date)
    PARTITION BY RANGE (c1, c3);

  • Ajouter une partition :
    CREATE TABLE t1_a PARTITION of t1
     FOR VALUES FROM (1,'2017-08-10') TO (100, '2017-08-11');

Performances en insertion

t1 (non partitionnée) :

INSERT INTO t1 select i, 'toto'
  FROM generate_series(0, 9999999) i;
Time: 10097.098 ms (00:10.097)

t2 (nouveau partitionnement) :

INSERT INTO t2 select i, 'toto'
  FROM generate_series(0, 9999999) i;
Time: 11448.867 ms (00:11.449)

t3 (ancien partitionnement) :

INSERT INTO t3 select i, 'toto'
  FROM generate_series(0, 9999999) i;
Time: 125351.918 ms (02:05.352)

Limitations

  • La table mère ne peut pas avoir de donnĂ©es
  • La table mère ne peut pas avoir d'index
    • ni PK, ni UK, ni FK pointant vers elle
  • Pas de colonnes additionnelles dans les partitions
  • L'hĂ©ritage multiple n'est pas permis
  • Valeurs nulles acceptĂ©es dans les partitions uniquement si la table partitionnĂ©e le permet
  • Partitions distantes pour l'instant pas supportĂ©es
  • En cas d'attachement d'une partition
    • vĂ©rification du respect de la contrainte (Seq Scan de la table)
    • sauf si ajout au prĂ©alable d'une contrainte CHECK identique

Tablespaces

Un espace de stockage :

  • Un rĂ©pertoire du système d'exploitation hors de PGDATA
  • Soit pour rĂ©partition d'entrĂ©es/sorties
  • Soit pour quota (taille du système de fichiers)
CREATE TABLESPACE tbs1 LOCATION '/fs1/';
ALTER TABLE ma_table SET TABLESPACE tbs1;
  • seq_page_cost et random_page_cost par tablespace
  • temp_tablespaces

TOAST

TOAST : The Oversized-Attribute Storage Technique

  • Un enregistrement ne peut pas dĂ©passer la taille d'un bloc
  • « Contournement » : champs trop grands dans table de dĂ©bordement TOAST
  • Éventuellement compressĂ© : PLAIN/MAIN/EXTERNAL/EXTENDED
  • Jusqu'Ă  1 Go par attribut
  • Transparent, seulement visible par pg_class

Objets Binaires

Deux méthodes pour stocker des objets binaires :

  • bytea : une colonne comme une autre de la table
    • Maxi 1 Go (Ă  Ă©viter)
    • Accès alĂ©atoire Ă  un morceau lent
  • Large Object
    • Se manipule plutĂ´t comme un fichier
    • Accès avec des primitives de type fichier
    • Maxi 4To (Ă  Ă©viter aussi…)
    • Objet sĂ©parĂ©

bytea

Type natif :

  • Se manipule exactement comme les autres :
    • bytea : bytea array, tableau d'octets
    • ReprĂ©sentation textuelle de son contenu
    • Deux formats : hex et escape (bytea_output)
  • Si le champ est gros, sa rĂ©cupĂ©ration l'alloue intĂ©gralement en mĂ©moire
  • Toute modification d'un morceau du bytea entraĂ®ne la rĂ©Ă©criture complète du bytea
  • IntĂ©ressant pour les petits volumes, jusqu'Ă  quelques mĂ©ga-octets

Large Object

Large Object :

  • Totalement indĂ©pendant de la table
  • IdentifiĂ© par un OID (identifiant numĂ©rique unique)
  • On stocke habituellement cet OID dans la table « principale »
  • Suppression manuelle, par trigger, ou par batch (extensions)
  • lo_create(), lo_import(), lo_seek(), lo_open(), lo_read(), lo_write()…

Unlogged Tables

Unlogged Tables :

  • Les donnĂ©es d'une table ne nĂ©cessitent pas toujours la durabilitĂ©
    • Tables temporaires « partagĂ©es » entre plusieurs sessions
    • IntĂ©gration de donnĂ©es
    • Cache de donnĂ©es gĂ©nĂ©rĂ©es
    • DonnĂ©es « matĂ©rialisĂ©es »
  • Non journalisĂ©e, donc non rĂ©pliquĂ©e et remise Ă  zĂ©ro en cas de crash

Unlogged Tables, suite

  • Depuis la 9.5 on peut passer d'une table journalisĂ©e Ă  non journalisĂ©e et vice-versa
    • ALTER TABLE SET LOGGED
  • Attention Ă  la production de fichiers WAL lors du passage de UNLOGGED Ă  LOGGED.

Recherche Plein Texte

Full Text Search/Recherche Plein Texte

  • Recherche « à la Google » :
  • On n'indexe plus une chaĂ®ne de caractère mais
    • Les mots (« lexèmes ») qui la composent
    • On peut rechercher sur chaque lexème indĂ©pendamment
  • Les lexèmes sont soumis Ă  des règles spĂ©cifiques Ă  chaque langue
  • Dictionnaires filtrants (unaccent)
  • S'appuie sur GIN ou GiST

Collation par colonne

Collation par colonne :

  • L'ordre alphabĂ©tique pas forcĂ©ment le mĂŞme pour toute une base
    • Champs multi-lingues par exemple
  • PossibilitĂ© de prĂ©ciser la collation
    • Par colonne
    • Par index
    • Par requĂŞte
    • CREATE TABLE messages (id int,fr TEXT COLLATE "fr_FR.utf8", de TEXT COLLATE "de_DE.utf8");

Serializable Snapshot Isolation

SSI : Serializable Snapshot Isolation

  • Chaque transaction est seule sur la base
  • Si on ne peut maintenir l'illusion
    • Une des transactions en cours est annulĂ©e
  • Sans blocage
  • On doit ĂŞtre capable de rejouer la transaction
  • Toutes les transactions impliquĂ©es doivent ĂŞtre serializable
  • default_transaction_isolation=serializable dans la configuration

Conclusion

  • Aucune information n'est cachĂ©e (Open-Source)
  • Nombreuses tables et vues systèmes pour trouver l'information sur l'Ă©tat du serveur
  • PostgreSQL embarque des fonctionnalitĂ©s performantes, complexes et parfois uniques dans le monde des bases de donnĂ©es Open Source

Questions

N'hésitez pas, c'est le moment !

Travaux pratiques

PostgreSQL Avancé 2

PostgreSQL
PostgreSQL

Préambule

Ce module présente les extensions de PostgreSQL.

Les extensions permettent de rajouter des types de données, des méthodes d'indexation, des fonctions et opérateurs, des tables, des vues…

Dans le but de rajouter des fonctionnalités.

Contribs

Ce sont des fonctionnalitées :

  • LivrĂ©es avec le code source de PostgreSQL
  • Habituellement packagĂ©es (postgresql-*-contrib)
  • De qualitĂ© garantie parce que maintenues par le projet
  • Mais optionnelles et dĂ©sactivĂ©es par dĂ©faut
  • Ou fonctionnalitĂ©s en cours de stabilisation
  • DocumentĂ©es dans les annexes de PostgreSQL !
  • Chapitre F : « Additional Supplied Modules »

Extensions

Ce sont :

  • Des « packages » pour PostgreSQL
  • Un ensemble d'objets livrĂ©s ensemble
  • Connus en tant que tels par le catalogue PostgreSQL
  • CREATE EXTENSION, ALTER EXTENSION UPDATE, DROP EXTENSION
  • Option CASCADE (Ă  partir de 9.6)
  • contrib <> extension

Connexions Distantes

3 approches :

  • Foreign Data Wrapper
  • dblink (historique)
  • PL/Proxy (sharding)

Foreign Data Wrappers

PostgreSQL supporte SQL/MED :

  • Management of External Data
  • Extension de la norme SQL ISO
  • DonnĂ©es externes prĂ©sentĂ©es comme des tables
  • En lecture/Ă©criture (si supportĂ© par le driver et Ă  partir de PostgreSQL 9.3)
    • PostgreSQL, Oracle, MySQL (lecture/Ă©criture)
    • fichier CSV, fichier fixe (en lecture)
    • ODBC, JDBC, Multicorn
    • CouchDB, Redis (NoSQL)

SQL/MED : utilisation

Installer un driver (foreign data wrapper) :

CREATE EXTENSION file_fdw;

Créer un « serveur » (ici pas d'options, vu que c'est un driver fichier) :

CREATE SERVER file FOREIGN DATA WRAPPER file_fdw ;

Créer une « foreign table »

CREATE FOREIGN TABLE statistical_data (f1 numeric, f2 numeric)
   SERVER file OPTIONS (filename '/tmp/statistical_data.csv',
                        format 'csv', delimiter ';') ;

SQL/MED : héritage

  • La version 9.5 introduit la notion d'hĂ©ritage
  • Une table locale peut hĂ©riter d'une table distante et inversement
  • Permet le partitionnement sur plusieurs serveurs
  • Pour rappel, l'hĂ©ritage ne permet pas de conserver :
    • les contraintes d'unicitĂ© et rĂ©fĂ©rentielles ;
    • les index ;
    • les droits.

SQL/MED : PostgreSQL

  • Ajouter le FDW
  • Ajouter un serveur
  • Ajouter une table distante
  • Lire la table distante
  • Écrire dans la table distante
  • Analyser la table distante
  • Plus lent qu'une table locale, surtout pour les patterns d'accès complexes
  • Permet le requĂŞtage inter-bases PostgreSQL
  • Simple et bien documentĂ©
  • L'auteur a voulu obtenir la mĂŞme fonctionnalitĂ© que celle qui est disponible dans une base commerciale rĂ©putĂ©e... d'oĂą le nom.
  • En lecture seule sauf Ă  Ă©crire des triggers sur vue
  • Ne transmet pas les prĂ©dicats au serveur distant : tout l'objet est systĂ©matiquement rĂ©cupĂ©rĂ©
  • Plus d'intĂ©rĂŞt depuis que le driver SQL/MED pour PostgreSQL est mature

PL/Proxy : présentation

  • Une alternative Ă  dblink
  • PossibilitĂ© de distribuer les requĂŞtes
  • Utile pour le « partionnement horizontal »
  • Uniquement si votre application n'utilise que des appels de fonction Ă  la base

hstore-json-jsonb

Stockage de données non-relationnelles :

  • hstore : clĂ©-valeur, stockage binaire, fonctions d'extraction, de requĂŞtage, d'indexation avancĂ©e
  • json : stockage texte JSON, validation syntaxique, fonctions d'extraction
  • jsonb : stockage binaire de JSON, converti pour accès rapide, fonctions d'extraction, de requĂŞtage, d'indexation avancĂ©e
  • Alternative efficace et performante Ă  EntitĂ©/Attribut/Valeur (très lent)

hstore

Stocker des données non-structurées.

CREATE EXTENSION hstore ;
CREATE TABLE demo_hstore(id serial, meta hstore);
INSERT INTO demo_hstore (meta) values ('river=>t');
INSERT INTO demo_hstore (meta) values ('road=>t,secondary=>t');
INSERT INTO demo_hstore (meta) values ('road=>t,primary=>t');
CREATE INDEX idxhstore ON demo_hstore USING gist (meta);
SELECT * FROM demo_hstore WHERE meta@>'river=>t';
 id |     meta
----+--------------
 15 | "river"=>"t"

json

  • Ce n'est qu'un type texte
  • VĂ©rifie que le texte est au format JSON
  • Fournit des fonctions de manipulation JSON
    • Mais rĂ©-analyse du champ pour chaque appel de fonction
    • On peut indexer une propriĂ©tĂ© (index sur fonction)
    • Mais pas d'index avancĂ© comme pour hstore
  • => Peu utile (comme XML)

jsonb

  • Apparu en 9.4
  • Stockage de JSON en un format Binaire
  • PossibilitĂ©s d'indexation similaires Ă  hstore

Conversions jsonb / relationnels

  • Construire un objet JSON depuis un ensemble : json_object_agg()
  • Construire un ensemble de tuples depuis un objet JSON : jsonb_each(), jsonb_to_record()
  • Manipuler des tableaux : jsonb_array_elements(), jsonb_to_recordset()

jsQuery

  • Extension proposĂ©e
  • Fournit un « langage de requĂŞte », comme tsquery
  • DĂ©pĂ´t github

pg_trgm

CREATE EXTENSION pg_trgm;
SELECT similarity('bonjour','bnojour');
 similarity
------------
   0.333333
CREATE TABLE test_trgm (text_data text);

INSERT INTO test_trgm(text_data) 
VALUES ('hello'), ('hello everybody'),
('helo youg man'),('hallo!'),('HELLO !');

CREATE INDEX test_trgm_idx on test_trgm
  using gist (text_data extensions.gist_trgm_ops);
SELECT text_data FROM test_trgm
 WHERE text_data like '%hello%';

Cette requête passe par l'index test_trgm_idx, malgré le % initial. On peut utiliser un index GIN aussi (comme pour le Full Text Search).

citext

Champ texte insensible Ă  la casse :

  • Beaucoup utilisĂ© pour compatibilitĂ© avec SQL Server/MySQL
  • Les fonctions de comparaison et tri deviennent insensibles Ă  la casse
  • NĂ©cessite une conversion de casse Ă  chaque comparaison
  • Plus lent que le type texte
CREATE EXTENSION citext;
CREATE TABLE ma_table (col_insensible citext);

pgcrypto

Le module contrib de chiffremment

  • Propose de nombreuses fonctions permettant de chiffrer et de dĂ©chiffrer des donnĂ©es
  • Gros inconvĂ©nient : oubliez les index sur les donnĂ©es chiffrĂ©es
  • N'oubliez pas de chiffrer la connexion (SSL)
  • Permet d'avoir une seule mĂ©thode de chiffrement pour tout ce qui accède Ă  la base

PostGIS

Pas une contrib :

  • Un projet totalement indĂ©pendant
  • Licence GPL (logiciel libre)
  • Extension de PostgreSQL aux types gĂ©omĂ©triques/gĂ©ographiques
  • La rĂ©fĂ©rence des bases de donnĂ©es spatiales
  • « quelles sont les routes qui coupent le RhĂ´ne ? »
  • « quelles sont les villes adjacentes Ă  Toulouse ? »
  • « quels sont les restaurants situĂ©s Ă  moins de 3 km de la Nationale 12 ? »

PostGIS (suite)

  • De nombreuses fonctionnalitĂ©s avancĂ©es :
    • Support des coordonnĂ©es gĂ©odĂ©siques
    • Projections, reprojections dans systèmes de coordonnĂ©es locaux (Lambert93 en France par exemple)
    • 3D, extrusions, routage, rasters
    • OpĂ©rateurs d'analyse gĂ©omĂ©trique : enveloppe convexe, simplification…
    • IntĂ©grĂ© aux principaux serveurs de carte, ETL, outils de manipulation
  • UtilisĂ© par IGN, BRGM, AirBNB, Mappy, Openstreetmap, Agence de l'eau…

Contribs orientés DBA

Un certain nombre de contribs donnent accès à des informations ou des fonctions de bas niveau :

  • pgstattuple : fragmentation des tables et index
  • pg_buffercache : Ă©tat du cache
  • pg_freespacemap : liste des blocs libres
  • pg_visibility : Ă©tat de la visibility map
  • pageinspect : inspection du contenu d'une page
  • pgrowlocks : informations dĂ©taillĂ©es sur les enregistrements verrouillĂ©s
  • pg_prewarm : sauvegarde et restauration de l'Ă©tat du cache de la base

pgstattuple

pgstattuple fournit une mesure (par parcours complet de l'objet) sur:

  • pour une table :
    • remplissage des blocs
    • enregistrements morts
    • espace libre
  • pour un index :
    • profondeur de l'index
    • remplissage des feuilles
    • fragmentation (feuilles non consĂ©cutives)

pg_buffercache

Qu'y-a-t'il dans le cache de PostgreSQL ?

Fournit une vue :

  • Pour chaque page (donc pour l'ensemble de l'instance)
    • fichier (donc objet) associĂ©
    • OID base
    • fork (0 : table, 1 : FSM, 2 : VM)
    • numĂ©ro de bloc
    • isdirty
    • usagecount

pg_freespacemap

La Freespacemap :

  • Est renseignĂ©e par VACUUM, par objet (table/index)
  • Et consommĂ©e par les sessions modifiant des donnĂ©es (INSERT/UPDATE)
  • Interroger la freespacemap permet de connaĂ®tre l'espace libre cartographiĂ© par VACUUM
  • Rarement utilisĂ© (dans le cas de doute sur l'efficacitĂ© de VACUUM)

pg_visibility

La Visibility Map :

  • Est renseignĂ©e par VACUUM, par table
  • Permet de savoir que l'ensemble des enregistrements de ce bloc est visible
  • Indispensable pour les parcours d'index seul
  • Interroger la visibility map permet de voir si un bloc est :
    • visible
    • gelĂ©
  • Rarement utilisĂ©

pageinspect

pageinspect :

  • Vision du contenu d'un bloc
  • Sans le dictionnaire, donc sans dĂ©codage des donnĂ©es
  • Affichage brut
  • UtilisĂ© surtout en debug, ou dans les cas de corruption
  • Fonctions de dĂ©codage pour heap (table), bt (btree), entĂŞte de page, et FSM
  • NĂ©cessite de connaĂ®tre le code de PostgreSQL

pgrowlocks

Les verrous mémoire de PostgreSQL ne verrouillent pas les enregistrements :

  • Il est parfois compliquĂ© de comprendre qui verrouille qui, Ă  cause de quel enregistrement
  • pgrowlocks inspecte une table pour dĂ©tecter les enregistrements verrouillĂ©s, leur niveau de verrouillage, et qui les verrouille
  • scan complet de la table (impossible de trouver autrement)

pg_prewarm

Extension Ă  partir de PostgreSQL 9.4 :

  • Charge une liste de blocs
  • Dans le cache du système
    • De façon asynchrone : prefetch (Linux)
    • De façon synchrone : read (tous systèmes)
  • Ou dans le cache PostgreSQL
    • De façon synchrone : buffer (tous systèmes)
  • Ă€ coupler avec une capture du cache (pg_buffercache par exemple)

pg_stat_statements

Capture en temps réel des requêtes :

  • Vue, en mĂ©moire partagĂ©e (volumĂ©trie contrĂ´lĂ©e)
  • Par requĂŞte
    • Nombre d'exĂ©cution, temps cumulĂ© d'exĂ©cution, nombre d'enregistrements retournĂ©s
    • lectures/Ă©critures en cache, demandĂ©es au système, tris
    • temps de lecture/Ă©criture (track_io_timing)
    • Pas d'Ă©chantillonnage, seulement des compteurs cumulĂ©s

auto_explain

N'est pas une extension :

  • Juste un module Ă  charger et des variables Ă  positionner
    • LOAD 'auto_explain' dans une session
    • ou shared_preload_libraries='auto_explain' si global
  • Trace le plan de toute requĂŞte dĂ©passant une durĂ©e d'exĂ©cution dans la log
  • Éventuellement l'EXPLAIN ANALYZE/BUFFERS : Attention, exĂ©cute la requĂŞte une seconde fois !
  • SET auto_explain.log_min_duration = '3s'

PGXN

PostgreSQL eXtension Network :

  • Site WEB : pgxn.org
    • Nombreuses extensions
    • Volontariat
    • Aucune garantie de qualitĂ©
    • Tests soigneux requis
  • Et optionnellement client en python pour automatisation de dĂ©ploiement
  • AncĂŞtre : pgFoundry.org, toujours en service
  • Beaucoup de projets sont aussi sur github

Conclusion

  • Un nombre toujours plus important d'extension permettant d'Ă©tendre les possibilitĂ©s de PostgreSQL
  • Certains modules de contribs sont inclus dans le coeur de PostgreSQL lorsqu'ils sont considĂ©rĂ©s comme matures et utiles au moteur (tsearch, xml2)
  • Un site central pour les extensions PGXN.org, mais toutes n'y sont pas rĂ©fĂ©rencĂ©es.

Questions

N'hésitez pas, c'est le moment !

Travaux Pratiques