【问题标题】:How to generate a hash of the result set in Postgress?如何在 Postgres 中生成结果集的哈希?
【发布时间】:2010-08-20 17:25:14
【问题描述】:

我有两个用于记录内容的数据库,我想检查它们是否同步。

批准的解决方案是定期(比如说每小时)向两者发送选择,生成结果集的哈希并比较它们。如果它们匹配则很好,否则会产生一些警报。

目前我正在通过(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 或更多)并在服务器端生成校验和。

Google 没有提供帮助。

有什么建议吗?

谢谢。

【问题讨论】:

    标签: postgresql hash checksum


    【解决方案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'";
    

    【讨论】:

    • 嗯,谢谢。这不会解决我描述的问题,但至少可以减少下载结果集的大小。
    【解决方案2】:

    如果您想一次对所有内容进行哈希处理,这也会占用服务器端的大量内存。一旦你达到 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 = ''
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2022-08-24
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多