这特别是关于保持使用各种复制解决方案的信心,这些解决方案可以在没有数据丢失的情况下故障转移到其他服务器。或者在主 - 主情况下,如果其中一个数据库失去同步,您可以在合理的时间内知道。
是否有任何工具用于此,或者人们通常依赖复制系统本身来警告不一致?我目前最熟悉在主 - 备用设置中的postgresql WAL运输,但我正在考虑使用像PgPool这样的主 - 主设置。但是,由于该解决方案与PostgreSQL本身的关系不那么直接(我的基本理解是它提供了应用程序将使用的连接,因此拦截了各种SQL语句,然后将它们发送到其池中的任何服务器)它让我更多地考虑实际验证数据的一致性。
具体要求:
我不是在谈论桌面结构。我想知道实际的记录数据是一样的,所以我知道记录是否已损坏或丢失(在这种情况下,我会使用最近的备份+ WAL文件重新初始化坏数据库,然后再将其恢复进入游泳池)
数据库大约为30-50 GB。我怀疑原始SELECT查询是否能很好地工作。
我认为不需要进行实时检查(当然,它会很好)。每小时甚至每天都会比什么都好。
块级检查不起作用。它将是两个具有独立存储的数据库。
或者这种类型的验证是不现实的?
答案 0 :(得分:3)
您可以检查两台机器上的当前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
答案 1 :(得分:0)
如果你正在寻找整个表,你应该可以做这样的事情(假设一个表很容易适合RAM):
SELECT md5(array_to_string(array_agg(mytable), ' '))
FROM mytable order by id;
这将为您提供表格上元组表示的哈希值。
请注意,您可以按范围等分解。根据复制类型,您甚至可以按页面范围将其分解(用于流式复制)。