天天看點

《Greenplum5.0 最佳實踐》 遷移資料使用Gptransfer

使用 Gptransfer 指令遷移一個 Greenplum 資料庫叢集中的資料到另一台叢集(metradata, data)

gptransfer 可以遷移資料庫中的全部資料或者部分選擇的表到另外一台 Greenplum 中。 源資料庫和目的資料庫可以在同一個叢集中,也可以在不同的叢集中。 gptransfer 所有的段資料庫是并行的移動資料的,使用 gpfdist 可以獲得更高的資料移動效率。

gptransfer 處理這資料的啟動和執行。 參與的叢集必須存在。同時確定叢集間的通路時可以用過 SSH 通路實作的。網絡互通。

gptranfer 參數包括處理一個資料庫和多個資料庫參數, 處理一張表和多張表參數。 全部的資料集遷移包括 schema, table date, indexes, views, roles, user-defined fuctions , resource queues. 參數配置檔案 postgres.conf, ph_hba.conf, 必須使用超級使用者在源與目的資料庫之間執行操作。使用外部指令 gppkg 安裝 gptransfer. 就像安裝 MADLIB 一樣。

gptransfer 是通過使用對外部表的讀寫操作試下你的,底層使用的工具是greenplum提供的 gpfdist 實作并行加載資料, 管道用來從源資料到目的資料端傳輸資料。 從源資料中選擇需要向目的資料段可寫外部表的資料,執行插入操作。在目的段資料庫中選擇表和資料庫,從外部表将資料導入到本地。這可讀可寫的外部表是用過命名管道去通路源資料庫的, 每一個命名管道都有一個 gpfdist 程序存在,實作從源資料到目的資料庫。

gptransfer 通過批處理的方式編排資料, 每移動一張表, 他都要經曆如下的任務:

在源資料庫中建立可寫的外部表

在目的資料庫中建立可讀的外部表

在源資料叢集中的每一個段資料庫上,建立一個命名管道和 gptranfer 程序。

在源資料庫段執行 SELECT INTO 語句,将源資料庫中的資料加載到可寫的外部表中

在目的資料庫中執行 SELECT INTO 語句, 從可讀的外部表中加載資料到資料庫中的表中

選擇有效的 MD5 參數,用來确定導入的資料在源資料庫與目的資料庫之間沒有任何問題

清空外部表, 命名管道, gpfdist 程序

gptranfer 隻适合Greenplum資料庫叢集, HAWQ 并不支援

Greenplum 的版本必須是在 4.2 或 以上

源與目的的資料庫叢集必須要有 gptransfer

目的資料庫叢集中的段資料庫數量必須大于等于源資料庫中段的數量。如果滿足這個條件,資料遷移會非常的慢

叢集間的節點必須是可以連通的

可以使用 ssh 連接配接各個及诶到哪。 我們可以使用 gpssh_exkeys 指令來交換秘鑰,在叢集之間

同時運作多個 gptransfer , 可以更快的完成資料遷移。原理就是啟動更多的 gpfdist 程序,這種模式叫做快模式

當目的資料庫叢集中的段資料庫數量大于源資料庫叢集段資料庫很多時,可以這個幹。

當目的資料庫叢集中的段數庫數量小于源資料庫叢集段資料庫時, 啟動的 gptransfer 數量就會很少, 同時代表着 gpfdist 程序數量的減少。這就意味着将會花費着更多的時間。就是慢模式

gpftransfer 的參數用來控制執行并行的讀,這裡有兩個執行參數, --batch-size, --sub-batch-size; 其中 --batch-size 參數用來确定在一個批進行中處理多少表。 預設值是2, 這就意味着在任何程序中一次處理兩張表。最小的批處理的值是1, 最大的值是10.

--sub-batch-size 用來确定在轉移資料時,子程序的最大并行數量。預設值是25, 最大值是50.批處理的值和子程序的值的乘積就是資料遷移的并行值。如果都按着預設的值設定, 那麼 gpftranser 就是50個任務并行。 每一個線程都是 Python 和 記憶體,是以,如果值設定的很大就會導緻記憶體溢出的問題。是以這個值,我們要根據自己的實際環境來處理。

Greenplum 叢集中的各個節點間實作無密通信, 實作 ssh 通信。gpftranser 要求源與目的資料庫叢集間都要裝有該工具。

