1. 程式人生 > 資料庫 >在postgreSQL中執行sql指令碼和pg_restore命令方式

在postgreSQL中執行sql指令碼和pg_restore命令方式

今天踩坑了,把powerdesign生成的sql指令碼檔案,用pg_restore命令一直執行。。。

過程慘不忍睹,一直以為是編碼問題,修改了serve和client的encoding,結果。。。

記錄一下這個錯誤:

postgreSQL執行sql指令碼檔案:

psql -d dbname -U username -f (指令碼所在位置).sql

postgerSQL的pg_restore命令

用法:

pg_restore [選項]… [檔名]

一般選項:

-d,--dbname=名字 連線資料庫名字
-f,--file=檔名 輸出檔名
-F,--format=c|d|t 備份檔案格式(應該自動進行)
-l,--list 列印歸檔檔案的 TOC 概述
-v,--verbose 詳細模式
-V,--version 輸出版本資訊,然後退出
-?,--help 顯示此幫助,然後退出

恢復控制選項:

-a,--data-only 只恢復資料,不包括模式
-c,--clean 在重新建立之前,先清除(刪除)資料庫物件
-C,--create 建立目標資料庫
-e,--exit-on-error 發生錯誤退出,預設為繼續
-I,--index=NAME 恢復指定名稱的索引
-j,--jobs=NUM 執行多個並行任務進行恢復工作
-L,--use-list=FILENAME 從這個檔案中使用指定的內容表排序

輸出

-n,--schema=NAME 在這個模式中只恢復物件
-N,--exclude-schema=NAME 不恢復此模式中的物件
-O,--no-owner 不恢復物件所屬者
-P,--function=NAME(args) 恢復指定名字的函式
-s,--schema-only 只恢復模式,不包括資料
-S,--superuser=NAME 使用指定的超級使用者來禁用觸發器
-t,--table=NAME 恢復命名關係(表、檢視等)
-T,--trigger=NAME 恢復指定名字的觸發器
-x,--no-privileges 跳過處理許可權的恢復 (grant/revoke)
-1,--single-transaction 作為單個事務恢復
–disable-triggers 在只恢復資料的過程中禁用觸發器
–enable-row-security 啟用行安全性
–if-exists 當刪除物件時使用IF EXISTS
–no-comments 不恢復註釋
–no-data-for-failed-tables 對那些無法建立的表不進行

資料恢復

–no-publications 不恢復發行
–no-security-labels 不恢復安全標籤資訊
–no-subscriptions 不恢復訂閱
–no-tablespaces 不恢復表空間的分配資訊
–section=SECTION 恢復命名節 (資料前、資料及資料後)
–strict-names 要求每個表和(或)schema包括模式以匹配至少一個實體
–use-set-session-authorization
使用 SESSION AUTHORIZATION 命令代替
ALTER OWNER 命令來設定所有權

聯接選項:

-h,--host=主機名 資料庫伺服器的主機名或套接字目錄
-p,--port=埠號 資料庫伺服器的埠號
-U,--username=名字 以指定的資料庫使用者聯接
-w,--no-password 永遠不提示輸入口令
-W,--password 強制口令提示 (自動)
–role=ROLENAME 在恢復前執行SET ROLE操作

選項 -I,-n,-N,-P,-t,-T,以及 --section 可以組合使用和指定

多次用於選擇多個物件.

希望不要和我一樣犯這個低階錯誤

順便記錄一下檢視server和client的encoding以及修改

找到postgresql.conf檔案,修改引數lc_messages的值為UTF8

重啟PostgreSQL的服務。

----檢視服務端字符集:

test=> show server_encoding;

—檢視客戶端字符集:

test=> show client_encoding;

補充:pg_restore及psql恢復資料的用法

一、使用psql恢復SQL文字格式的資料備份(即一個包含SQL指令碼的文字檔案)

恢復一個SQL備份檔案並忽略過程中可能發生的所有錯誤:

psql -U postgres -f myglobals.sql

恢復一個SQL備份檔案,如遇任何錯誤則立即停止恢復:

psql -U postgres --set ON_ERROR_STOP=ON -f myglobals.sql

將SQL文字中的資料恢復到某個指定的database:

psql -U postgres -d mydb -f select_objects.sql

二、使用pg_restore進行恢復

功能:

(1)支援並行恢復,使用-j選項可以控制並行恢復的執行緒數。多個恢復執行緒可以並行處理,每個執行緒處理一張表。該模式可以顯著提高恢復速度。

(2)可以使用pg_restore掃描備份檔案來生成一張備份內容列表,通過該列表可以確認備份紅包含了哪些內容。還可以通過編輯該內容列表來控制恢復哪些內容。

(3)pg_dump支援選擇性地僅備份部分物件以節省備份時間,類似的,pg_restore也支援選擇性的僅恢復部分物件,不管備份檔案本身是全庫備份還是部分物件的備份都沒有問題。

(4)pg_restore的大部分功能是向後相容的,即支援將老版本PostgreSQL生產的備份資料恢復到新版本的PostgreSQL中。

在使用pg_restore執行恢復動作之前,請先建立目標資料庫:

create database mydb;

然後執行恢復:

pg_restore --dbname=mydb --jobs=4 --verbose mydb.backup

如果備份和恢復時使用的database同名,則可以通過加--create選項省去單獨建庫的過程,如下:

pg_restore --dbname=postgres --create --jobs=4 --verbose mydb.backup

注:如果指定了--create選項,那麼恢復出來的資料庫名就會預設採用備份時的資料庫名,不允許改名。如果還同時指定了--dbname選項,那麼此時連線的資料庫名一定不能是待恢復的資料庫名,因為要恢復資料庫之前必然要建資料庫,而

要建資料庫之前必然要先連到某個已存在的資料庫,--dbname選項指定的就是建立被恢復的資料庫之前先連到哪個資料庫,所以必然不能與待恢復的資料庫同名,我們一般指定先連到postgres資料庫。

9.2版或更新版本的pg_restore支援--section選項,加上該選項後可以實現僅恢復表結構而不恢復表資料。具體做法是先建立目標恢復資料庫:

create database mydb2;

然後使用pg_restore:

pg_restore --dbname=mydb2 --section=pre-data --jobs=4 mydb.backup

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。