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