首先,確定網絡環境正常。然後确定有一個 host file 用來存儲全部需要使用到無密碼傳輸的節點名,最後使用 gpssh-exkeys 交換秘鑰。

這個映射檔案 host file 裡面包含了源叢集中的全部節點名,它用來實作叢集間的節點通信。 在Gptransfer 中使用的參數是

--source-map-file=host_map_file 參數。 這個參數是使用 gptransfer 在叢集間copy資料使用的

該檔案使用IP位址而不是主機名來避免叢集之間名稱解析的問題。

gptransfer 僅僅可以移動使用者資料庫。對于資料庫 poostgresql, template0, template1 資料庫不能被移動。超級使用者手動移動配置檔案和使用 gppkg 安裝外部應用,在目的資料中。

目的資料庫叢集最好有比源資料庫叢集更多的段資料庫,不然移動資料會非常慢。

對于移動小表或者空表時, gptransfer 也會很慢, 這是為什麼呢?主要是因為,時間都花費在建議讀寫外部表,程序間的連接配接等上面。

當使用參數 --full 時, gptransfer 會拷貝全部的 tables, views, indexes, roles, user-defined function, resource queneue 從源資料庫到目的資料庫。将要從源資料庫移動的資料庫必須不存在在目的資料庫叢集中。如果 gptransfer 報出如下錯誤時

<code></code>

去獨立的拷貝某一個表,需要強調使用的參數是 -t, 如果隻想拷貝一個表的一部分資料使用的是 -f 參數。 當拷貝表時, 目的資料庫必須存在。拷貝表使用如下格式 database.schema.table; 這個表的 索引 ,表結構, 表中的資料都會被拷貝。

如果目的資料庫已經存在該表, 在嘗試遷移源資料庫的表将會遇到如下錯誤

想要跳過這個錯誤使用如下參數

--skip-existing, --truncate 或者 --drop

接下來的表格用來顯示全拷貝模式與表拷貝模式

object Full Mode Table Mode

Data Yes Yes

Indexes Yes Yes

Roles Yes No

Functions Yes No

Resource Queues Yes No

postgres.conf No No

pg_hba.conf No No

gppkg No No

使用如下參數在全拷貝模式下,隻會拷貝表結構,不會拷貝資料

gptransfer --full --schema-only -d

在接下來使用表模式的時候,需要注意可能要用到表模式的參數 --truncate OR --drop 參數

使用參數 -x 可以給表加鎖。直到驗證和資料拷貝完成,才會釋放排他鎖。

預設情況下, gptransfer 并不會去驗證遷移完成的資料。 我們可以使用參數 --validate=type 選項來設定驗證。

type 的類型可以是

count - 用來比較源資料與目的資料的記錄數量是否一緻

md5 - 對源資料的表和目的資料的表排序, 然後一行一行比較。檢查不同

在使用 gptransfer 遷移資料的時候,要確定加上參數 -x 來確定所有的對源表有排他鎖。因為在遷移資料時,表中的記錄發生該表将會驗證失敗。

遷移失敗并不會一起 gptransfer 任務中止。 當一個遷移任務失敗的時候。 gptransfer 就會将錯誤資訊加載到失敗的gptransfer檔案中。 在 gptransfer 會話中, 它會提供到底哪裡出錯了, 如下例子

正如上面提示的警告資訊, 我們可以使用 -f 參數去重新的請求檔案格式

對于大資料量的表的遷移使用 gptransfer 是非常好的選擇, 對于空表和小資料量的表而言, 遷移的準備工作和後期的清理公共,會顯示的資料遷移的非常的慢。那麼最好的做法就是使用 gptransfer 去遷移大資料量的表,對于小資料量的表使用其他的方法。

在開始遷移資料時, 在目的資料庫叢集備份源資料的schema. 不要去使用 gptransfer 中的參數 --full -schema-only , 可以使用如下指令來完成上述工作

将要遷移的大表分割為大類和小類, 使用自己制定的标準。舉個例子, 我們可以将大表劃分為多個小表, 每一個表含有的記錄熟練是 1千萬條記錄或者是每個表有1GB大小

對于遷移小表資料, 建議使用 COPY 指令。

這樣可以循環使用之前寫的腳本檔案。

使用 gptransfer 用來批量遷移資料檔案

在所有的表都遷移完成後, 執行如下的操作

"&gt;https://gpdb.docs.pivotal.io/500/best_practices/gptransfer.html&gt;