2016-11-21 108 views
0

主服務器如何觸發PostgreSQL熱備WAL文件恢復?

# postgresql.conf 
wal_level = hot_standby 
archive_mode = on 
archive_timeout = 10 
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f' 

備用服務器

hot_standby = on 

我在主服務器處於待機複製/archive/*$PGDATA/pg_xlog,並沒有發生。當我重新啓動備用服務器,我從服務器日誌錯誤消息:

2016-11-21 17:56:09 CST [17762-3] LOG: invalid primary checkpoint record 
2016-11-21 17:56:09 CST [17762-4] LOG: record with zero length at 0/6000100 
2016-11-21 17:56:09 CST [17762-5] LOG: invalid secondary checkpoint record 
2016-11-21 17:56:09 CST [17762-6] PANIC: could not locate a valid checkpoint record 
2016-11-21 17:56:09 CST [17761-1] LOG: startup process (PID 17762) was terminated by signal 6: Aborted 
2016-11-21 17:56:09 CST [17761-2] LOG: aborting startup due to startup process failure 

問題:

  1. 是否足以在主服務器在簡單地複製/archive/*$PGDATA/pg_xlog數據同步到備用服務器待機?

  2. 如何以及何時在熱備用服務器中恢復WAL文件?備用服務器是否定期檢查其$PGDATA/pg_xlog目錄中的新WAL文件?或者我必須手動觸發它?

  3. 我說的是熱備份而不是流式複製;所以我假設我不必配置conninfo。我對嗎?

  4. 配置hot_standby = on並重新啓動服務器後,我仍然可以做一個INSERT沒有錯誤。如何配置才能使其成爲只讀?

回答

2

看起來很像你沒有正確初始化備用數據庫。

日誌文件指出PostgreSQL甚至不會開始複製,因爲它無法找到有效的檢查點。

備用數據目錄中的backup_label文件包含什麼內容?如果該文件不存在,那可能是問題所在。

那個待機突然停止工作還是從來沒有工作? 您是如何創建待機狀態的?

+0

接下來創建備用數據庫的步驟如下:1.'psql postgres -c「select pg_start_backup('backup')」'。 2.將$ PGDATA目錄複製到備用文件系統。 3.'psql postgres -c「選擇pg_stop_backup()」'。 4.在'postgresql.conf'中設置'hot_standby = on'。 5.重新啓動postgresql服務器。 –

+0

看起來不錯(如果你有'fsync = on')。可能您沒有複製足夠的WAL存檔,並且包含'backup_label'中的檢查點的那個不在那裏。你有一個'backup_label'文件,對吧?閱讀條目'START WAL LOCATION'並確保相應的WAL文件在那裏。 –

1

您必須首先從主服務器的低級別基本備份創建備用服務器。您不能創建一個新實例並使用pg_dumppg_restore。我猜這就是你想要做的。

執行適當的基本備份的最簡單方法是使用pg_basebackup。其他選項在手冊中有討論,但實際上,只是使用:

pg_basebackup -X stream -D standby_datadir_location -h master_ip 

或類似的。

只有當您擁有有效的基礎備份時,纔可以啓動歸檔恢復或流式複製。最簡單的方法是啓用流式複製。讓pg_basebackup通過傳遞-R標誌爲您做到這一點。

如果您想要歸檔恢復,則應將restore_command添加到備份的recovery.conf,該備份將檔案從歸檔位置複製到備份。

全都覆蓋在the manual