一、概述
??數據庫備份一般可分為物理備份和邏輯備份,其中物理備份又可分為物理冷備和物理熱備,下面就各種備份方式進行詳細說明(一般情況下,生產環境采取的定時物理熱備+邏輯備份的方式,均是以下述方式為基礎進一步研發編寫適合自己業務環境的備份工具或腳本):
- 物理冷備:在停庫的狀態下,直接復制 PostgreSQL 的數據文件。備份出來的文件僅可在相同的平臺環境中恢復(操作系統+數據庫版本相同),僅可全庫備份全庫恢復。
- 物理熱備:在不停庫狀態下,拷貝數據庫的 data 目錄及 wal 歸檔,基于數據庫自身的時間點備份恢復技術(Point-In-Time Recovery),通過不停地重放 wal 日志將數據推到備份結束后的任意一個時間點。備份出來的文件僅可在相同的平臺環境中恢復(操作系統+數據庫版本相同),僅可全庫備份全庫恢復。
- 邏輯備份:利用 PostgreSQL 中自帶的 pg_dump、pg_dumpall 進行 sql 轉儲,或使用客戶端管理工具進行備份(實際也是調用的 pg_dump、pg_dumpall 命令),備份出來的文件可跨平臺恢復,且可針對具體的對象進行備份恢復。
數據量越大,備份速度越慢,下列表中所列備份速度為相同環境下,三種備份方式的相對速度:
物理冷備 | 物理熱備 | 邏輯備份 |
---|---|---|
停庫 | 不停庫 | 不停庫 |
全庫備份恢復 | 全庫備份恢復 | 具體數據庫對象備份恢復 |
相同平臺環境恢復 | 相同平臺環境恢復 | 可跨平臺數據庫版本恢復 |
備份速度快 | 備份速度快 | 二進制轉儲備份速度較快,sql 文本轉儲備份速度一般 |
二、物理冷備
2.1 備份
--停庫
pg_ctl stop--打包數據目錄
cd /data/pg13/
tar -cf backup_pg13.tar data
2.2 恢復
備份的機器本地恢復或傳到其他相同環境的機器進行恢復,需確保操作系統和數據庫版本相同。
--確保恢復環境的數據庫沒有運行,若運行需關閉
ps -ef|grep postg--將原 data 目錄改名
cd /data/pg13
mv data data_old--將打的備份包解壓至原 data 所在目錄下
tar -xvf backup_pg13.tar--啟動數據庫
pg_ctl start
三、物理熱備
??PostgreSQL 在數據目錄的 pg_wal 子目錄(10版本之前是 pg_xlog 子目錄)中始終維護一個WAL日志文件。該日志文件記錄了數據庫數據文件的每次改變。最初設計該日志文件的主要目的是為了數據庫異常崩潰后,能夠通過重放最后一次 Checkpoint 點之后的日志文件,把數據庫推到最終的一致狀態,避免數據丟失或不一致。此日志文件的機制也提供了一種熱備份方案:基礎備份加上重放 wal 日志,將數據推到備份結束后的任意一個時間點。
3.1 備份
1)建立 wal 連續歸檔
- 準備好歸檔目錄,并確保空間充足。
- wal_level 需要 replica 或以上級別。
- 歸檔模式 archive_mode 開啟。
- archive_command 指定一個 shell 命令,且確保命令中的路徑存在。
--在大的磁盤空間下,創建歸檔目錄
mkdir /data/pg13/archive -p--將下列參數加入 postgresql.conf 文件中,并重啟數據庫。
wal_level = 'replica'
archive_mode = 'on'
archive_command = 'test ! -f /data/pg13/archive/%f && cp %p /data/pg13/archive/%f' # Unix
archive_command = 'copy "%p" "C:\\data\\archive\\%f"' # Windows
2)制作基礎備份
方式一:pg_basebackup
pg_basebackup -D /data/pg13/dbbak
方式二:使用低級 API 制作非排他基礎備份
允許其他并發備份運行,既包括那些使用同樣的 API 開始的備份,也包括那些用 pg_basebackup 開始的備份。
--發出開始備份標識
select pg_start_backup('label', false, false);--另外窗口備份數據目錄
cp /data/pg13/data /data/pg13/databak -rp--發出備份開始的同一窗口發出終止備份標識
select * FROM pg_stop_backup(false);
select pg_switch_wal();
在 PostgreSQL 9.6 之前,只能通過 API 排他備份方式(排他式備份方法已過時,應避免使用)。
--發出開始備份標識
select pg_start_backup('label',true);--另外窗口備份數據目錄
cp /data/pg13/data /data/pg13/databak -rp--發出備份開始的同一窗口發出終止備份標識
select * FROM pg_stop_backup();
select pg_switch_wal();
3.2 恢復
1)停止原數據庫
pg_ctl stop
2)基礎備份拷貝至原數據目錄
mv /data/pg13/data /data/pg13/data_old
cp /data/pg13/dbbak /data/pg13/data -rp
- 如果沒有足夠的空間,至少要保存集簇的 pg_wal 子目錄的內容,因為它可能包含在系統垮掉之前還未被歸檔的日志。
- 若在其他機器上恢復確保數據目錄所有權及權限(所有權 postgres,權限 0700)。
- 若使用了自定義表空間,確保 pg_tblspc 子目錄中的軟連接指向正確。
3)配置恢復參數
??恢復參數在 PostgreSQL12 版本之前是配置在 recovery.conf 文件中的,而自 PostgreSQL12 版本開始合并到了 postgresql.conf 文件中。默認情況下,恢復將會一直恢復到 WAL 日志的末尾,下面的參數可以被用來指定一個更早的停止點。在 recovery_target、recovery_target_lsn、recovery_target_name、recovery_target_time 和recovery_target_xid 中, 最多只能使用一個。
--postgresql.conf 或 postgresql.auto.conf 中配置均可,當都配置時 postgresql.auto.conf 會覆蓋 postgresql.conf 文件中的配置
#archive_mode = 'on' #恢復期間先關閉歸檔模式,確認恢復的數據沒問題后,再開啟
restore_command = 'cp /data/pg13/archive/%f %p'
recovery_target_time = '2023-08-11 15:58:00' #不配置該參數時,默認恢復到最新時間點restore_command = 'copy "C:\\data\\archive\\%f" "%p"' # Windows
其他可選配置
--恢復到指定時間
recovery_target_time = '2023-08-10 14:00:00'
--恢復到一致狀態后盡快結束
recovery_target = 'immediate'
--恢復到 pg_create_restore_point() 所創建還原點
recovery_target_name = 'string'
--恢復到指定事務ID
recovery_target_xid = 'string'
--恢復將繼續進行的預寫日志位置的LSN
recovery_target_lsn = 'pg_lsn'
--指定是否在指定的恢復目標之后停止(on)或在恢復目標之前停止(off),適用于 recovery_target_lsn、recovery_target_time 或者 recovery_target_xid 被指定的情況。默認 on
recovery_target_inclusive = 'boolean'
--恢復到指定時間線,可以是數字時間線 ID 或特殊值,默認 latest
recovery_target_timeline = 'string'
--達到恢復目標時服務器應該立刻采取的動作
pause:恢復將會被暫停(默認)。
promote:恢復處理將會結束并且服務器將開始接受連接。
shutdown:將在達到恢復目標之后停止服務器。recovery_target_action = 'enum'
注意:
- 由于在 recovery_target_action 被設置為 shutdown 時,recovery.signal 將不會被移除, 任何后續的啟動都將會以立刻關閉為終結,除非該配置被改變或者 recovery.signal 文件被手工移除。
- 如果沒有設置恢復目標,如果沒有啟用 hot_standby,pause設置的動作將和shutdown一樣。 如果在升級期間達到恢復目標,pause 的設置將與 promote的行為相同。
- 在任何情況下,如果已配置了恢復目標,但歸檔恢復在達到目標之前結束,則服務器將關閉,并出現致命錯誤。
4)創建恢復標識文件
touch $PGDATA/recovery.signal
5)啟動數據庫
數據庫在啟動過程中自動應用配置文件中恢復設置,將數據庫推進至指定位置
pg_ctl start
6)核對數據確認是否需要繼續往下推進
當指定時間點恢復時,啟動數據庫后默認為只讀狀態,此時可查詢數據進行檢查,若不是想要的數據,可繼續往后推進(只能向上次恢復的時間點后推進,不能向之前倒推)
--時間點繼續推進
pg_ctl stop將 postgresql.auto.conf 中之間繼續向后改recovery_target_time = '2023-08-11 15:59:00'pg_ctl start
數據庫為只讀狀態,recovery.signal 恢復標識文件存在時,就可繼續推進。
確認數據沒問題后,可使用如下命令,結束恢復,數據庫恢復讀寫模式:
select pg_wal_replay_resume();
此時 recovery.signal 恢復標識文件也會自動刪除
四、邏輯備份
??pg_dumpall 工具可以將 PostgreSQL 中的所有數據庫轉儲到一個文本文件,它會對集簇中的每個數據庫調用 pg_dump 來完成該工作,由于 pg_dumpall 僅能轉儲文本文件(sql 腳本格式),當數據量大時,改方式效率較低,故一般僅用其導出全局對象(數據庫、角色、表空間)的功能,備份數據庫則使用 pg_dump 方式:
--導出數據庫、角色、表空間定義
pg_dumpall -h localhost -U postgres --port=5432 -f backup.sql --globals-only --clean
pg_dump 用法:https://xiaosonggong.blog.csdn.net/article/details/122743398