最近在做會員系統,其中會員系統有一份企業信息初始化的數據,需要從SQL Server數據庫導入到PostgreSQL,單表的數據近30萬。
最開始的方案是在SQL Server上生成insert into的sql,再把生成的sql在Postgresql上導入。第一次導入時,沒有刪除索引,用了近2個小時才導完一張單表。
后面在網上找到PostgreSQL有一個Copy命令用於大量數據的導入導出(http://www.2cto.com/database/201309/241346.html),於是就用了Copy來導數據。
Copy的語法介紹:http://blog.sina.com.cn/s/blog_73094447010158zr.html,導入企業信息的Copy命令如下:
COPY tb_uni_enterprise(appid, eid, ename, status, creator, createtime,modifier, modifytime, memo) FROM '/tmp/init/enterprise.sql' DELIMITER '|';
導入數據過程:
/*1.刪除索引*/
drop index UQ_IDX_UNI_ENTERPRISE_001;
/*2.清空表數據,注意該步驟,只有測試在重復部署環境時才執行,生產環境只初始化一次,不需要執行 */
truncate tb_uni_enterprise;
/*3.導入數據*/
COPY tb_uni_enterprise(appid, eid, ename, status, creator, createtime,modifier, modifytime, memo) FROM '/tmp/init/enterprise.sql' DELIMITER '|';
/*4.創建索引*/
create unique index UQ_IDX_UNI_ENTERPRISE_001 on TB_UNI_ENTERPRISE (
appid,
eid
);
使用Copy導入數據,30萬數據導入約7秒。
第一次使用Copy導入時失敗了,提示appid數據太長,原因是把整行數據都當做appid的數據了,Copy導入的文本內容要以\n作為行結束符(http://bbs.chinaunix.net/thread-1830462-1-1.html)。
另外PostgreSQL是安裝在Linux環境的,在運行Copy時也有幾個問題:
1.使用shell連接服務器后,找不到psql命令,原因是PostgreSQL的命令沒有加到$PATH中
Linux中在每個用戶的$HOME目錄下有一個.bash_profile文件,這個文件是每次用戶登錄的時候都會執行,可以在.bash_profile中把PostgreSQL的命令加到$PATH中,在PostgreSQL的安裝目錄有一個set_env.sh的文件,文件中有設置環境變量的shell腳步,可以把該腳步的內容拷貝追加到.bash_profile中,也可以直接在.bash_profile中添加運行set_env.sh腳步語句:./PostgreSQL安裝目錄/set_env.sh。修改.bash_profile后需要重新登錄才會生效。
2.執行Copy命令時沒有目錄權限
在Linux中安裝的PostgreSQL都有一個叫postgres的用戶,可以用postgres登錄再創建目錄,這樣創建的目錄對postgres來說就有讀寫權限了。
另外一種方法是用root用戶創建目錄,然后用"chmod 777 目錄名"命令為所有用戶加上讀寫權限。
備注:
測試過程中用到的PostgreSQL命令有
1.psql -U uni_auth 使用指定用於進入命令行
2.進入命令行后,默認的數據庫是postgres,需要使用\c uni_auth_db命令來切換數據庫
3.使用\?可以查看在命令行模式下所有的命令以及命令說明。