验证两个postgresql数据库之间的数据一致性

这特别是关于保持使用各种复制解决方案的信心,您可以在不丢失数据的情况下故障切换到其他服务器。 或者,如果其中一个数据库不同步,您可以在合理的时间内知道主 - 主情况。

有没有这方面的工具,或者人们通常依靠复制系统本身来警告不一致? 我目前最熟悉postgresql WAL在主备备份设置中发货,但我正在考虑使用类似于PgPool的主 - 主设置。 然而,由于这个解决方案与PostgreSQL本身并不直接相关(我的基本理解是它提供了应用程序将使用的连接,因此拦截了各种SQL语句,然后将它们发送到其池中的任何服务器) ,这让我更多地考虑实际验证数据一致性。

具体要求:

  • 我不是在谈论表格结构。 我想知道实际的记录数据是相同的,这样我就会知道记录是否损坏或遗漏(在这种情况下,我会在将它带回之前用最近的备份+ WAL文件重新初始化坏数据库进入游泳池)

  • 数据库的大小为30-50 GB。 我怀疑原始的SELECT查询会很好地工作。

  • 我没有看到需要实时检查(尽管它当然会很好)。 每小时甚至每天都会比没有好。

  • 块级检查不起作用。 这将是两个独立存储的数据库。

  • 或者这种类型的验证简直不现实?


    您可以检查两台机器上当前的WAL位置...如果它们表示相同的值,则表示您的基础数据库彼此一致...

    $ psql -c "SELECT pg_current_xlog_location()" -h192.168.0.10 (do it on primary host)
     pg_current_xlog_location 
    --------------------------
     0/2000000
    (1 row)
    
    $ psql -c "select pg_last_xlog_receive_location()" -h192.168.0.20 (do it on standby host)
     pg_last_xlog_receive_location 
    -------------------------------
     0/2000000
    (1 row)
    
    $ psql -c "select pg_last_xlog_replay_location()" -h192.168.0.20 (do it on  standby host)
     pg_last_xlog_replay_location 
    ------------------------------
     0/2000000
    (1 row)
    

    你也可以在walsender和walreceiver进程的帮助下检查这一点:

    [do it on  primary] $ ps -ef | grep sender
    postgres  6879  6831  0 10:31 ?        00:00:00 postgres: wal sender process postgres 127.0.0.1(44663) streaming 0/2000000
    
    [ do it on standby] $ ps -ef | grep receiver
    postgres  6878  6872  1 10:31 ?        00:00:01 postgres: wal receiver process   streaming 0/2000000
    

    如果你正在寻找整个表格,你应该可以做这样的事情(假设一张表格很容易适应RAM):

    SELECT md5(array_to_string(array_agg(mytable), ' '))
      FROM mytable order by id;
    

    这会给你一个表上的元组表示的散列。

    请注意,您可以通过范围等来分解它。根据复制的类型,您甚至可以按页面范围将其分解(用于流式复制)。

    链接地址: http://www.djcxy.com/p/13543.html

    上一篇: verifying data consistency between two postgresql databases

    下一篇: Transformation under Transformers