天天看點

PostgreSQL 的表傳輸功能

postgresql , transfer table , 表傳輸

表傳輸的功能很有意思,比如一些企業會有中心資料庫,邊緣資料庫。邊緣資料庫的資料需要周期性的導入到中心庫進行彙總,例如每個工廠的日流水資料,每天導入到總部的中心資料庫。

從邊緣庫導入到中心庫,大家可能會想到使用etl工具,或者是資料訂閱(同步)的方式,但是大家有沒有想過,這些方式都需要資料重新來一遍insert或者copy。

insert, copy是資料庫的标準寫入接口,沒什麼不好的,隻不過當邊緣資料庫很多,資料量很大時,寫入可能成為瓶頸(雖然pg已經是堆表,寫入通常可以達到單機幾百萬行/s的速度)。如果有索引的話,更慢。

那麼有沒有效率更高的資料傳輸方法呢?

表傳輸應運而生,表傳輸可以了解為資料檔案的拷貝,沒有了build index,forming tuple,alloc extend的消耗,速度大幅提升。

pg_transfer插件是postgrespro 企業版本的一個插件,可以用來實作表傳輸。

因為表傳輸是拷貝檔案的方式傳輸資料,是以必須要求源、目标資料庫具有實體檔案相容性。例如

1、資料庫版本一緻。

2、資料庫所在作業系統架構一緻(cpu架構、作業系統架構)。

3、資料庫某些涉及實體格式的編譯參數一緻(塊大小、是否開啟checksum、資料檔案段大小(涉及到檔案尋址))。

源和目标都必須安裝pg_transfer插件

将表置為隻讀

收集統計資訊

擷取目标庫被遷移表的toast relid,備用。

将表的資料刷盤,確定shared buffer中沒有表的髒頁。

同時需要輸入前一步獲得的目标庫生成的toast relid。

導出表、索引、toast的資料檔案

将資料檔案導入目标庫,并挂接filenode。

如果源和目标在同一個檔案系統中,那麼遷移過程中pg_dump或pg_restore 二選一,必須使用 --copy-mode-transfer 開關 。

如果目标庫有slave,并且希望将表傳輸的資料通過wal同步到目标庫的slave,那麼使用pg_restore時,必須加上--generate-wa選項,以産生wal。

<a href="https://postgrespro.com/docs/postgresproee/9.6/pgtransfer.html">https://postgrespro.com/docs/postgresproee/9.6/pgtransfer.html</a>