PostgreSQL數據庫備份與恢復技術比較
備份 PostgreSQL 數據有三種完全不同的方法:
· SQL 轉儲
· 文件系統級別備份
· 在線備份
一、 SQL 轉儲
SQL轉儲是使用pg_dump應用工具將當前的數據塊導出為SQL文件;當數據庫需要重建時,將該SQL文件回饋給服務器,恢復數據庫為重建時的數據庫狀態。
當備份整個數據庫集群的時候可以使用pg_dumpall程序, pg_dumpall 備份給出的集群中的每個數據庫,同時還確保保留象用戶和組這樣的全局數據狀態。
當數據庫中表的大小大于系統允許的最大文件大小時,需要使用標準的UNIX工具解決該問題。
不足:
要獲得數據庫的超級用戶權限,在數據庫恢復時仍然要求這些權限的存在。
在pg_dump運行的時候對數據庫的更新將不會被轉儲。
二、 文件系統級別的備份
直接拷貝PostgreSQL數據庫中用于存放數據庫數據的文件。
方式:
“一致快照方式”
使用rsync執行文件系統備份
不足:
在進行備份時必須關閉數據庫
數據庫分布在多個文件系統上時,只有關閉數據庫足夠長的時間才能完整備份
轉儲后的文件較大
三、 在線備份以及即時恢復
這種方式組合了系統備份與WAL文件的備份,當需要恢復時,會先恢復文件備份然后重放WAL文件。
優點:
初始時并不需要完美的一致備份,因此不需要使用快照功能,tar或類似歸檔工具即可實現備份;
可以通過連續的備份WAL文件歸檔來實現連續的數據庫備份;
可以將數據庫恢復到開始備份以來的任意時刻的狀態;
要求:
只支持整個數據庫集群的恢復;
要求大量的歸檔存儲;
操作:
1、設置WAL歸檔
1)創建 WAL備份目錄,比如:d:\pg_xlog_archive
2)修改 postgresql.conf中的 archive_command 設置,比如:
archive_command = 'copy "%p" d:\\pg_xlog_archive\\%f'
注:%p要用雙引號括起來處理安裝目錄中有空格的情況。
archive_mode = on
wal_level='archive'
在postgresql.conf文件里用archive_command 聲明shell命令用于將一個完整的段文件拷貝到指定位置,在該shell命令中需要用%p表示要歸檔的文件的絕對路徑, %f表示文件名。
eg:archive_command = 'cp -i %p /mnt/server/archivedir/%f </dev/null'
歸檔命令要在運行PostgreSQL服務器的同一個用戶的權限下執行。另外,當且僅當歸檔命令運行成功時它才返回0。
注意:盡管 WAL 歸檔允許恢復任何對PostgreSQL數據庫的數據做的修改,在最初的基礎備份之后,它不會恢復對配置文件的修改(也就是說,postgresql.conf,pg_hba.conf和 pg_ident.conf),因為這些文件都是手工編輯的,而不是通過 SQL操作來編輯的。所以你可能會需要把你的配置文件放在一個日常文件系統備份過程即可處理到的地方。
2、進行基礎備份
1)確保 WAL歸檔打開并且可以運轉。
2)以數據庫超級用戶身份連接到數據庫,發出命令 SELECT pg_start_backup('label');
這里的 label 是任意你想使用的這次備份操作的唯一標識。(一個好習慣是使用你想把備份轉儲文件放置的目的地的全路徑。) pg_start_backup用你的備份的信息,在你的集群目錄里,創建一個備份標簽文件,叫做 backup_label。
3)執行備份,使用任何方便的文件系統工具,比如 tar或者 cpio。這些操作過程中既不需要關閉數據庫,也不希望關閉數據庫的操作。
4)再次以數據庫超級用戶身份連接數據庫,然后發出命令 SELECT pg_stop_backup();
5)只要在備份過程中使用的 WAL段文件作為正常數據庫活動的一部分備份完畢,你的備份工作就完成了。
注意:要保證你的備份轉儲包括所有數據庫集群目錄里的文件(比如,/usr/local/pgsql/data)以及表空間。