2.3 導出
把實體表數(shù)據(jù)導出為文本文件同樣可以使用gpfdist服務下的外部表和copy命令來實現(xiàn)。Copy導出與導入一樣,也是逐個postgresql進行的,在效率上是都低于gpfdist。因為gpfdist是同時從所有的segment向目標文件寫數(shù)據(jù),是真正的并行工具。不知道為什么EMC公司一直沒有將postgresql的COPY,這個應用這么成熟的工具改造升級為并行工具(COPY可以通過非GP的方法來做并行導入導出,但是較為麻煩,且不好監(jiān)控,暫且不表,可能也很難再表……)。
Gpfdist導出是通過創(chuàng)建可寫外部表來實現(xiàn)的。對比只能做select操作的可讀外部表,可寫外部表也只能做insert操作。
2.3.1 使用Gpfdist下的外部表導出
使用gpfdist當然要首先保證gpfdist 服務是在運行著的。
etl@smdw:~> ps -ef|grep gpfdist
etl 8404 7503 0 11:17 pts/3 00:00:00 grep gpfdist
etl 22913 1 1 Jul07 pts/3 01:12:26 gpfdist -d /backup/etl_data -p 9091 -l /home/etl/gpfdist_9091.log
etltest 26466 1 0 Jul08 pts/3 00:00:44 gpfdist -d /backup/etl_data -p 9092 -l /home/etltest/gpfdist_9092.log
etl@smdw:~>
要保證啟動gpfdist的用戶etl對目錄/backup/etl_data有寫的權限。
首先創(chuàng)建可寫外部表:
create writable external table stage.tf_f_user_w_external (字段1,字段2,字段3……)
LOCATION ('gpfdist://smdw-1:9091/output/DATAFILE20120718.txt') ……
然后寫insert語句:
Insert into stage.tf_f_user_w_external(字段1,字段2,字段3……)
Select字段1,字段2,字段3…… from stage.tf_f_user;
這個select 部分可以隨便寫,只要字段與外部表的字段能一致對應就可以了,例如:
Insert into stage.tf_f_user_w_external(字段1,字段2,字段3……)
Select a.字段1,b.字段2,c.字段3…… from stage.tf_f_user a inner join stage.tf_f_xxx b on a.user_id=b.user_id;
然后執(zhí)行這個insert語句就可以把實體表的內(nèi)容寫到可寫外部表所指定的文本文件中了(文本文件可以事先不存在,如果存在則對外部表的insert操作會向文本文件里追加數(shù)據(jù))。
OK,這樣我們就實現(xiàn)了以生成文本文件為目的的導出了。
2.3.2 使用Copy導出
簡潔!!
psql -d bi -h xx -p dd -c "\copy (select * from ods.ods_d_mytest) to /home/gpadmin/_hcb/my_data.txt"
-d是數(shù)據(jù)庫名;-h是主master名或ip;-p是數(shù)據(jù)庫端口號;-c是執(zhí)行命令。
這個跟postgresql原本的copy導出是一模一樣的,不到五分鐘你就能使用起來。
可以對select 語句進行加工變換以實現(xiàn)多樣的導出需求,
也可以在編程的過程中各種對copy批量操作。
2.3.3 使用令人心碎的pg_dump/gp_dump導出(備份)
Pg_dump是逐個節(jié)點來串行對外寫文件的。
Gp_dump是所有節(jié)點同時并行向外寫文件的。
一看就知道pg_dump沒什么可以說的了,但是還是要提一下,pg_dump是本身postgresql的工具,有一個比較吸引人的優(yōu)點,它可以直接導出gz壓縮的文件,可惜到了EMC這里卻沒什么發(fā)展。
Gp_dump比pg_dump強大,因為它是一個真正的并行工具。
使用gp_dump,首先一定要注意:禁止做全庫備份!
因為我們的數(shù)據(jù)量絕對是海量(GP就是為了海量而生),全庫備份即沒有必要,而且可能也幾乎不能實現(xiàn)。
同時GP系統(tǒng)本身有鏡像機制,每行數(shù)據(jù)都是雙份存儲的,所以也沒有必要做全庫備份。很奇怪,EMC為什么沒有禁止掉他的全庫備份功能。
Gp_dump可以用來把一個表的數(shù)據(jù)導出為文本文件,并且可以直接生成為壓縮文件(這一點非常好)。
但是,導出表數(shù)據(jù)為文本文件不是純的數(shù)據(jù)文件,就是生成的文本文件里面會包含一堆什么GP萬歲之類的話,沒有找到什么參數(shù)去掉,不利于導入到別的類型的數(shù)據(jù)庫里,很是討厭。例如:
大家執(zhí)行gp_dump -t 'ods.ods_xmx' -a bi -U gpadmin,把bi庫里面的表ods.ods_xmx導出。
完成之后,查看gp_dump_0_3_20120318164648這樣格式名稱的文件會發(fā)現(xiàn)包含了以下廢話:
-- Greenplum Database database dump
另外還能發(fā)現(xiàn)gp_dump實際上就是一個封裝了copy的東西,通過多 個copy并行來實現(xiàn)導出。