全部產品
Search
文件中心

:一鍵建倉

更新時間:Jun 19, 2024

AnalyticDB PostgreSQL版的一鍵建倉功能支援將RDS PostgreSQL執行個體中的資料同步到AnalyticDB PostgreSQL版中。您只需要在RDS PostgreSQL側建立發布(PUBLICATION),在AnalyticDB PostgreSQL版側建立一鍵建倉任務訂閱並發布,即可實現資料即時同步。

注意事項

  • AnalyticDB PostgreSQL版儲存彈性模式執行個體且核心版本為V6.3.8.0及以上,才支援一鍵建倉功能。

  • 一鍵建倉僅支援資料庫類型為PostgreSQL 10.0以上版本的RDS PostgreSQL執行個體。

  • RDS PostgreSQL執行個體與AnalyticDB PostgreSQL版執行個體需要屬於同一VPC。

  • 同步對象為資料表。

  • 僅支援同步INSERT、UPDATE、DELETE、TRUNCATE四種文法,不支援同步表結構變更。

  • 目標表與待同步的源表的表結構必須完全一致。

  • RDS PostgreSQL中待同步的源表必須具備主鍵。

  • 僅支援同步以下資料類型:

    數實值型別、字元類型、布爾類型、時間日期類型、枚舉類型、GEO類型、INTERNET類型、RANGE類型、JSON類型、BYTEA類型、BIT類型以及以上類型的數群組類型。

    說明

    其他資料類型可能會導致一鍵建倉任務中斷。

  • RDS PostgreSQL執行個體中的源表如果使用類似UPDATE/DELETE WHERE CTID = ******的語句更新了資料,將不會同步至AnalyticDB PostgreSQL版的目標表中。

準備工作

  • AnalyticDB PostgreSQL版

  • RDS PostgreSQL

    • 已建立RDS PostgreSQL執行個體,建立方法,請參見快速建立RDS PostgreSQL執行個體

    • 已建立高許可權帳號,建立帳號,請參見建立帳號

    • 已將配置參數wal_level設定為logical,修改配置參數,請參見設定執行個體參數

      說明

      該參數修改後需重啟執行個體才會生效,建議您在業務低穀期進行重啟操作。

    • 已將AnalyticDB PostgreSQL版執行個體的內網地址加入RDS PostgreSQL執行個體的白名單。

SQL文法

以下內容將為您介紹建立、修改、刪除一鍵建倉任務的SQL文法。

建立一鍵建倉任務

文法

CREATE SUBSCRIPTION <subscription_name>
    CONNECTION 'conninfo'
    PUBLICATION <publication_name> [, ...]
    [ WITH ( subscription_parameter [= value] [, ... ] ) ]

參數

參數

說明

subscription_name

一鍵建倉任務的名稱。

conninfo

RDS PostgreSQL執行個體的串連資訊,由串連地址、連接埠號碼、資料庫名稱、帳號和密碼組成。串連資訊的擷取方法如下:

  • 串連地址和連接埠:RDS PostgreSQL執行個體的串連地址和連接埠。擷取方法請參見查看或修改串連地址和連接埠

  • 資料庫名稱:待同步的源表所在的資料庫的名稱。

  • 帳號和密碼:擁有以上資料庫讀寫權限的帳號和密碼。

樣本如下:host=pgm-bp*******************.pg.rds.aliyuncs.com port=5432 dbname=*** user=*** password=***

publication_name

RDS PostgreSQL執行個體上發布的名稱。

subscription_parameter

一鍵建倉任務的選擇性參數,當前僅支援copy_data (boolean)參數。

copy_data (boolean):一鍵建倉任務建立時,是否將源表中已有的資料同步到目標表中。取值如下:

  • true:同步源表中已有資料。

  • false:不同步源表中已有資料。

修改一鍵建倉任務

  • 重新整理一鍵建倉任務的同步對象

    當RDS PostgreSQL執行個體往發布中添加了新的源表時,必須執行REFRESH操作才能讓目標表訂閱到新增源表的資料。

    文法

    ALTER SUBSCRIPTION <subscription_name> REFRESH PUBLICATION [ WITH ( refresh_option [= value] [, ... ] ) ]

    參數

    參數

    說明

    subscription_name

    一鍵建倉任務的名稱。

    refresh_option

    一鍵建倉任務的選擇性參數,當前僅支援copy_data (boolean)參數。

    copy_data (boolean):一鍵建倉任務建立時,是否將源表中已有的資料同步到目標表中。取值如下:

    • true:同步源表中已有資料。

    • false:不同步源表中已有資料。

  • 啟動已停止的一鍵建倉任務

    文法

    ALTER SUBSCRIPTION <subscription_name> ENABLE

    參數

    參數

    說明

    subscription_name

    一鍵建倉任務的名稱。

  • 停止當前一鍵建倉任務

    文法

    ALTER SUBSCRIPTION <subscription_name> DISABLE

    參數

    參數

    說明

    subscription_name

    一鍵建倉任務的名稱。

  • 修改一鍵建倉任務所屬的使用者

    文法

    ALTER SUBSCRIPTION <subscription_name> OWNER TO { <new_owner> | CURRENT_USER | SESSION_USER }

    參數

    參數

    說明

    subscription_name

    一鍵建倉任務的名稱。

    new_owner

    一鍵建倉任務的所屬的新使用者。

  • 修改一鍵建倉任務的名稱

    文法

    ALTER SUBSCRIPTION <subscription_name> RENAME TO <new_name>

    參數

    參數

    說明

    subscription_name

    一鍵建倉任務的名稱。

    new_name

    一鍵建倉任務的新名稱。

