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執行個體的串連資訊,由串連地址、連接埠號碼、資料庫名稱、帳號和密碼組成。串連資訊的擷取方法如下:
樣本如下: |
publication_name | RDS PostgreSQL執行個體上發布的名稱。 |
subscription_parameter | 一鍵建倉任務的選擇性參數,當前僅支援
|
修改一鍵建倉任務
重新整理一鍵建倉任務的同步對象
當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版執行個體。
在RDS PostgreSQL執行個體上建立測試表logical_tb1。
CREATE TABLE logical_tb1(a int primary key, b varchar(20));在RDS PostgreSQL執行個體上建立發布pub1,並將表logical_tb1加入發布pub1。
CREATE PUBLICATION pub1 FOR TABLE logical_tb1;在AnalyticDB PostgreSQL版執行個體上建立與RDS PostgreSQL執行個體源表結構相同的目標表。
CREATE TABLE logical_tb1(a int primary key, b varchar(20));在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版執行個體。
在RDS PostgreSQL執行個體上建立測試表logical_tb2。
CREATE TABLE logical_tb2(id int primary key, name varchar(20), age int);在RDS PostgreSQL執行個體上將表logical_tb2加入發布pub1。
ALTER PUBLICATION pub1 ADD TABLE logical_tb2;在AnalyticDB PostgreSQL版執行個體上建立與RDS PostgreSQL執行個體源表結構相同的目標表。
CREATE TABLE logical_tb2(id int primary key, name varchar(20), age int);在AnalyticDB PostgreSQL版執行個體上重新整理訂閱的發布資訊,新增的logical_tb2表即可同步至AnalyticDB PostgreSQL版執行個體。
ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;
停止資料同步
RDS PostgreSQL執行個體上已建立發布pub1,發布中包含logical_tb1和logical_tb2兩張表,表logical_tb1繼續同步,表logical_tb2不再同步。
在RDS PostgreSQL執行個體上將不需要同步的表logical_tb2從發布pub1中刪除。
ALTER PUBLICATION pub1 DROP TABLE logical_tb2;在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;