验证两个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