pitr 原理 pgsql的備份和恢復

2021-10-12 14:04:39 字數 3319 閱讀 6498

pgsql的備份和恢復:備份:

1.pg_dump:(sql轉儲,類似於mysql的binlog的dump,可以加上壓縮如gzip,可以設定壓縮級別)備份:pg_dump dbname > outfile

恢復:psql dbname < infile

outfile 和infile是同乙個檔案

2.pg_dumpall:(sql轉儲,匯出所有的db)

備份:pg_dumpall -f outfile

恢復:psql -f outfile postgres

archive(歸檔檔案):database manager 把query語句記錄在  archive檔案裡,archive檔案一般有多個,有固定大小.採取輪循的方式寫.然後到了觸發一定條件的時候,如:記錄了1個小時的query語句了或者寫滿了1/2的時候.就執行這些query語句並把結果寫到資料檔案裡.即記錄到硬碟中.1.要使用pitr,必須開啟pgsql的歸檔模式(archive)

在postgresql.conf檔案中,設定如下:

# - archiving -

archive_mode = on               # allows archiving to be done

# (change requires restart)

archive_command = 'cp "%p" /usr/local/pgsql/backup/"%f"'

# command to use to archive a logfile segment

archive_timeout = 60            # force a logfile segment switch after this

# time; 0 is off

2.以postgres身份連線到pgsql

psql 要備份的dbname

3.發出備份命令

select pg_start_backup('label');  --> 備份archive檔案.

label --> 備份標籤,一般為放置備份檔案的全路徑.如: /usr/local/pgsql/backup

4.執行備份

用tar或者cpio備份資料檔案.此過程中,不用關閉資料庫,也不用斷開連線.

5.再以postgres身份連線到pgsql

select pg_stop_backup(); --> 終止備份archive檔案.

這將終止備份模式,並自動切換到下乙個歸檔檔案.這樣的好處是可以立即為下次備份做好準備.

4.pitr的即時恢復

1.停止pgsql服務

2.最好copy /usr/local/pgsql/data 到臨時位置,以防萬一.

3.清理掉data 檔案下所有檔案,如果用到tablespace,還得清掉表空間目錄下的所有檔案.

4.用正確的所有者恢復資料庫檔案.用postgres最好.

5.清理pg_xlog目錄裡的檔案.刪掉檔案,保留資料夾

6.copy archive檔案到pg_xlog資料夾下.

7.在集群資料目錄/usr/local/pgsql/data裡建立乙個恢復命令檔案recovery.conf。模版檔案recovery.conf.sample在tarball的src裡.

restore_cmd  -->    恢復的命令

recovery_target_time -->宣告恢復到哪個時間戳

recovery_target_xid --> 宣告恢復到哪個事物id

recovery_target_inclusive  --> 宣告是在恢復目標之前還是之後停止.

recovery_target_timeline --> 宣告恢復到乙個時間線.

還需要臨時修改 pg_hba.conf 以避免普通使用者連線,直到你確信恢復已經正常了為止。

8.所有這些操作的關鍵是設定乙個恢復命令檔案,這個檔案描述你希望如何恢復以及恢復應該走到**。

你可以使用 recovery.conf.sample(通常安裝在安裝目錄的 share/ 子目錄裡)作為原型。

你必須在 recovery.conf 裡面宣告的乙個東西是 restore_command ,它告訴系統如何拿回歸檔的 wal 檔案段。

類似 archive_command ,這個是乙個指令碼命令字串。它可以包含 %f ,這個變數會被需要的日誌檔名替換,以及 %p ,

它會被要拷貝去的日誌檔案的絕對路徑代替。如果需要在命令裡替換真正的 % 字元,那麼就雙寫(%%)。

最簡單的有用命令是類似下面的東西

restore_command = 'cp /mnt/server/archivedir/%f %p'這個命令將把以前歸檔的 wal 段從 /mnt/server/archivedir 目錄拷貝過來。

你當然可以使用某些更複雜的東西,甚至是乙個要求操作者掛載合適的磁帶的 shell 指令碼。

重要的一點是:該命令在失敗的時候返回非零值。如果日誌檔案沒有出現在規檔中,那麼該系統將詢問該命令;

在問到的時候,它必須返回非零。這個不是錯誤條件。還要注意 %p 路徑的基礎名將和 %f 不一樣;不要認為它們是可以互換的。

在歸檔中找不到的 wal 段將被認為在 pg_xlog/ 裡;這樣就允許使用最近沒有歸檔的段。

但是在歸檔中的段將比 pg_xlog/ 中的優先。在檢索歸檔檔案的時候,系統將不會覆蓋現有的 pg_xlog/ 內容。

通常,恢復將處理所有可用的 wal 段,因此將把資料庫恢復到當前時間(或者是在所給出的可用 wal 段數的情況下,

我們能走到的最近的地方)。但是如果你想恢復到某些以前的時刻點(比如,在菜鳥 dba 刪除你的主要事務表之前),

那麼只需要在 recovery.conf 裡宣告要求的停止點。你可以通過日期/時間來宣告,也可以通過特定事務 id 的結束來宣告這個停止點,

我們叫做"恢復目標"。目前,只有日期/時間選項比較有用,因為我們沒有工具來幫助你精確地標識應該使用哪個事務 id

【注意】請注意停止點必須在備份的終止時間之後(也就是 pg_stop_backup 的時間)。

你無法使用乙個基礎備份恢復到備份正在進行中的某個時刻。要想恢復到該時刻,你必須回到你以前的基礎備份,然後從那個位置向前滾動。

如果在恢復過程中發現在 wal 資料中存在錯誤,那麼恢復將在錯誤的地方停止,並且不會啟動伺服器。

在這種情況下,可以指定乙個位於錯誤點之前的"恢復目標",然後從起始點開始重新執行恢復程序,這樣恢復就可以正常完成。

如果由於外部原因(系統崩潰、無法讀取 wal 歸檔)導致恢復失敗,那麼可以簡單的重新啟動恢復過程即可,它將從上次失敗的地方繼續。

重新啟動恢復過程與檢查點的操作非常類似:

伺服器週期性的強制將其狀態記錄到磁碟上並更新 pg_control 檔案以標識已經處理的 wal 資料不需要被再次掃瞄。

pgsql的備份與恢復

在window上備份 1 在pgsql的bin目錄在開啟命令視窗。注 可以使用.pg dump 查詢相關引數含義 3 恢復資料 pg restore.exe host ip位址 port 埠號 username 使用者名稱 dbname 資料庫名稱 verbose 備份檔案 例 pg restore...

Pgsql和Mysql的對比

工作中用過這兩個資料庫,但都不是太深入,僅限於用而已,但給我留下的印象就是pgsql更好些,因為這兩個庫我都遇到過資料丟失的問題,前者我通過網上方法加自己的判斷有驚無險的恢復了,而後者搜尋各種資料加問身邊的專家都沒辦法。剛網上搜了一下兩者的區別,總體的感覺也是前者是最好的開源關聯式資料庫,而後者是網...

Pgsql和MySql的對比

工作中用過這兩個資料庫,但都不是太深入,僅限於用而已,但給我留下的印象就是pgsql更好些,因為這兩個庫我都遇到過資料丟失的問題,前者我通過網上方法加自己的判斷有驚無險的恢復了,而後者搜尋各種資料加問身邊的專家都沒辦法。剛網上搜了一下兩者的區別,總體的感覺也是前者是最好的開源關聯式資料庫,而後者是網...