2013-05-14 55 views
7

這特別是關於保持使用各種複製解決方案的信心,這些複製解決方案可以在不丟失數據的情況下故障轉移到其他服務器。或者,如果其中一個數據庫不同步,您可以在合理的時間內知道主 - 主情況。驗證兩個postgresql數據庫之間的數據一致性

這裏是否有任何工具,或者人們通常是否依賴複製系統本身來警告不一致?我目前最熟悉postgresql WAL在主備備份設置中發貨,但我正在考慮使用類似於PgPool的主 - 主設置。然而,由於這個解決方案與PostgreSQL本身並不直接相關(我的基本理解是它提供了應用程序將使用的連接,因此攔截了各種SQL語句,然後將它們發送到其池中的任何服務器) ,這讓我更多地考慮實際驗證數據一致性。

具體要求:

  1. 我不是在談論只是表結構。我想知道實際的記錄數據是相同的,這樣我就會知道記錄是否損壞或遺漏(在這種情況下,我會在將它帶回之前用最近的備份+ WAL文件重新初始化壞數據庫進入池中)

  2. 數據庫的大小爲30-50GB。我懷疑原始的SELECT查詢會很好地工作。

  3. 我沒有看到需要實時檢查(儘管它當然會很好)。每小時甚至每天都會比沒有好。

  4. 塊級檢查不起作用。這將是兩個獨立存儲的數據庫。

或者是這種類型的驗證根本不現實?

+0

首先想到的是在我腦海中是數據庫無關的散列兩側行,並找出如何在DB1的哈希值比較每個行DB2。這將是最初的負載會很慢,但如果你這樣做,這往前遞增可能不會那麼糟糕。 – Kuberchaun 2013-05-14 18:26:37

+0

這是一個感興趣的鏈接,以延伸我之前的評論。 HTTP://計算器。com/questions/9607063/checksum-field-in-postgresql-to-content-comparison – Kuberchaun 2013-05-14 19:02:29

回答

0

如果你正在尋找的整個表,你應該能夠做這樣的事情(假設很容易適合在RAM中的表):

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

這會給你的元組表示哈希在桌子上。

請注意,您可以通過範圍等將其分解。根據複製的類型,您甚至可以按頁面範圍將其分解(用於流式複製)。

+0

當然,ORDER BY需要進入array_agg()內部,否則這個查詢根本不起作用。 – intgr 2014-04-12 12:18:36

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 
相關問題