刪除一鍵建倉任務

文法

DROP SUBSCRIPTION [ IF EXISTS ] <subscription_name>

參數

參數

說明

subscription_name

需要刪除的一鍵建倉任務名稱。

更多文法的使用說明,請參見PostgreSQL官方文檔

開始資料同步

RDS PostgreSQL執行個體上的表logical_tb1需要同步到AnalyticDB PostgreSQL版執行個體。

  1. 在RDS PostgreSQL執行個體上建立測試表logical_tb1。

    CREATE TABLE logical_tb1(a int primary key, b varchar(20));
  2. 在RDS PostgreSQL執行個體上建立發布pub1,並將表logical_tb1加入發布pub1。

    CREATE PUBLICATION pub1 FOR TABLE logical_tb1;
  3. AnalyticDB PostgreSQL版執行個體上建立與RDS PostgreSQL執行個體源表結構相同的目標表。

    CREATE TABLE logical_tb1(a int primary key, b varchar(20));
  4. AnalyticDB PostgreSQL版執行個體上建立一鍵建倉任務。

    • 同步源表中已有資料和新增資料,語句如下:

      CREATE SUBSCRIPTION sub1 CONNECTION 'host=****** port=5432 user=*** dbname=*** password=***' PUBLICATION pub1;
    • 不同步源表中已有資料,僅同步新增資料,語句如下:

      CREATE SUBSCRIPTION sub1 CONNECTION 'host=****** port=5432 user=*** dbname=*** password=***' PUBLICATION pub1 WITH(copy_data = false);

修改同步表

AnalyticDB PostgreSQL版執行個體已建立一鍵建倉任務sub1來同步RDS PostgreSQL執行個體發布pub1中的表logical_tb1,現在需要同步另一張表logical_tb2到AnalyticDB PostgreSQL版執行個體。

  1. 在RDS PostgreSQL執行個體上建立測試表logical_tb2。

    CREATE TABLE logical_tb2(id int primary key, name varchar(20), age int);
  2. 在RDS PostgreSQL執行個體上將表logical_tb2加入發布pub1。

    ALTER PUBLICATION pub1 ADD TABLE logical_tb2;
  3. AnalyticDB PostgreSQL版執行個體上建立與RDS PostgreSQL執行個體源表結構相同的目標表。

    CREATE TABLE logical_tb2(id int primary key, name varchar(20), age int);
  4. AnalyticDB PostgreSQL版執行個體上重新整理訂閱的發布資訊,新增的logical_tb2表即可同步至AnalyticDB PostgreSQL版執行個體。

    ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;

停止資料同步

RDS PostgreSQL執行個體上已建立發布pub1,發布中包含logical_tb1和logical_tb2兩張表,表logical_tb1繼續同步,表logical_tb2不再同步。

  1. 在RDS PostgreSQL執行個體上將不需要同步的表logical_tb2從發布pub1中刪除。

    ALTER PUBLICATION pub1 DROP TABLE logical_tb2;
  2. AnalyticDB PostgreSQL版執行個體上重新整理訂閱的發布資訊,表logical_tb1可繼續同步,表logical_tb2不再同步。

    ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;

查詢一鍵建倉任務狀態

查詢一鍵建倉任務是否完成

您可以在RDS PostgreSQL執行個體上執行以下語句查詢一鍵建倉任務是否完成:

SELECT confirmed_flush_lsn = pg_current_wal_lsn() FROM pg_replication_slots WHERE slot_name = '<subscription_name>';

subscription_name為您需要查詢的一鍵建倉任務名稱。

返回結果說明如下:

  • 如果返回結果為t,表示一鍵建倉任務已完成。

  • 如果返回結果為f,表示一鍵建倉任務未完成。

  • 如果返回結果為空白,表示一鍵建倉任務不存在或狀態異常。

查詢當前一鍵建倉任務狀態

您可以在RDS PostgreSQL執行個體上執行以下語句查詢一鍵建倉任務狀態:

SELECT active FROM pg_replication_slots WHERE slot_name='<subscription_name>';

subscription_name為您需要查詢的一鍵建倉任務名稱。

返回結果說明如下:

  • 如果返回結果為t,表示一鍵建倉任務狀態正常。

  • 如果返回結果為f,表示一鍵建倉任務狀態異常。

  • 如果返回結果為空白,表示一鍵建倉任務不存在。

查詢AnalyticDB PostgreSQL版執行個體中一鍵建倉任務數量

您可以在AnalyticDB PostgreSQL版上執行以下語句查看當前執行個體中存在多少個一鍵建倉任務:

SELECT count(*) FROM pg_subscription WHERE subenabled = true;

相關文檔

  • 更多關於RDS PostgreSQL執行個體建立PUBLICATION的資訊,請參見邏輯訂閱

  • 通過一鍵建倉同步完資料後,您可以使用AnalyticDB PostgreSQL版向量分析即時物化視圖等功能分析資料。