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



这是关于在使用各种复制解决方案时保持信心,使您能够在不丢失数据的情况下将故障转移到另一台服务器。或者在主-主的情况下,您可以在合理的时间内知道其中一个数据库是否失去同步。

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

特定要求:

  1. 我说的不仅仅是表格结构。我想知道实际的记录数据是相同的,这样我就知道如果记录被损坏或丢失(在这种情况下,我会重新初始化坏的数据库与最近的备份+ WAL文件,然后把它带回池)

  2. 数据库大小为30- 50gb。我怀疑原始SELECT查询是否能很好地工作。

  3. 我不认为有必要进行实时检查(尽管它当然会很好)。每小时甚至每天都比没有好。

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

或者这种类型的验证根本不现实?

您可以检查两台机器上的当前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;

这将给你一个表上元组表示的哈希值。

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

相关内容

  • 没有找到相关文章

最新更新