原文地址:How to do backup and restore for PostgreSQL using pg_rman
原文作者:David Zhang
一、概述
PostgreSQL 是一個非常流行的開源關系型數據庫管理系統(tǒng),廣泛應用于許多不同的生產環(huán)境。要保持生產環(huán)境始終正常運行,您需要很多工具,其中一個工具必須是備份和恢復。本篇博客將介紹一款專為 Postgres 設計的備份和恢復工具,即 pg_rman。
2.什么是pg_rman
pg_ramn 是一個免費的實用程序,旨在備份和恢復 PostgreSQL 數據庫。它對整個數據庫集群、歸檔 WAL 和服務器日志進行物理在線備份,并在 Postgres 離線時恢復特定備份。pg_rman 不僅支持備份Primary Postgres 服務器,還可以從備用服務器獲取備份。
3.1.如何設置
取決于您運行的 Postgres 版本,在本博客中,我們將使用最新的 pg_rman 標記V1.3.14來演示 PostgreSQL 14 上的備份和恢復。
現在,假設您已正確安裝 PostgreSQL 14,那么您可以按照以下步驟設置 Postgres 服務器。
mkdir pgdata_rman
initdb -D pgdata_rman
echo "archive_mode = on" >> pgdata_rman/postgresql.conf
echo "archive_command = 'cp %p /media/david/disk1/archive/%f'" >> pgdata_rman/postgresql.conf
echo "log_directory = '/media/david/disk1/pglog'" >> pgdata_rman/postgresql.conf
pg_ctl -D pgdata_rman -l pglog/logfile start
然后,我們可以從 github 上查看源代碼并進行編譯。
git clone https://github.com/ossc-db/pg_rman.git
git checkout V1.3.14 -b local
make clean && make && make install
如果沒有錯誤,那么您已經為其余的測試準備好了 pg_rman。
3.2. 備份還原
在運行任何備份和恢復測試之前,我們需要為 pg_rman 初始化備份以正確設置備份文件夾。
# Initialize backup
pg_rman init -B /media/david/disk1/backup_rman -D /media/david/disk1/pgdata_rman
初始化備份文件夾后,我們可以嘗試創(chuàng)建一些表并插入一些數據,如下所示。
psql -d postgres -c "CREATE TABLE abc (ID INT);"
psql -d postgres -c "CREATE TABLE xyz (ID INT);"
psql -d postgres -c "INSERT INTO abc VALUES (1);"
psql -d postgres -c "INSERT INTO xyz VALUES (1);"
psql -d postgres -c "SELECT count(*) from abc;"
psql -d postgres -c "SELECT count(*) from xyz;"
現在,我們可以使用以下命令運行我們的第一個備份,
#Do a backup
pg_rman backup --backup-mode=full --with-serverlog -B /media/david/disk1/backup_rman -D /media/david/disk1/pgdata_rman -A /media/david/disk1/archive -S /media/david/disk1/pglog -p 5432 -d postgres
在這里,我們進行完整備份以包含所有內容,以及此完整備份的所有基本信息。每次備份完成后,pg_rman 都會要求您驗證備份。因此,要驗證備份,我們可以簡單地運行命令,
#Validate
pg_rman validate -B /media/david/disk1/backup_rman
如果備份有效,那么我們可以插入更多數據并運行另一個備份。您可以按照以下步驟操作。
psql -d postgres -c "INSERT INTO abc VALUES (2);"
psql -d postgres -c "INSERT INTO xyz VALUES (2);"
psql -d postgres -c "SELECT count(*) from abc;"
psql -d postgres -c "SELECT count(*) from xyz;"
pg_rman backup --backup-mode=full --with-serverlog -B /media/david/disk1/backup_rman -D /media/david/disk1/pgdata_rman -A /media/david/disk1/archive -S /media/david/disk1/pglog -p 5432 -d postgres
#Validate
pg_rman validate -B /media/david/disk1/backup_rman
#### Insert more data
psql -d postgres -c "INSERT INTO abc VALUES (3);"
psql -d postgres -c "INSERT INTO xyz VALUES (3);"
$ pg_rman show -B /media/david/disk1/backup_rman
=====================================================================
StartTime EndTime Mode Size TLI Status
=====================================================================
2022-05-27 13:05:30 2022-05-27 13:05:32 FULL 51MB 1 OK
2022-05-27 13:05:28 2022-05-27 13:05:30 FULL 51MB 1 OK
現在,我們有兩個完整備份,第一個在每個表中有一條記錄,第二個在每個表中有兩條記錄,第二個備份我們在每個表中插入了第三條記錄。如果您現在查詢這兩個表,您可以看到以下結果。
$ psql -d postgres -c "SELECT count(*) from abc;"
count
-------
3
(1 row)
$ psql -d postgres -c "SELECT count(*) from xyz;"
count
-------
3
(1 row)
假設我們在第三次操作中出錯了,讓我們停止 PostgreSQL 服務器并嘗試恢復到第二次備份階段。
# Stop
pg_ctl -D pgdata_rman -l pglog/logfile stop
#Restore to target time
pg_rman restore -B /media/david/disk1/backup_rman -D /media/david/disk1/pgdata_rman --recovery-target-time="2022-05-27 13:05:32"
# Restart
pg_ctl -D pgdata_rman -l pglog/logfile start
$ psql -d postgres -c "SELECT count(*) from abc;"
count
-------
2
(1 row)
$ psql -d postgres -c "SELECT count(*) from xyz;"
count
-------
2
(1 row)
就像你所看到的,我們回到第二個備份階段,每個表只有兩條記錄。
3.3. 全都消失了
pg_rman 是 PostgreSQL 用戶備份和恢復數據庫的一個很好的免費開源工具,但是,此時缺少一個功能,即目標表恢復。作為數據庫管理員,如果只需要恢復一個表是一項明確的操作,那么一個特定的表恢復可以幫助降低生產注冊的風險。
4.總結
在這篇博客中,我們討論了使用免費開源工具 pg_rman 進行 PostgreSQL 備份恢復的基礎知識,希望這篇文章可以幫助您尋找免費的 PostgreSQL 備份和恢復解決方案。




