一、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? 適用于數據量較大,實時性較高的備份和恢復