2010-08-20 3 views
1

J'ai deux bases de données pour la journalisation des choses, que je veux vérifier pour la synchronisation.Comment générer un hachage du jeu de résultats dans Postgress?

La solution approuvée est d'envoyer périodiquement (permet de dire toutes les heures) une sélection à la fois, générer un hachage du jeu de résultats et de les comparer. Si elles correspondent alors génial, sinon générer des alarmes.

Actuellement, je le fais par (script bash):

log_table="SELECT column1, column2, column3 FROM log_table where to_char(timestamp, '$ts_format') = '$tx_moment'"; 
PSQL="psql -t -q -h $_gp_host -U $_gp_user -d log_schema -c "; 
echo "`${PSQL} $tx_fix${log_table} | sort | cksum`"; 

Je voudrais faire la cksum/hachage du côté postgres. Car actuellement, il télécharge l'ensemble des résultats (qui peut même avoir 25 Mo ou plus) et génère la somme de contrôle côté serveur.

Google n'a pas aidé.

Des suggestions?

Merci.

Répondre

1

Vous pouvez utiliser md5:

log_table=" 
SELECT 
    md5(column1 || column2 || column3) AS hash, 
    column1, column2, column3 
FROM log_table where to_char(timestamp, '$ts_format') = '$tx_moment'"; 
+0

Hmm, merci. Cela ne résoudra pas le problème que j'ai décrit, mais au moins, il peut réduire la taille du jeu de résultats téléchargés. – KullDox

1

Si vous voulez faire un hachage sur tout cela à la fois, qui va utiliser une grande quantité de mémoire côté serveur ainsi. Et une fois que vous avez atteint 1Go, cela ne fonctionnera plus car une seule chaîne ne peut pas être plus longue que ça.

Peut-être quelque chose comme cela fonctionne, ce qui fait essentiellement un hachage de chaque ligne, et puis ces hachages hash. Il se cassera quand la longueur des hachages dépassera 1Gb - vous aurez besoin d'écrire un agrégat md5 personnalisé pour contourner cela.

SELECT md5(concat(md5(column1 || column2 || column3))) FROM log_table WHERE ... 

Cela exige que vous avez créé le concat d'agrégations comme ceci:

CREATE AGGREGATE concat (
    BASETYPE = text, 
    SFUNC = textcat, 
    STYPE = text, 
    INITCOND = '' 
); 
Questions connexes