2017-10-19 82 views
0

我已閱讀「Hans-Jurgen Schonig的PostgreSQL複製」,以及一些最佳實踐,不要在執行archive_command期間覆蓋歸檔WAL文件 - 任何人都可以展開這是爲什麼?並且如果以下方案對WAL覆蓋有效?Postgresql WAL archive_command文件比較

我寫了一個腳本,將執行以下高層次的邏輯爲個人WAL歸檔程序:

if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067) 
    exit with status 0 
else 
    if (copy 00000001000000F700000067 to /archive/00000001000000F700000067 is successful) 
    if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067) 
     exit with status 0 
    else 
     exit with status non-zero 
    else 
    exit with status non-zero 

總之,這種方法希望能抵禦至少場景原WAL文件歸檔錯誤 - 副本具有有效的文件名但已損壞(例如由於硬件故障)。我在這種情況下,WAL歸檔過程的理解:

  • 的archive_command在複製過程後字節爲再見比較期間將返回非零退出狀態(我們假定在複製過程有假成功響應)
  • 根據該文件,在非零EXIT_STATUS WAL歸檔將無限期重新嘗試 - WAL歸檔的第二次嘗試應該發生
  • 的archive_command將認識到,現有的歸檔WAL不會將當前WAL字節匹配-wise
  • 複製過程將再次發生,希望結束寫損壞的文件
  • EXIT_STATUS 0中的文件的成功比較的情況下,否則這個過程會被重複

有參與的比較(我可以更新到MD5校驗一個非常小的開銷),任何人都可以看到這種方法可能產生的問題嗎?或者推薦什麼?

謝謝

回答

1

如果我正確地讀出你的僞代碼,你會在存檔覆蓋WAL段,如果它們不相同,以你目前的WAL-待歸檔。

問題在於WAL檔案庫是非常重要的信息,而且你正在塗寫以前有人寫過的存檔WAL段。如果在兩個PostgreSQL集羣錯誤地寫入同一個存檔目錄時出現錯誤配置,WAL存檔將被破壞。

在這種情況下停止存檔並提醒管理員會更好。

+0

啊當然,輝煌的謝謝你。在我的情況下,這是本地存儲到單個postgresql服務器。 – abstractx1