我有两个用于记录内容的数据库,我想检查它们是否同步。
批准的解决方案是定期发送(比如说每小时)一个select到两者,生成结果集的哈希并比较它们。如果它们匹配那么好,否则会产生一些警报。
目前我正在通过(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方面做cksum / hash。因为它目前下载整个结果集(甚至可以有25MB或更多)并在服务器端生成校验和。
谷歌没有帮助。
有什么建议吗?
感谢。
答案 0 :(得分: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'";
答案 1 :(得分:1)
如果你想一次对所有这些进行哈希处理,那么它也将耗尽很多内存服务器端。一旦你达到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 = ''
);