支持的源和目標數據庫
支持的源和目標數據庫如下表:
| 源數據庫 | 目標數據庫 |
|---|---|
| RDS for PostgreSQL 自建PostgreSQL?9.4/9.5/9.6/10/11/12/13/14/15/16 |
RDS for PostgreSQL |
說明
源庫為本地自建PostgreSQL數據庫時,支持9.4/9.5/9.6/10/11/12/13/14/15/16版本。
源數據庫版本不得高于目標數據庫版本。
支持的同步對象及SQL
同步對象
- 結構同步支持的對象:
- 模式、表、索引、約束(外鍵、唯一、排他)、視圖、物化視圖、序列、存儲過程、函數、規則、觸發器、用戶自定義類型、域、賬號和權限。
- 支持的字段類型:
- 數字類型、貨幣類型、字符類型、二進制數據類型、日期/時間類型、布爾類型、枚舉類型、幾何類型、網絡地址類型、位串類型、文本搜索類型、UUID類型、XML類型、JSON類型、復合類型、范圍類型。
注意事項
-
每次至多同步一個庫(database),同步多個庫需要創建多個DTS任務。
-
模式:不支持pg_toast,pg_temp_1,pg_toast_temp_1,pg_catalog,information_schema等系統模式的同步。
-
表:不支持臨時表的同步,表的索引、約束會一起同步,表的觸發器、規則在全量完成之后同步。
-
序列:待同步的表中有引用序列時,必須同時同步相應的序列。
-
映射規則:
- 不包含增量時,可以對庫、表、列名進行映射,若對表的列進行映射,則表中涉及到該列的約束將不會同步。
- 包含增量時,不支持對庫、表、列名映射。
- 視圖、存儲過程、函數、域、自定義類型等對象依賴的表不支持做表名映射,否則視圖、存儲過程、函數將會失效。
-
同步對象中如果存在包含longtext、longblob類型大字段的表,建議創建大規格及以上規格的DTS實例進行同步,否則可能會導致 OOM。
-
當進行賬號權限遷移時:
- 在目標端創建賬號后,會將當前數據庫(如postgres)的所有權限授權給該賬號。
- 將遷移到目標端的schema下的所有可用權限授予給該schema的所屬賬號。
- 將原表的所屬賬號遷移到目標表。
- 暫不支持源庫賬號對應密碼的遷移。
增量數據同步支持的SQL操作
-
DML
INSERT、UPDATE、DELETE。
-
DDL
增量同步的DDL操作僅支持CREATE TABLE、ALTER TABLE、DROP TABLE、CREATE SEQUENCE、ALTER SEQUENCE、DROP SEQUENCE、CREATE VIEW、ALTER VIEW、DROP VIEW、CREATE INDEX、ALTER INDEX、DROP INDEX。
注意
暫不支持 CREATE TABLE 表名 AS SELECT 語句。
RENAME表名之后,向更改名稱后的表插入新的數據時,DTS不會同步新的數據到目標庫,因可能會導致任務中斷異常或數據不一致。
暫不支持以注釋開頭的DDL語句的同步。
數據庫賬號及權限
數據庫賬號及權限如下表:
數據庫 接入類型 所需權限 參考賦權語句 源庫 云實例 高權限賬號 云實例請參考創建賬號 自建實例
模式的USAGE權限。
待遷移其他對象的SELECT權限。
待遷移表的SELECT、REFERENCES、TRIGGER權限。
待遷移對象的SELECT權限包含增量時,需具備SUPERUSER權限。
授予user_name用戶schema_name模式的usage權限:
GRANT USAGE ON SCHEMA schema_name TO user_name;
授予user_name用戶object_name對象的select權限:
GRANT SELECT ON object_name TO user_name;授予user_name用戶超級權限:
ALTER USER user_name WITH SUPERUSER;目標庫 云實例 高權限賬號 云實例請參考創建賬號 自建實例
schema的創建權限。
授予用戶user_name在數據庫database_name下的schema創建權限:
GRANT CREATE ON DATABASE database_name TO user_name;
準備工作
源庫為PostgreSQL自建庫的情況
針對源庫、目標庫是自建庫的情況,需要進行如下準備工作:
-
登錄自建PostgreSQL所屬的服務器。
-
修改配置文件postgresql.conf,將配置文件中的wal_level設置為logical。如下圖:

