POSTGRESQL 備份與恢復幾種方法

一、Copy

COPY在 PostgreSQL表和標準文件系統文件之間 移動數據。COPY TO把一個表的內容復制 到一個文件,而COPY FROM 則從一個文件復制數據到一個表(把數據追加到表中原有數據)。COPY TO也能復制一個 SELECT查詢的結果。 支持text、 csv(逗號分隔值)或者binary。 默認是text。

(一)語法:

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }

? ? TO { 'filename' | PROGRAM 'command' | STDOUT }

[ [ WITH ] ( option [, ...] ) ]

COPY table_name [ ( column_name [, ...] ) ]

? ? FROM { 'filename' | PROGRAM 'command' | STDIN }

[ [ WITH ] ( option [, ...] ) ]

(二)常用參數

table_name,column_name,query,filename

(三)示例:

導出表

COPY user TO '/tmp/data/test.csv' WITH csv;

導出字段

COPY user(name,password) TO '/tmp/data/test.csv' WITH csv;

COPY (select name,age from user) TO '/tmp/data/test.csv' WITH csv header;

導入表

COPY user from '/tmp/data/test.csv' ;

(四)注意事項:

COPY TO只能被用于純粹的表,不能用于視圖。 不過你可以寫COPY (SELECT * FROM viewname) TO ... 拷貝一個視圖的當前內容。

COPY FROM可以被用于純粹的表和具有 INSTEAD OF INSERT觸發(fā)器的視圖。 同時調用目標表上的任何觸發(fā)器 和檢查約束。

COPY命令的用戶必須是 PostgreSQL用戶(運行服務器的用戶 ID)可訪問的并且是可讀或者可寫的。 只允許數據庫超級用戶COPY一個文件或者命令, 因為它允許讀取或者寫入服務器有特權訪問的任何文件。

COPY默認利用tab作為列的界限,空格作為字符

二、Pg_dump

pg_dupg_dump — 把PostgreSQL數據庫抽取為一個腳本文件或其他歸檔文件

(一)語法

Pg_dump [connection-option...] [option...] [dbname]

樣例:pg_dump dbname > outfile

psql dbname < infile

pg_restore -d newdb db.dump

(二)常用參數:

-a? --data-only

-b? --blobs

-B? --no-blobs

-c? --clean

d? directory

-j njobs? --jobs=njobs

-n schema? --schema=schema

-t table? --table=table

參數命令中大小寫會造成語義相反。

(三)示例:

要把一個數據庫mydb轉儲到一個 SQL 腳本文件:

$ pg_dump mydb > db.sql

要用 5 個并行的工作者任務轉儲一個數據庫到一個目錄格式的歸檔:

$ pg_dump -Fd mydb -j 5 -f dumpdir

要把一個歸檔文件重新載入到一個(新創(chuàng)建的)名為newdb的數據庫:

$ pg_restore -d newdb db.dump

要轉儲detroit模式中名稱以emp開始的所有表,排除名為employee_log的表:

$ pg_dump -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql

(四)注意事項:

?為maintenance_work_mem和max_wal_size設置適當的(即比正常值大的)值。

?如果使用 WAL 歸檔或流復制,在轉儲時考慮禁用它們。在載入轉儲之前,可通過將archive_mode設置為off、將wal_level設置為minimal以及將max_wal_senders設置為零(在錄入dump前)來實現禁用。 之后,將它們設回正確的值并執(zhí)行一次新的基礎備份。

?如果在數據庫服務器上有多個 CPU 可用,可以考慮使用pg_restore的--jobs選項。這允許并行數據載入和索引創(chuàng)建。?

?恢復后執(zhí)行統計信息收集

ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]描述

ANALYZE收集一個數據庫中的表的內容的統計信息,并且將結果存儲在pg_statistic系統目錄中。

三、PG_DUMPALL

pg_dumpall備份一個給定集簇中的每一個數據庫,并且也保留了集簇范圍的數據,如角色和表空間定義。

(一)語法

pg_dumpall > outfile

轉儲的結果可以使用psql恢復:

psql -f infile postgres

(二)注意事項

?PG_DUMPALL的過程中,每個數據庫自身是一致的,但是不同數據庫的快照并不同步。

?建議在每個數據庫上運行ANALYZE,這樣優(yōu)化器就可以得到有用的統計信息。你也可以運行vacuumdb -a -z來分析所有數據庫。

四、PITR

在任何時間,PostgreSQL在數據集簇目錄的pg_wal/子目錄下都保持有一個預寫式日志(WAL)。這個日志存在的目的是為了保證崩潰后的安全:如果系統崩潰,可以“重放”從最后一次檢查點以來的日志項來恢復數據庫的一致性。我們可以把一個文件系統級別的備份和WAL文件的備份結合起來。當需要恢復時,我們先恢復文件系統備份,然后從備份的WAL文件中重放來把系統帶到一個當前狀態(tài)。

(一)修改配置文件 postgresql.conf

archive_mode = on

archive_command = 'cp -i %p /home/sure/mywork/archive/%f'

wal_level = replica

重啟數據庫

./pg_ctl -l logfile start

(二)對數據庫進行物理備份

select pg_start_backup('stm');

打包數據庫

tar -cvzf data.tar data

結束備份

select pg_stop_backup();

這時會再備份出的data下產生一個backup_label的文件,記錄了可以查看內容有checkpoint時間,基礎備份的開始和結束時間,以及標簽名稱等

這里也可以用pg_basebackup工具備份

pg_basebackup? -F t -R -D /home/postgres/bak

(三)更新數據庫

copy? weather from '/home/postgres/test.txt';

切換歸檔產生新歸檔文件

PostgreSQL手動切換WAL日志的命令:?

在PG10之前:

highgo=# select pg_switch_xlog(); pg_switch_xlog

在PG10之后:

highgo=# select pg_switch_wal(); pg_switch_wal

(四)模擬數據庫毀壞并恢復

模擬毀壞? cp -r data data1

解壓備份:$ tar xvf data.tar

清理pg_wal? ? rm -rf? ./*

修改 postgresql.conf? 將之前的配置去掉

配置recovery.conf

restore_command = 'cp /home/postgres/archive/%f %p'

archive_cleanup_command='pg_archivecleanup /home/sure/mywork/archivedir %r'

recovery_target_time='2018-07-21 14:35:12'

重啟數據庫

Pg_ctl start

結束后,recovery.conf會改名變成recovery.done。

驗證數據

Select? * from weather;

五、總結:

COPY適合單表或者一個查詢的結果,小范圍的移動

PG_DUMP適用于數據實時性要求低,單個數據庫的備份恢復

PG_DUMPALL適用于數據實時性要求低,整個數據庫集簇的備份與恢復

PITR? 適用于數據量較大,實時性較高的備份和恢復

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容