2010-08-20 44 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 = '' 
);