pgloader將各種來源的數據加載到PostgreSQL中。它可以轉換動態讀取的數據,並在加載前后提交原始SQL。
它使用COPY PostgreSQL協議將數據流式傳輸到服務器,並通過填充一對reject.dat和reject.log文件來管理錯誤
pgloader 的操作,可以使用命令行參數,或者通過讀取文件中定義的dsl
格式:
pgloader commands.load
或者使用參數:
pgloader SOURCE TARGET
參數說明
pgloader參數可以根據需要加載文件,也可以是特定輸入文件的幾個連接字符串。
源連接字符串
格式:
format:///absolute/path/to/file.ext
format://./relative/path/to/file.ext
format
可以是 csv, fixed, copy, dbf, db3 或者ixf
db://user:pass@host:port/dbname
db
可以是sqlite、mysql、mssql
當使用基於文件的源格式時,pgloader還支持從http位置本地獲取文件並在需要時解壓縮存檔。
在這種情況下,必須使用-type選項指定文件的預期格式
另請注意,某些文件格式需要描述一些實現細節,例如要讀取的列和分隔符以及從csv加載時的引用。
對於更復雜的加載方案,您需要使用本文檔后面描述的語法編寫完整的fledge加載命令。
目標連接字符串
對於目標字符串會在后邊詳細介紹
工具選項
查詢選項
-h,-help 顯示命令用法摘要並退出。
-V,-version 顯示pgloader版本字符串並退出。
-E,-list-encodings 列出此版本的pgloader中的已知編碼。
-U,-upgrade-config 使用pgloader版本2.x中使用的INI語法將命令行中的給定文件解析為pgloader.conf文件 ,並在標准輸出上輸出pgloader的新命令語法。
常規選項
這些選項用於在加載數據時調整pgloader行為
-v,-verbose 顯示比較可用信息
-q,-quiet 退出
-d,-debug 顯示調試級別信息消息。
-D,-root-dir 設置根工作目錄(默認為“/ tmp / pgloader”)。
-L,-logfile 設置pgloader日志文件(默認為“/tmp/pgloader/pgloader.log”)。
–log-min-messages 日志消息進入日志文件所需的最低級別的詳細程度。關鍵,日志,錯誤,警告,通知,信息或調試之一。
–client-min-messages 日志消息進入控制台所需的最低級別詳細程度。關鍵,日志,錯誤,警告,通知,信息或調試之一。
-S,-summary 用於復制摘要輸出的文件名。相對時,文件名擴展為* root-dir *。
文件名的格式默認為人類可讀。通過指定擴展名為resp的文件名,可以使用機器友好格式(如CSV, COPY(PostgreSQL自帶的COPY格式)或JSON)輸出。的.csv,.copy或以.json。
-l <file>, - load-lisp-file <file>
在讀取命令之前指定lisp <file>進行編譯並加載到pgloader映像中,允許定義額外的轉換函數。這些函數應該在pgloader.transforms包中定義。此選項可在命令行中出現多次。
-dry-run
允許測試.load文件而不實際嘗試加載任何數據。調試它直到它沒問題是有用的,特別是修復連接字符串。
-on-error-stop
改變pgloader行為:而不是試圖聰明地處理錯誤處理並繼續加載好的數據,分離掉壞的數據,只要PostgreSQL拒絕發送給它的任何東西就停止。用於調試數據處理,轉換功能和特定類型轉換。
-self-upgrade <directory>
指定一個<directory>在哪里找到pgloader源,這樣它所做的第一件事就是動態加載(並編譯成機器代碼)另一個版本的自身,通常是一個像最新的git checkout這樣的新版本。
–no-ssl-cert-verification
使用OpenSSL選項接受本地頒發的服務器端證書,避免以下錯誤消息:
SSL verify error: 20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
解決SSL問題的正確方法是使用可信證書。有時雖然在修復信任證書鏈的同時使用pgloader設置取得進展是有用的,但也許是由另一個團隊。這個選項很有用。
命令行操作選項
參數僅在,使用命令行運行數據加載操作時生效
–with "option"
允許從命令行設置選項。您可以根據需要多次使用該選項。option參數必須遵循SOURCE規范 的源類型的WITH子句
–set "guc_name='value'"
允許從命令行設置PostgreSQL配置。請注意,選項解析與從SET命令子句中使用時相同,特別是必須使用單引號將guc值括起來
–field "…"
允許設置源字段定義。字段按命令行中給出的順序累積。可以 在源文件中的每個字段使用-field選項,或者用逗號分隔字段定義,就像在HAVING FIELDS子句中那樣
–cast "…"
允許設置特定的強制轉換規則以加載數據。
–type csv|fixed|db3|ixf|sqlite|mysql|mssql
如果SOURCE解析不滿意,則允許強制源類型。
–encoding <encoding>
設置源文件的編碼以從中加載數據。
–before <filename>
解析SQL查詢的給定文件名,並在從源加載數據之前對目標數據庫運行它們。查詢由pgloader本身解析:它們需要以分號(;)結束,文件可能包含i或ir命令以包含另一個文件
–after <filename>
解析SQL查詢的給定文件名,並在從源加載數據后對目標數據庫運行它們。查詢的解析方式與-before選項相同
批量以及重試操作
要將數據加載到PostgreSQL,pgloader使用COPY流協議。雖然這是加載數據的更快方式,但COPY有一個重要的缺點:
一旦PostgreSQL發送任何數據發送到它的錯誤,無論出現什么問題,PostgreSQL都會拒絕整個數據集
為了解決這個問題,pgloader將數據分成每批 25000行,這樣當出現問題時,它只影響那么多行數據。當COPY流發生時,
每個批處理都保存在內存中,以便能夠在某些情況發生時處理錯誤
當PostgreSQL拒絕整個批處理時,pgloader會記錄錯誤消息,然后通過以較小批量重試批處理行來將壞行與已接受的行隔離。
為此,pgloader 從失敗的COPY中解析CONTEXT錯誤消息,因為消息包含批處理中發現錯誤的行號,格式如下:
CONTEXT: COPY errors, line 3, column b: "2006-13-11"
使用該信息,pgloader將在錯誤之前重新加載批處理中的所有行,將錯誤的行記錄為拒絕,然后嘗試在單次嘗試中加載剩余的批次,
這可能包含或可能不包含其他錯誤數據。
在包含被拒絕行的加載結束時,您將在root-dir位置找到兩個文件,這兩個文件位於與安裝程序的目標數據庫相同的目錄下。文件名是目標表,
對於被拒絕的數據,它們的擴展名為.dat;對於包含有關被拒絕數據的完整PostgreSQL客戶端日志的文件,它們的擴展名為.log。
可以使用以下WITH選項來控制pgloader批處理行為:
- on error stop, on error resume next
此選項控制pgloader是否正在使用構建批量數據。批處理實現允許pgloader通過發送PostgreSQL再次接受的數據並通過保留PostgreSQL拒絕
的數據來恢復錯誤。要啟用重試數據並加載好的部件,請使用下一個錯誤恢復選項,這是基於文件的數據加載(例如CSV,IXF或DBF)的默認選項 。
從其他RDMBS技術遷移時,最好具有可重現的加載過程。在這種情況下,可以在錯誤停止時使用並修復轉換規則,數據轉換功能或輸入數據,
直到遷移完成。這就是on error stop, on error resume next
是SQLite,MySQL和MS SQL源類型的默認值。
關於性能的注意事項
它使用的基本架構是舊的Unix管道模型,其中一個線程負責加載數據(讀取CSV文件,查詢MySQL等)並將預處理的數據填充到隊列中。
另一個線程從隊列中提取,對輸入數據應用更多轉換,並使用COPY協議將最終結果傳輸到PostgreSQL。
關於並行處理
pgloader使用幾個並發任務來處理正在加載的數據:
- 讀取器任務讀入數據並將其推送到隊列中,
- 最后一個寫入任務從隊列中提取並將raw格式化為批處理的PostgreSQL COPY格式(這樣就可以重新嘗試失敗的批處理,而無需再次從源讀取數據),
然后使用COPY將數據發送到PostgreSQL協議。
我們允許worker
同時在單個表的上下文中同時處於活動狀態。單個工作單元由幾種worker
組成: - 一個
reader
從源頭獲取原始數據, - N個
worker
准備並將數據發送到PostgreSQL。
這里的N設置為並發參數:CONCURRENCY為2,我們啟動(+ 1 2)= 3個並發任務,並發為4我們啟動(+ 1 4)= 5個並發任務,其中只有worker
可以同時活躍。
默認值為workers = 4,從數據庫源加載時concurrency = 1,worker = 8,從其他東西(當前是文件)加載時concurrency = 2。這些默認值是任意的
由於pgloader啟動的CREATE INDEX線程只等到PostgreSQL完成實際工作,因此這些線程不計入並發級別
默認情況下,在源架構中找到與每個表的最大索引數一樣多的CREATE INDEX線程。可以將max parallel create index WITH選項設置為另一個數字,
以防其中有太多要創建的數字。
pgloader 命令語法
pgloader實現了一種特定於域的語言,允許設置復雜的數據加載腳本,處理計算列和輸入數據的動態清理。對於更復雜的數據加載方案,
需要了解DSL的語法
語法規則:
LOAD <source-type>
FROM <source-url>
[ HAVING FIELDS <source-level-options> ]
INTO <postgresql-url>
[ TARGET TABLE [ "<schema>" ]."<table name>" ]
[ TARGET COLUMNS <columns-and-options> ]
[ WITH <load-options> ]
[ SET <postgresql-settings> ]
[ BEFORE LOAD [ DO <sql statements> | EXECUTE <sql file> ]
[ AFTER LOAD [ DO <sql statements> | EXECUTE <sql file> ]
;
主要子句是每個命令實現的LOAD,FROM,INTO和WITH子句。然后,某些命令會實現SET命令或某些特定子句,例如CAST子句
使用Mustache
pgloader 實現了Mustache 模版引擎,可以方便的進行動態配置
pgloader 具有一個特性就是可以獲取os 系統的環境變量,參考如下:
export DBPATH=sqlite/sqlite.db
pgloader ./test/sqlite-env.load
模版使用環境變量
load database
from '{{DBPATH}}'
into postgresql:///pgloader;
通用子句
- from
該FROM子句指定在何處讀取從數據 - into
PostgreSQL連接URI必須包含要將數據加載到的目標表的名稱。該表必須已在PostgreSQL中創建,並且名稱可能是模式限定的。
然后INTO選項還支持可選的逗號分隔的目標列列表,它們是輸入字段的名稱或目標列名稱的空格分隔列表,其PostgreSQL數據
類型和 USING表達式
在使用表達可以是任何有效的Common Lisp形式,並且將與當前包設置要被讀取pgloader.transforms,這樣就可以使用在包中定義的功能,
例如與動態加載功能-load命令行參數。
每個USING表達式在運行時編譯為本機代碼。
此功能允許pgloader使用該投影的自定義代碼將CSV文件中的任意數量的字段加載到數據庫中可能不同數量的列中 - with
應用於命令的一組選項,使用以下任一的全局語法:
格式
key = value
use option
do not use option
所有數據源特定命令都支持以下選項:
on error stop, on error resume next
batch rows = R
batch size = … MB
prefetch rows = …
此外,還提供以下設置:
workers = W
concurrency = C
max parallel create index = I
- set
此子句允許指定要為pgloader打開的所有會話設置的會話參數。它需要一個參數名稱列表,等號,然后單引號值作為逗號分隔列表。
pgloader不驗證參數的名稱和值,它們按原樣給予PostgreSQL。 - BEFORE LOAD DO
在從CSV文件加載數據之前,您可以對數據庫運行SQL查詢。最常見的SQL查詢是CREATE TABLE IF NOT EXISTS,以便可以加載數據。
每個命令必須以美元引用:它必須以雙美元符號$$開頭和結尾。然后用美元引用的查詢以逗號分隔。在最后一次SQL查詢后,不應該有
額外的標點符號。 - BEFORE LOAD EXECUTE
與BEFORE LOAD DO子句中的行為相同。允許您從SQL文件中讀取SQL查詢。實現對PostgreSQL美元引用的支持以及i和ir包括psql批
處理模式中的特性(它們是相同的東西) - AFTER LOAD DO
與BEFORE LOAD DO格式相同,在加載完成后,將執行該部分中找到的美元引用查詢。此處是創建索引和約束或重新啟用觸發器的最佳時機。 - AFTER LOAD EXECUTE
與AFTER LOAD DO子句中的行為相同。允許您從SQL文件中讀取SQL查詢。實現對PostgreSQL美元引用的支持以及i和ir包括psql批處理模式
中的特性(它們是相同的東西) - AFTER CREATE SCHEMA DO
與BEFORE LOAD DO相同的格式,在該部分中找到的美元引用的查詢在pgloader創建模式之后,以及在加載數據之前執行。此處是ALTER
TABLE的最佳時機,或者在pgloader的基礎上做一些自定義實現,比如分區與BEFORE LOAD DO相同的格式,在該部分中找到的美元引用的
查詢在pgloader創建模式之后,以及在加載數據之前執行。此處是ALTER TABLE的最佳時機,或者在pgloader的基礎上做一些自定義實現,
比如分區 - AFTER CREATE SCHEMA EXECUTE
與AFTER CREATE SCHEMA DO子句中的行為相同。允許您從SQL文件中讀取SQL查詢。實現對PostgreSQL美元引用的支持以及i和ir包括
psql批處理模式中的特性(它們是相同的東西)。 - 連接字符串
參考格式:
postgresql://[user[:password]@][netloc][:port][/dbname][?option=value&...]
- 注釋
可以包含以下格式的注釋
以 – 定界符開始與當前行的結尾結束的評論,
定界符 /* and */ 分別開始和結束注釋,可以在命令中間找到或跨越幾行
- 批處理操作選項
支持以下配置
batch rows
將數值作為參數,用作批處理中允許的最大行數。默認值為25 000,可以更改為嘗試具有更好的性能特征或控制pgloader內存使用情況;
batch size
將內存單元作為參數,例如20 MB,即其默認值。可接受的乘數是kB,MB,GB,TB和PB。這種情況很重要,以免混淆位與字節,我們這里只討論字節。
prefetch rows
將數值作為參數,默認為100000。這是允許pgloader在每個讀者線程的內存中讀取的行數。請參閱workers設置,了解允許同時運行多少個讀取器線程。