2010-02-05 7 views
1

Je crée des pg_dumps, DUMP1 et DUMP2.Tri du vidage de la base de données postgresql (pg_dump)

DUMP1 et DUMP2 sont identiques, sauf que DUMP2 a été sauvegardé dans l'ordre inverse de DUMP1.

Y at-il de toute façon que je puisse trier les deux DUMPS de sorte que les deux fichiers DUMP soient exactement les mêmes (en utilisant un diff)? J'utilise PHP et Linux. J'ai essayé d'utiliser "sort" dans Linux, mais cela ne fonctionne pas ...

Merci!

Répondre

3

From your previous question, je suppose que ce que vous essayez vraiment de faire est de comparer aux bases de données pour voir si elles sont les mêmes, y compris les données.

As we saw there, pg_dump ne va pas se comporter de façon déterministe. Le fait qu'un fichier soit l'inverse de l'autre n'est probablement qu'une coïncidence.

Voici une façon de faire la comparaison totale, y compris le schéma et les données. Pour commencer, comparez le schéma using this method. Deuxièmement, comparez les données en les vidant toutes dans un fichier dans un ordre qui sera cohérent. La commande est garantie en triant d'abord les tables par nom, puis en triant les données dans chaque table par colonne (s) de clé primaire.

La requête ci-dessous génère les instructions COPY.

select 
    'copy (select * from '||r.relname||' order by '|| 
    array_to_string(array_agg(a.attname), ',')|| 
    ') to STDOUT;' 
from 
    pg_class r, 
    pg_constraint c, 
    pg_attribute a 
where 
    r.oid = c.conrelid 
    and r.oid = a.attrelid 
    and a.attnum = ANY(conkey) 
    and contype = 'p' 
    and relkind = 'r' 
group by 
    r.relname 
order by 
    r.relname 

L'exécution de cette requête vous donnera une liste des déclarations comme copy (select * from test order by a,b) to STDOUT; Mettez les tous dans un fichier texte et de les exécuter par psql pour chaque base de données, puis de comparer les fichiers de sortie. Vous devrez peut-être modifier avec le output settings to COPY.

0

Cela ne vaut probablement pas la peine d'analyser la décharge.

Il sera beaucoup, beaucoup plus rapide de restaurer DUMP2 dans une base de données temporaire et vider le temporaire dans le bon ordre.

+0

Pourriez-vous préciser ce que vous entendez? Vous dites de restaurer DUMP 2 dans une base de données temporaire, mais pouvez-vous clarifier sur "vider le temporaire dans le bon ordre". merci! – littleK

+0

Oh, vous voulez restaurer DUMP2 dans une base de données temporaire, puis vider cette base de données ... – littleK

2

Ma solution consistait à coder un propre programme pour la sortie pg_dump. N'hésitez pas à télécharger PgDumpSort qui trie la décharge par clé primaire. Avec la mémoire par défaut Java de 512 Mo, il devrait fonctionner avec jusqu'à 10 millions d'enregistrements par table, puisque les informations d'enregistrement (valeur de clé primaire, décalage de fichier) sont conservées en mémoire.

Vous utilisez ce petit programme Java par exemple. avec

java -cp ./pgdumpsort.jar PgDumpSort db.sql 

Et vous obtenez un fichier nommé « db-sorted.sql », ou spécifier le nom du fichier de sortie:

java -cp ./pgdumpsort.jar PgDumpSort db.sql db-$(date +%F).sql 

Et les données triée est dans un fichier comme « db-2013- 06-06.sql »

vous pouvez maintenant créer des patches en utilisant diff

diff --speed-large-files -uN db-2013-06-05.sql db-2013-06-06.sql >db-0506.diff 

Cela vous permet de créer une sauvegarde incrémentale qui sont usuall y beaucoup plus petit.Pour restaurer les fichiers que vous devez appliquer le correctif au fichier d'origine en utilisant

patch -p1 < db-0506.diff 

(code source est à l'intérieur du fichier JAR)

+0

Excellent, j'avais juste besoin d'un moyen rapide de comparer certaines décharges de bases de données de scripts pré et post sud à des fins d'assurance qualité. Rapide et facile, merci. Ran sur les deux décharges, pêché à travers pour les orphelins, garantie instantanée que nous n'allons pas en cascade des données. –

0

Si

  • performance est moins importante que pour
  • Vous ne vous souciez que des données et non du schéma
  • et vous êtes en mesure de recréer les deux vidages (vous n'avez pas besoin de travailler avec des vidages existants)

vous pouvez exporter les données au format CSV dans un ordre déterminé comme ceci:

COPY (select * from your_table order by some_col) to stdout 
     with csv header delimiter ','; 

Voir COPY (9.5)

Questions connexes