GreenPlum/postgres copy命令導出/導入數據


一、COPY命令簡單實用

1、copy在postgres與GreenPlum介紹

1.1 postgres
postgres的COPY命令可以快速的導出/導入數據到postgresql數據庫中,支持常用的文件格式,如:txt、sql、csv、壓縮文件、二進制格式等。特別適合批量導出和導入數據,速度比較快。
COPY TO把一個表的所有內容都拷貝到一個文件;
COPY FROM從一個文件里拷貝數據到一個表里(把數據附加到表中已經存在的內容里)。
注意:
COPY只能用於表,不能用於視圖。
1.2 GreenPlum
對於數據的加載,GreenPlum數據庫也提供了copy工具(源於PostgreSQL數據庫),使用方法同postgres數據庫的copy命令。copy命令支持文件與表之間的數據的導入和導出。
注意:
使用copy命令進行數據導入時,數據需要經過Master節點分發到Segment節點;同樣使用copy命令進行數據卸載,數據也需要由Segment發送到Master節點,由Master節點匯總后再寫入外部文件。這樣就限制了數據加載與卸載的效率,但是數據量較小的情況下,copy命令就非常方便。
當數據量比較大時可以考慮使用GreenPlum的gpload工具來導入。


2. 使用copy命令導出/導入數據的步驟

 

COPY aa_test  FROM '/tmp/data/test.csv'  csv HEADER NULL '';

 

通常使用psql工具來進行數據的導出和導入。
2.1 准備工作
(1) 創建用於存放導出文件(或待導入文件)的目錄,並賦予權限;
注意:
使用root用戶
# 創建目錄
[root@node8 /]# mkdir /tmp/data
# 賦予權限
[root@node8 /]# chmod 777 /tmp/data/
12345
(2) 進入psql並切換數據庫
注意:
如果是postgres數據庫,則切換到postgres用戶;
如果是GreenPlum的MPP,則切換到gpadmin用戶;
# 由於我使用的是GreenPlum的MPP,所以切換gpadmin用戶
# ---------------------------------------------------------
[root@node8 ~]# su - gpadmin
# 進入psql
[gpadmin@node8 ~]$ psql
# 使用`\c`命令切換數據庫,切換到要導出或導入數據的數據庫
# ---------------------------------------------------------
postgres=# \c resdata
You are now connected to database "resdata" as user "gpadmin".
1234567891011
3. 開始使用copy命令導出或導入數據
# 使用 copy 命令將 resdata 庫下的 aa_test 表中的數據導出到 /tmp/data/test.csv 文件中
# ---------------------------------------------------------
resdata=# COPY aa_test TO '/tmp/data/test.csv' WITH csv;
COPY 2
# 使用 copy 命令將 /tmp/data/test.csv 文件中內容導入到 resdata 庫下的 aa_test 表中
# ---------------------------------------------------------
resdata=# COPY aa_test  FROM '/tmp/data/test.csv' WITH csv;
COPY 2
123456789
COPY TO還能拷貝SELECT查詢的結果。如果聲明了一個字段列表,COPY將只在文件和表之間拷貝已聲明字段的數據。 如果表中有任何不在字段列表里的字段,那么COPY FROM將為那些字段插入缺省值。
# 使用select命令
---------------------
 

二、copy命令詳細介紹

1、Copy的基本語法

Copy的作用是復制數據在數據表和文件之間。
Copy在PostgreSql中的語法是(來自文檔):
1)  將文件中的數據復制到表中:
COPY table_name [ ( column_name [, ...] ) ]
   FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
2)將表中的數據復制到文件中:
COPY { table_name [ ( column_name [, ...] )] | ( query ) }
    TO{ 'filename' | PROGRAM 'command' | STDOUT }
    [[ WITH ] ( option [, ...] ) ]
其中option的設置的參數如下:
   FORMAT format_name
   OIDS [ boolean ]
   FREEZE [ boolean ]
   DELIMITER 'delimiter_character'
   NULL 'null_string'
   HEADER [ boolean ]
   QUOTE 'quote_character'
   ESCAPE 'escape_character'
   FORCE_QUOTE { ( column_name [, ...] ) | * }
   FORCE_NOT_NULL ( column_name [, ...] )
   ENCODING 'encoding_name'

2、Copy的參數解釋和示例

     FORMAT:指復制到文件的文件類型,如:CSV,TEXT。
       OIDS  :指復制到文件時帶上oid,但是當某個表沒有oid時就會出錯。
       FREEZE :凍結數據,然后執行VACUUM FREEZE。
       DELIMITER:指在導出文件時的分隔符指定需要用單引號。在TEXT時默認為tab,CSV文件默認是逗號。不支持binary文件格式。
      HEADER:指在復制到文件時帶上表字段名稱。
       NULL:指定null值,默認為\N。
       ENCODING:指定文件的編碼,如果沒有指定就默認使用客戶端的字符集。
       STDIN:指的是客戶端程序的輸入流。
STDOUT:指向是客戶端的輸出流。
 
  在執行COPY FROM時table_name就需要實際存在的表,其中字段是可以自選的,如:
1.         COPYemp(ename) FROM “E://emp.txt”
需要注意的是字段類型要匹配並且文件也只要一個字段的值。
2.         COPYemp FROM “E://emp.txt”
文件中需要包含emp表中的字段的值,或tab,或‘,’等分割開的數據
  在執行COPY TO時的一些注意,解釋和示例:
1.         COPYemp TO STDOUT (DELIMITER ‘|’)
指的是輸出在客戶端並且以‘|’為分隔符
2.         COPY (select* from emp) TO ‘E://emp.csv’ (FORMAT ‘CSV’,DELIMITER ‘|’,HEADER true,NULL ‘’’’’’)
Table_name是可以為動態視圖的,並且在后面的括號中參數可以包含多個,多個參數以逗號分隔開。HERDER的值可以使true,false,1,0,on,off,需要注意的是HERDER參數只有在FORMAT為CSV時生效。
3.         COPY empTO PROGRAM ‘zip > E://emp.zip’
參數PROGRAM指的是使用操作系統內部的程序對輸出文件進行加工,上面的作用是將emp導出並且壓縮。
 
轉載自:
原文:https://blog.csdn.net/chuan_day/article/details/44099859 
原文:https://blog.csdn.net/lijingjingchn/article/details/83055550


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM