對 PostgreSQL 進行 Point-in-Time Recovery 備份,若是很多的資料庫要處理,這就會變成一個令人頭昏的大工程。EnterpriseDB 公司的 Backup and Recovery Tool v1.1(EDB-BaRT)是該公司提供來進行資料庫整合管理備份的工具。它主要的功能是用在管理資料庫的全備份(Base Backup),可以有效管理同一個資料庫的多分全備份,並能夠在一處管理多部 PostgreSQL/EnterpriseDB 的資料庫全備份檔案。
該工具為命令列下的工具,可以利用 CRON Job,搭配 BaRT 的 log(會將每次的備份、還原活動紀錄起來),定時進行資料庫全備份,並依照備份時間點,選取適當的備份檔進行還原。
目前 EDB-BaRT v1.1 還不支援管理 Incremental Backup 的功能(也就是,Point-in-Time Recovery),但還是能透過手動加上適當的 recovery.conf 檔案到待還原的全備份中,進行 Point-in-Time Recovery。
系統需求
這個工具支援的是 64 位元版的 RHEL 6.x/7.x,該機器上不見得要安裝 PostgreSQL 資料庫。
而該主機上將會作為資料庫全備份檔案,以及 WAL 交易日誌存放的地方,於是若有多部資料庫要管理,該主機上的儲存空間要準備充足。
安裝 BaRT
BaRT 依賴標準路徑下的 libpq.so,若是安裝 EDB 公司發布的 PostgreSQL distribution,則可以直接由 PostgreSQL 社群維護的 YUM Repository 取得 postgresql9x-libs 的 rpm 安裝檔安裝
[root@bartvm ~]# yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-x86_64/postgresql95-libs-9.5.3-2PGDG.rhel6.x86_64.rpm [root@bartvm ~]# rpm -ivh edb-bart-1.1.0-1.rhel6.x86_64.rpm
設置 SSH 金鑰
為了讓 BaRT 工具能夠管理各個資料庫的 WAL 交易日誌的存放,需要讓各部資料庫主機與 BaRT 主機之間能夠透過 SSH 免帳號登入,以便使 WAL 檔案可以透過 scp 傳送
以下示範為從 computerA 主機上的帳號 user1 免密碼登入 computerB 主機的帳號 user2
[user1@computerA ~]$ ssh-keygen -t rsa [user1@computerA ~]$ ssh-cpoy-id -i ~/.ssh/id_rsa.pub user2@computerB
如此便能夠進行登入測試
[user1@computerA ~]$ ssh user2@computerB
若仍無法自動登入,請檢查 .ssh/authorized_keys 的檔案權限
|
各資料庫的設置
為了讓各資料庫能產生 WAL 交易日誌備份,以及使用 BaRT 的備份功能,需要設置 postgresql.conf 以及 pg_hba.conf
在 postgresql.conf 中啟用 WAL 交易日誌的備份功能:
listen_addresses = '*' port = 5444 wal_level = archive archive_mode = on max_wal_senders = 1
在 pg_hba.conf 中允許相對應的登入權限
host all enterprisedb 127.0.0.1/32 trust host replication enterprisedb 127.0.0.1/32 trust
設置完畢後,重新啟動資料庫
接著,便可以進行 BaRT 的設定。BaRT 的設定檔位置預設在 /usr/edb-bart-1.1/etc/bart.cfg(為 root 所擁有),不過也可自行指定設定檔位置,並透過指令參數指定。
以下範例將 /usr/edb-bart-1.1/etc/bart.cfg 內主要部份取出來,另存到 user 帳號的 ~/bart.cfg 下
[user@bartvm ~]$ cat ~/bart.cfg [BART] bart-host= enterprisedb@127.0.0.1 backup_path = /opt/backup pg_basebackup_path = /opt/PostgresPlus/9.5AS/bin/pg_basebackup wal_compression= enabled logfile = /tmp/bart.log [PPAS95] host = 127.0.0.1 port = 5444 user = enterprisedb archive_command = "cp %p %a/%f" description = "PPAS 95 server"
上述對於 PostgreSQL 9.4 版以後,可以透過 BaRT 統一管理 archive_command 指令;在 BaRT 中所設定的 archive_command 指令會在 BaRT 初始化後送到資料庫中的 postgresql.auto.conf 內,待重新啟動資料庫之後便生效
設定完畢後,便可以直接執行 BaRT 工具。
初始化:這步驟主要將 archive_command 送到資料庫的 postgresql.auto.conf 中
[user@bartvm ~]$ /usr/edb-bart-1.1/bin/bart -f ~/bart.cfg \ > INIT -s ppas95 INFO: setting archive_command for server 'ppas95' WARNING: archive_command is set. server restart is required
執行後別忘了需要重新啟動資料庫
接著,列出資料庫信息
[user@bartvm ~]$ /usr/edb-bart-1.1/bin/bart -f \ > ~/bart.cfg SHOW-SERVERS -s all SERVER NAME : ppas95 HOST NAME : 127.0.0.1 USER NAME : enterprisedb PORT : 5444 REMOTE HOST : RETENTION POLICY : none DISK UTILIZATION : 0.00 bytes NUMBER OF ARCHIVES : 0 ARCHIVE PATH : /opt/backup/ppas95/archived_wals ARCHIVE COMMAND : cp %p /opt/backup/ppas95/archived_wals/%f XLOG METHOD : fetch WAL COMPRESSION : enabled TABLESPACE PATH(s) : DESCRIPTION : "PPAS 95 server"
若是資料庫登入上有發生問題,該表單便不會列舉完整。因此可以用這個指令確認是否設置正確
接著便能夠進行備份
[user@bartvm ~]$ /usr/edb-bart-1.1/bin/bart -f ~/bart.cfg BACKUP -s ppas95 INFO: creating backup for server 'ppas95' INFO: backup identifier: '1465975415236' 576274/576274 kB (100%), 1/1 tablespace INFO: backup completed successfully INFO: backup checksum: b28d97be7db71f1e034a15eb08d2c72f of base.tar INFO: BACKUP DETAILS: BACKUP STATUS: active BACKUP IDENTIFIER: 1465975415236 BACKUP NAME: none BACKUP LOCATION: /opt/backup/ppas95/1465975415236 BACKUP SIZE: 562.77 MB BACKUP FORMAT: tar XLOG METHOD: fetch BACKUP CHECKSUM(s): 1 ChkSum File b28d97be7db71f1e034a15eb08d2c72f base.tar TABLESPACE(s): 0 START WAL LOCATION: 000000010000000000000026 BACKUP METHOD: streamed BACKUP FROM: master START TIME: 2016-06-15 07:23:35 UTC STOP TIME: 2016-06-15 07:23:46 UTC TOTAL DURATION: 11 sec(s)
備份完畢後,可以用下列指令檢視備份
[user@bartvm ~]$ /usr/edb-bart-1.1/bin/bart -f ~/bart.cfg SHOW-BACKUPS -s ppas95 SERVER NAME BACKUP ID BACKUP TIME BACKUP SIZE WAL(s) SIZE WAL FILES STATUS ppas95 1465984889630 2016-06-15 10:01:40 UTC 78.15 MB 560.00 MB 35 active
以上操作,基本上就完成備份操作了
指定在 ~/restore1/ 下建立還原資料庫
[user@bartvm ~]$ mkdir ~/restore1 [user@bartvm ~]$ chmod 700 ~/restore1/ [user@bartvm ~]$ cd /usr/edb-bart-1.1/bin [user@bartvm /bin]$ ./bart -f ~/bart.cfg \ > RESTORE -s ppas95 -i 1465984889630 -p ~/restore1/ INFO: restoring backup '1465984889630' of server 'ppas95' INFO: restoring backup to /var/lib/ppas//restore1 INFO: base backup restored INFO: copying WAL file(s) to /var/lib/ppas//restore1/archived_wals INFO: archiving is disabled
啟用這個資料庫
[user@bartvm ~]$ pg_ctl -D ~/restore_dir/ start
到這裡,便還原備份到該一備份檔建立的時間點了
到目前為止,EDB BaRT v1.1 工具由於還只有支援全備份的管理,所以若是要進一步使用 Point-in-Time Recovery,就得要再手動加上 recovery.conf 檔案才行。
要進行 Point-in-Time Recovery,首先,如上面一樣,先恢復一份備份:
[user@bartvm ~]$ mkdir ~/restore2 [user@bartvm ~]$ chmod 700 ~/restore2/ [user@bartvm ~]$ cd /usr/edb-bart-1.1/bin [user@bartvm /bin]$ ./bart -f ~/bart.cfg \ > RESTORE -s ppas95 -i 1465984889630 -p ~/restore2/ INFO: restoring backup '1465984889630' of server 'ppas95' INFO: restoring backup to /var/lib/ppas//restore2 INFO: base backup restored INFO: copying WAL file(s) to /var/lib/ppas//restore2/archived_wals INFO: archiving is disabled
再來,設定 recovery.conf
[user@bartvm ~]$ cat ~/restore2/recovery.conf restore_command = 'cp /opt/backup/ppas95/archived_wals/%f %p'
最後,從舊(/損毀的)的資料夾複製 WALs 到新備份裡面
[user@bartvm backup]$ rm -rf ~/restore2/pg_xlog/* [user@bartvm backup]$ cp -r ~/9.5AS/data/pg_xlog/* ~/restore2/pg_xlog/
這樣一來,就能啟動資料庫,開始 Point-in-Time Recovery 了
[user@bartvm ~]$ pg_ctl -D ~/restore2 start
想確認還原的狀況,一樣去觀察 PostgreSQL 的 log:
[user@bartvm ~]$ tail -f ~/restore1/pg_log/enterprisedb-2016-06-16_032631.log
要確認還原完畢,去檢查 recovery.conf 有沒有變成 recovery.done 就行了(就是 Point-in-Time Recovery 的流程)。
參考:
相關工具
pg_rman:這個工具與 EDB BaRT 設計蠻相像的,目前有支援 Incremental Backup 功能(目前 EDB BaRT v1.1 尚未支援),不過該工具無法像 BaRT 可以跨版本支援
WAL-E:著重在強化支援雲端 PostgreSQL 服務
PgBackMan:有進入 PostgreSQL 社群 YUM 的工具
Barman:有進入 PostgreSQL 社群 YUM 的工具
其他
omnipitr:一個管理 WAL 怪怪的工具
沒有留言:
張貼留言