-
將DTS的IP地址加入至自建PostgreSQL的配置文件pg_hba.conf中。如下圖:

如果您已將信任地址配置為0.0.0.0/0,可跳過本步驟。
-
邏輯解碼插件目前支持decoderbufs和pgoutput;如果任務包含增量遷移且邏輯解碼器選擇使用Decoderbufs時,需安裝PostgreSQL的邏輯解碼器輸出插件Decoderbufs,建議安裝v2.1.1.Final以上版本,低版本可能會導致PostgreSQL數據庫出現coredump,詳細的步驟可參考如下內容或PostgreSQL官網文檔。
-
請自行前往github倉庫獲取Decoderbufs插件。
-
進行插件的配置。
-
首先,進行插件的編譯。
export PATH=/usr/lib/postgresql/9.6/bin:$PATH make make install -
其次,在postgresql.conf中配置邏輯復制。
# MODULES shared_preload_libraries = 'decoderbufs' # REPLICATION wal_level = logical # minimal, archive, hot_standby, or logical (change requires restart) max_wal_senders = 8 # max number of walsender processes (change requires restart) wal_keep_segments = 4 # in logfile segments, 16MB each; 0 disables #wal_sender_timeout = 60s # in milliseconds; 0 disables max_replication_slots = 4 # max number of replication slots (change requires restart) -
然后,重啟PostgreSQL。
-
最后,驗證配置是否生效。
#創建邏輯復制,使用邏輯復制插件decoderbufs select * from pg_create_logical_replication_slot('decoderbufs_demo', 'decoderbufs'); #對相關表進行數據操作 #使用decoderbufs調試模式 SELECT data FROM pg_logical_slot_peek_changes('decoderbufs_demo', NULL, NULL, 'debug-mode', '1'); #使用decoderbufs獲取wal變更,更新wal位置 SELECT data FROM pg_logical_slot_get_changes('decoderbufs_demo', NULL, NULL, 'debug-mode', '1'); #查看邏輯復制的wal位置 SELECT * FROM pg_replication_slots WHERE slot_type = 'logical'; #刪除邏輯復制 select pg_drop_replication_slot("decoderbufs_demo");
-
-
數據類型映射說明。
PostgreSQL類型 Decoderbuf字段 BOOLOID datum_boolean INT2OID datum_int32 INT4OID datum_int32 INT8OID datum_int64 OIDOID datum_int64 FLOAT4OID datum_float FLOAT8OID datum_double NUMERICOID datum_double CHAROID datum_string VARCHAROID datum_string BPCHAROID datum_string TEXTOID datum_string JSONOID datum_string XMLOID datum_string UUIDOID datum_string TIMESTAMPOID datum_string TIMESTAMPTZOID datum_string BYTEAOID datum_bytes POINTOID datum_point PostGIS geometry datum_point PostGIS geography datum_point
-
源庫為天翼云及其他云PostgreSQL的情況
源庫為天翼云及其他云PostgreSQL、任務包含增量遷移,且邏輯解碼器選擇為Decoderbufs,源庫需開啟邏輯解碼器輸出插件Decoderbufs。
- 天翼云在開通PostgreSQL實例時已預置開啟Decoderbufs插件,當源庫為天翼云PostgreSQL時,請你參照天翼云關系數據庫PostgreSQL版-管理插件相關指引查看確認Decoderbufs插件的開啟情況,已開啟則無需進行操作,未開啟則參照指引進行Decoderbufs插件的安裝。
- 當源庫為其他云PostgreSQL時,需要查看源庫對應版本是否支持并已開啟Decoderbufs插件。如源庫版本不支持Decoderbufs插件則無法進行其他云PostgreSQL到天翼云PostgreSQL的增量同步;如源庫版本支持Decoderbufs插件但未開啟則按照文檔啟用插件;如已開啟則無需進行操作。具體請參考其他云PostgreSQL的相關指引,例如:
- 華為云的相關指引。
- 阿里云的相關指引。
操作需知
DTS同步過程一般包含四個階段:預檢查階段、結構同步階段、全量階段、增量階段。為了確保數據同步各個階段的平順,在創建同步任務前,請務必閱讀以下使用須知。
任務開始前
源庫要求
- 源數據庫的分區表觸發器不可以設置為disable。
- 全量同步支持源庫備機狀態,但需要設置hot_standby_feedback為on;增量同步不支持源庫備機狀態。
- 同步對象依賴和關聯的對象也須一起同步,否則可能導致任務失敗。
- 若要做增量同步,源數據庫的“pg_hba.conf” 文件中包含如下的配置:
- host replication all 0.0.0.0/0 md5源數據庫參數wal_level必須配置為logical;
- 如果配置任務時邏輯解碼指定為Decoderbufs,源數據庫需提前安裝Decoderbufs插件;
- 源數據庫中無主鍵表的replica identity屬性必須為full;
- 源數據庫的max_replication_slots參數值必須大于當前已使用的復制槽數量;
- 源數據庫的max_wal_senders參數值必須等于或大于max_replication_slots參數值;
- 源數據庫中表的主鍵列toast屬性為main、external、extended時,其replica identity屬性必須為full。
- 同步對象依賴和關聯的對象也須一起同步,否則可能導致任務失敗。
目標庫要求
- 目標數據庫的block_size參數值必須大于或等于源庫中的對應參數值。
- 目標數據庫和源數據庫的lc_monetary參數值一致。
- 若要做增量同步,且同步對象包含外鍵、觸發器或事件觸發器,則目標數據庫的session_replication_role參數必須設置為replica,同步結束后,此參數需改為origin。
- 目標庫不可以包含與待同步對象類型相同且名稱相同的對象,包括模式、表、序列等,否則任務可能出差。系統庫、系統模式、系統表等除外。
- 選擇表級對象同步時,增量同步過程中不建議對表進行重命名操作。
- 對于全量+增量和增量任務,啟動前請確保源庫中未啟動長事務,啟動長事務會阻塞邏輯復制槽的創建,進而引發任務失敗。
- 若選擇同步DDL,須注意源庫執行DDL時,確保在目標庫上是兼容的。
- 目標數據庫關聯RDS實例必須有足夠的磁盤空間,磁盤大小建議取以下兩種中的最小值:
- 源庫待同步數據量大小的1.5倍。
- 源庫待同步數據量大小加200GB。
結構、全量過程中
- 請勿修改源庫和目標庫的端口號,請勿修改、刪除源庫和目標庫連接用戶的密碼、權限,否則可能導致任務失敗。
- 請勿在源庫執行任何DDL,否則可能導致數據不一致或任務失敗。
- 請勿在目標庫做寫入操作,否則可能導致數據不一致。
增量過程中
- 請勿修改源庫和目標庫的端口號,請勿修改、刪除源庫和目標庫連接用戶的密碼、權限,否則可能導致任務失敗。
- 請勿修改源數據庫表的主鍵或者唯一鍵(主鍵不存在時),否則可能導致增量數據不一致或任務失敗。
- 請勿修改源數據庫中表的replica identity屬性,否則可能導致增量數據不一致或任務失敗。
- 請勿在目標庫做寫入操作,否則可能導致數據不一致。
- 庫級同步時,源庫新增無主鍵表時,請務必同時將該無主鍵表的replica identity屬性設置為full,然后再寫入數據,否則可能導致數據不一致或任務失敗。
- 庫級同步時,源庫新增主鍵表時,如果主鍵列toast屬性為main、external、extended時,請務必同時將該表的replica identity屬性設置為full,然后再寫入數據,否則可能導致數據不一致或任務失敗。
- 若選擇同步DDL,須注意源庫執行DDL時,確保在目標庫上是兼容的。
數據稽核
- 建議在源庫的業務低峰期進行數據比對,防止誤報不一致數據,以及減少對源庫和DTS任務的沖擊。
- 在增量同步過程中做對比時,源庫若存在寫入,則對比結果可能不一致。
操作步驟
1、購買DTS數據同步實例。
在管理控制臺點擊“創建實例”進入訂購頁面,“實例類型”選擇“數據同步”,“目標庫實例”的“數據庫類型”選擇PostgreSQL,選擇實例,完成其他信息的填寫并完成購買。
2、進入實例配置頁面。
DTS實例購買成功后,進入【數據遷移】實例列表頁面,上一步驟購買成功的實例在實例列表中顯示狀態為“待配置”,進入實例配置頁面的操作分兩種情況:
- 當DTS實例的網絡接入類型為“公網EIP”時,請先點擊“綁定彈性IP”按鈕完成公網彈性IP的綁定,然后點擊該實例操作列的“實例配置”按鈕。
- 當DTS實例網絡接入類型為“VPC網絡”時,直接點擊該實例操作列的“實例配置”按鈕。
3、配置源庫及目標庫信息。
進入實例配置第一個步驟的【配置源庫及目標庫信息】頁面,填入源庫與目標庫的相關配置信息,包括數據庫類型、IP地址端口、數據庫賬號、數據庫密碼等信息。
完成上述信息的填寫后,點擊源數據庫和目標數據庫的“測試連接”按鈕進行數據庫連接測試,檢查數據庫能否正常連接。
4、配置同步對象及高級配置。
源庫和目標庫連通性測試成功后,點下一步按鈕,進入實例配置第二個步驟的【配置同步對象及高級配置】頁面,在“源庫對象”中選擇要同步的源庫對象,包含:庫、TABLE、VIEW、FUNCTION等,選中后點擊“>”按鈕,將待同步對象移動到“已選擇對象”中,并支持邏輯解碼插件的選擇:目前邏輯解碼插件支持“decoderbufs”和“pgoutput”,默認勾選“decoderbufs”。
根據遷移需要,勾選遷移模式、是否包含增量DDL、是否遷移數據庫賬號和權限、是否限制全量遷移速率等選項。
同步對象配置說明:
| 配置 | 說明 |
|---|---|
| 任務步驟 | 如果只需要進行全量同步,請同時勾選庫表結構同步和 全量同步?。 如果需要進行增量數據的同步,請同時勾選庫表結構同步?、全量同步和 增量同步?。 注意: 如果未選擇增量同步,為保障數據一致性,數據同步期間請勿在源實例中執行DML和DDL操作。 |
| 同步對象 | 源庫為PostgreSQL的情況下,支持表、視圖、函數、存儲過程、物化視圖、規則、觸發器,域、自定義類型等對象的同步。 在同步對象框中單擊待同步的對象,然后單擊 將其移動到已選擇對象框;已選擇對象可以通過單擊 將對象回退。選擇同步對象時,如不展開庫的詳細信息,則表示整庫同步,后續在增量任務過程中,可在源庫創建新表,其他類型暫不支持。 |
| 映射名稱更改 | 支持庫表列三級名稱映射,如需更改單個同步對象在目標實例中的庫名、表名和列名,選擇對象,然后點擊編輯按鈕。 如需批量更改同步對象在目標實例中的庫名、表名,請單擊已選擇對象方框右上方的“批量編輯”。 若同步任務僅包含結構同步和全量同步,支持列映射名稱更改,若同步任務包含增量同步,不允許列映射名稱更改。 庫表名僅支持字母、數字和下劃線,長度不超過64個字符。 注意: 整庫同步時不建議做庫表名映射。 |
| 過濾待同步數據 | 支持設置where條件過濾數據,過濾條件不允許;和--字符,如需使用引號,請使用單引號('),只有滿足where條件的數據才會同步到目標庫。 |
| 增量同步的DML | 選擇增量同步DML操作,選中同步對象,點擊“編輯”,在彈出框中選擇所需增量同步的DML操作。若在數據庫級別和表級別都指定了DML操作,則表級別的設置會覆蓋庫級別的。 |
| 增量同步的DDL | 增量任務可選擇是否同步增量DDL。 |
| 是否定時開始任務 | 可選擇任務開始的時間,默認點擊開始任務后立即啟動同步任務。 |
注意
任務中存在整庫同步的情況下,則必須勾選增量DDL同步。
非整庫同步的情況下,若選擇DDL同步,則只同步待同步對象的DDL語句。
非整庫同步的情況下,若未選擇增量DDL同步,則增量階段不會同步任何DDL語句。
5、預檢查。
完成同步對象和高級配置后,點擊“下一步預檢查”,進入實例配置第三個步驟的【預檢查】頁面。預檢查會檢查如下列表信息,并給出檢查結果,用戶可以依據檢查結果進行下一步操作。
| 檢查項 | 檢查內容 |
|---|---|
| lc_monetary參數配置一致性檢查 | 檢查源庫與目標庫的lc_monetary參數配置是否一致。 |
| pg版本檢查 | 檢查源庫和目標庫的pg版本是不是符合要求。 |
| 同名對象存在性檢查 | 檢查目標庫中是否存在和待遷移庫同名的待遷移對象。 |
| 擴展插件兼容性檢查 | 檢查源庫中安裝的擴展插件,在目標庫是否存在。 |
| 檢查hot_standby_feedback參數配置 | 全量同步源庫pg為備節點時,hot_standby_feedback參數需配置為ON。 |
| 源庫用戶權限檢查 | 檢查源庫用于DTS任務的用戶是否具有相應的權限。 |
| 源庫連通性檢查 | 檢查數據傳輸服務器能否連通源數據庫。 |
| 源數據庫的模式名表名是否合法 | 檢查源數據庫的模式名表名是否合法,名稱不可以包含+"%'<>,.字符。 |
| 源庫參數wal_level是否為logical | 勾選增量同步時,檢查源庫wal_level參數值是否為logical。 |
| 目標庫用戶權限檢查 | 檢查目標庫用于DTS任務的用戶是否具有相應的權限。 |
| 目標庫連通性檢查 | 檢查數據傳輸服務器能否連通目標數據庫。 |
| 源庫參數max_replication_slots校驗 | 勾選增量同步時,檢查源庫max_replication_slots參數值是否大于當前已使用的復制槽數量。 |
| 源庫參數max_wal_senders校驗 | 勾選增量同步時,檢查源庫max_wal_senders參數值是否大于當前已使用的復制槽數量。 |
| 邏輯解碼插件安裝校驗 | 勾選增量同步時,如果邏輯解碼器為decoderbufs,檢查源庫是否安裝邏輯解碼插件decoderbufs。 |
| 待遷移表是否存在主鍵檢查 | 勾選增量同步時,檢查待同步表中是否存在無主鍵的表。 |
| 無日志表存在性檢查 | 勾選增量同步時,檢查當前選擇的待同步對象中的表是否存在無日志表。 |
| 源庫主備狀態檢查 | 勾選增量同步時,檢查源庫是否為集群中的主庫。 |
| ddl同步元數據檢查 | 勾選ddl同步時,檢查源庫是否有ddl同步所需的元數據對象。 |
6、確認配置和啟動
預檢查通過后,點擊“下一步”進入【確認配置】頁面,用戶可確認配置的所有信息,確認無誤后,點擊右下角的【啟動任務】,開始同步任務。
將其移動到已選擇對象框;已選擇對象可以通過單擊
將對象回退。