Je cherche à modifier la façon dont les sauvegardes sont effectuées et je me demande s'il existe un moyen de déterminer quelles bases de données dans un cluster postgreql n'ont pas été récemment modifiées?
Au lieu d'utiliser pg_dumpall, j'aimerais utiliser pg_dump et ne vider que les bases de données qui ont changé depuis la dernière sauvegarde (certaines bases de données ne sont pas mises à jour très souvent) - l'idée étant que si rien n'a changé, la sauvegarde actuelle devrait soyez toujours bon.
Quelqu'un connaît-il un moyen de déterminer quand une base de données spécifique a été mise à jour / modifiée pour la dernière fois?
Merci...
Mettre à jour:
J'espérais ne pas avoir à écrire des déclencheurs partout car je n'ai aucun contrôle sur la création de bases de données dans un cluster particulier (sans parler de la création d'objets DB dans une base de données).
En creusant davantage, il semble qu'il existe une corrélation entre le contenu du fichier $ PGDATA / global / pg_database (en particulier le deuxième champ) et les noms de répertoire sous $ PGDATA / base.
Sortir sur une branche, je suppose que le deuxième champ du fichier pg_database est l'oid de la base de données et que chaque base de données a son propre sous-répertoire sous $ PGDATA / base (avec l'oid pour le nom du sous-répertoire). Est-ce exact? Dans l'affirmative, est-il raisonnable d'utiliser les horodatages des fichiers à partir des fichiers sous $ PGDATA / base / * comme déclencheur pour avoir besoin d'une sauvegarde?
... ou existe-t-il un meilleur moyen?
Merci encore...
la source
Réponses:
Bien que l'utilisation
select datname, xact_commit from pg_stat_database;
suggérée par @Jack Douglas ne fonctionne pas tout à fait (apparemment en raison de l'auto-vide),select datname, tup_inserted, tup_updated, tup_deleted from pg_stat_database
semble fonctionner. Les changements DML et DDL changeront les valeurs des colonnes tup_ * tandis que avacuum
ne le fait pas (vacuum analyze
en revanche ...).Dans le cas où cela pourrait être utile pour d'autres, j'inclus le script de sauvegarde que j'ai mis en place. Cela fonctionne pour Pg 8.4.x mais pas pour 8.2.x-- YMMV selon la version de Pg utilisée.
Mise à jour: le script a été mis sur github ici .
la source
Il semble que vous puissiez utiliser
pg_stat_database
pour obtenir un nombre de transactions et vérifier si cela change d'une exécution de sauvegarde à la suivante:Si quelqu'un vous a appelé,
pg_stat_reset
vous ne pouvez pas être certain si une base de données a changé ou non, mais vous pouvez considérer qu'il est assez improbable que cela se produise, suivi du nombre exact de transactions correspondant à votre dernière lecture.--ÉDITER
voir cette question SO pour savoir pourquoi cela pourrait ne pas fonctionner. Je ne sais pas pourquoi cela peut se produire, mais l'activation de la journalisation peut faire la lumière ...
la source
pg_stat_reset
alors la probabilité que la valeur xact_commit corresponde à la précédente devrait être assez faible, non? Donc, cela semble certainement attraper l'existence de changements DML. Maintenant, tout ce dont j'ai besoin est d'attraper s'il y a eu des changements DDL.create table ...
test rapide semble incrémenter xact_commit.De creuser autour des documents et des groupes de discussion postgres:
txid_current()
vous donnera une nouvellexid
- si vous appelez à nouveau la fonction à une date ultérieure, si vous obtenez unexid
plus élevée, vous savez qu'aucune transaction n'a été engagée entre les deux appels. Vous pouvez cependant obtenir des faux positifs - par exemple si quelqu'un d'autre appelletxid_current()
la source
Rappelez-vous l'horodatage de vos fichiers contenant les données DB et regardez s'ils ont changé. S'ils le faisaient, il y avait une écriture.
Modifier après l'indice WAL: vous ne devez effectuer cette opération qu'après avoir vidé les écritures en attente.
la source
Postgresql 9.5 nous permet de suivre le dernier horodatage modifié, consultez ce lien https://thirumal-opensource.blogspot.in/2017/03/to-track-last-modified-commit-or-get.html
la source