2010-08-20 62 views
1

我有兩個數據庫用於記錄東西,我想檢查同步。如何在Postgress中生成結果集的散列?

批准的解決方案是定期發送(可以說每小時)兩個選擇,生成結果集的散列並進行比較。如果他們匹配那麼很好,否則會產生一些警報。

目前我通過(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`"; 

我想這樣做的Postgres的一側的校驗和/哈希值。因爲目前它下載整個結果集(可能有25MB甚至更多)並在服務器端生成校驗和。

Google沒有幫助。

有什麼建議嗎?

謝謝。

回答

1

你可以使用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

嗯,謝謝。這不會解決我所描述的問題,但至少可以減小下載結果集的大小。 – KullDox 2010-08-20 18:06:41

1

如果你想要做一個哈希在所有的它一下子,那將佔用大量內存的服務器端的爲好。而且一旦你點擊1Gb,它將不再起作用,因爲單個字符串不能超過1Gb。

也許像這樣的東西會工作,它基本上做了每行的散列,然後散列這些散列。當散列長度超過1Gb時它仍然會中斷 - 你需要編寫一個定製的md5聚合來解決這個問題。

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

這需要您所創建的自定義聚合CONCAT這樣的:

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