Maintenance des données
STDOUT) le flux textuel correspondant à l'ensemble des commandes SQL.
pg_dump ma_database > mon_fichier_de_sauvegarde
Cette approche permet également de faire des échanges de données vers des systèmes SQL autres que PostgreSQL, bien sûr en cas d'utilisations de spécificités PostgreSQL une tâche de portage est à prévoir.
le client pg_dump ne dispose évidemment d'aucun droit particulier, le serveur ne pratiquant l'authentification que sur les informations
lui étant transmises lors de la connexion. Il sera grandement facilité de se connecter à partir du compte UNIX postgres, car la commande
se comportera comme psql, et le mécanisme des sockets
UNIX se mettra en œuvre à moins que celui-ci soit interdit par la configuration
(voir le fichier pg_hba.conf).
Les modifications structurelles des tables ALTER TABLE sont parmi les opérations bloquantes ou bloquées.
tablespacesportant sur le cluster ne sont pas sauvegardées.
pg_dumpall -U postgres --clean > fichier_du_cluster
tablespaces.
La sauvegarde des OIDs
n'est plus disponible depuis la version 12.
cat mon_fichier_de_sauvegarde | psql ma_database
createdb -T template0 base_de_donnees
Il est souvent préférable d'annuler une sauvegarde plutôt que d'avoir une restauration partielle de la base de données. C'est la raison pour laquelle le mode de restauration dans une transaction est le mieux approprié.
Si l'option --create à été utilisée avec pg_dump alors il ne sera pas nécessaire de créer la base car l'instruction de création est dans se cas contenue dans le fichier de sauvegarde.
pg_dump ma_database | psql -h autre_serveur la_bdd
pg_dump ma_database | bzip2 > mon_fichier_arch.bz2
pg_dump ma_database | split -b 100m - mon_fichier
crontab
Il est très souvent pratique de réaliser des procédures de synchronisation automatiques entre différents serveurs PostgreSQL. Ceci est
facilement réalisable par ajout d'une ligne dans la crontab
. Par exemple pour faire une synchronisation toutes les nuits de dimanche à lundi à
3:00 il suffit d'insérer :
0 3 * * 1 pg_dump ma_database | psql -h serveur_mirroir db_mirroir.
Seul le format SQL accessible par --format=plain depuis pg_dump (format par défaut) ne permet pas de restauration par pg_restore.
pg_dump --username=postgres --dbname=test_postgres\ --verbose --format=tar --file=test_postgres.tar pg_dump: last built-in OID is 16383 pg_dump: reading extensions pg_dump: identifying extension members pg_dump: reading schemas ...
pg_restore --username=postgres --dbname=test_postgres\ --table=villes --schema=geo_france\ --verbose test_postgres.tar pg_restore: connecting to database for restore pg_restore: creating TABLE "geo_france.villes" pg_restore: processing data for table "geo_france.villes"
Si le schéma n'est pas précisé alors toutes les tables du nom indiqué seront restaurées.
L'option --clean de pg_restore permet de détruire les objets avant de les régénérer.
pg_dumpall -U postgres | xz |\ gpg -r marc -o - --encrypt dump_all.xz.gpg
gpg -r marc -o - dump_all.xz.gpg |\ xz -d | psql -U postgres
Pour pouvoir utiliser gpg il sera nécessaire d'avoir configuré au préalable l'environnement de stockage des clefs de chiffrement. Cesi peut se faire par l'utilisation de la commande pass comme suit :
pass init username
La commande pass est disponible depuis les dépôts de password-store.
tar -jcf archive.tar.bz2 /var/lib/potgresql/9.0/ma_db
Il ne faut pas oublier les tablespaces
qui sont généralement situées sur des partitions différentes.
On pourrait être tenté de ne sauvegarder et restaurer que certaines tables ou bases de données particulières. Ce n'est pas utilisable sans les fichiers journaux de validation pg_xact/* qui contiennent l'état de la validation de chaque transaction. Un fichier de table n'est utilisable qu'avec cette information. Il est impossible de ne restaurer qu'une table et les données pg_xact associées car cela rendrait toutes les autres tables du serveur inutilisables. Les sauvegardes du système de fichiers fonctionnent, de ce fait, uniquement pour les sauvegardes et restaurations complètes d'un cluster de bases de données.
L'utilisation de la commande rsync en 2 étapes permet de considérablement réduire le temps d'arrêt du serveur PostgreSQL car les modifications suite à l'arrêt du serveur seront mineures entre les deux passages par rsync.
COPY {nom_table [(colonne [, ...])]|(requête)} TO '/chemin/vers/fichier' [WITH (option [, ...])]
COPY nom_table [(colonne [, ...])] FROM '/chemin/vers/fichier' [WITH (option [, ...])]
Si le nom du fichier utilisé est STDIN en restauration ou STDOUT en archivage l'opération sera réalisée en flux depuis le client.
Si une commande SQL est fournie à la place d'un nom de table, le résultat de cette commande sera utilisé pour la sauvegarde. C'est le moyen permettant de faire des sauvegardes partielles de tables ou de vues.
nom | description |
---|---|
FORMAT {text|csv|binary} | format de transfert |
OIDS | si présent les OIDsdes lignes seront exportés |
DELIMITER 'délimiteur' | caractère de séparation |
NULL 'chaîne_null' | chaîne représentant la valeur NULL |
HEADER | placera une ligne d'en-tête en CSV seulement |
QUOTE 'guillemet' | caractère guillemet à utiliser pour mettre entre guillemets |
ESCAPE 'échappement' | caractère d'échappement à utiliser |
FORCE_QUOTE {(colonne [, ...])|*} | force la mise entre guillemets sur les colonnes indiquées |
FORCE_NOT_NULL {(colonne [, ...])|*} | force les valeurs à ne pas être nulles |
Le format par défaut text.
COPY departements TO '/tmp/departements.txt' WITH DELIMITER '|';
COPY (SELECT id_dept,nom,cp,lat,lon,pop FROM villes ORDER by id_dept,nom) TO '/tmp/villes.txt';
COPY departements FROM '/tmp/departements.txt' WITH DELIMITER '|';
COPY villes (id_dept, nom, cp, lat, lon, pop) FROM '/tmp/villes.txt';
Avant d'importer une table avec COPY celle-ci doit exister au préalable.
COPY (DELETE FROM villes WHERE nom ILIKE '%lille%' RETURNING nom,pop,lon,lat) TO '/tmp/villes_part.txt' WITH (FORMAT CSV, FORCE_QUOTE (nom), -- afin de tester lesquotesHEADER true); -- on veut la ligne d'entête
nom,pop,lon,lat "Lille",225784,3.0666,50.6332 "Lillebonne",9310,0.55,49.5167 "Lillemer",225,-1.8666,48.5666 ...
Avant d'importer une table avec COPY celle-ci doit exister au préalable.
Il est cependant toujours possible de réaliser ce transfert uniquement via la commande pg_dumpall.
clusterà monter en version,
clusterdans la nouvelle version par initdb,
pg_upgrade -b /usr/pgsql/11/bin -B /usr/pgsql/12/bin \ -d /var/lib/pg_sql/11/data -D /var/lib/pg_sql/12/data
Il conviendra bien sûr d'invoquer la commande pg_upgrade depuis la machine hébergeant le cluster
à migrer
et sous le nom de l'utilisateur approprié (le plus souvent postgres).
man pg_dump
man pg_dumpall
man pg_upgrade
Il n'y a pas de méthode de sauvegarde qui soit meilleure qu'une autre. Chacune est à utiliser dans le contexte le plus approprié.