當您在同步或遷移資料時包含了觸發器(Trigger),且同步或遷移對象依賴的觸發器會更新某個表時,可能會因為目標庫過早同步或遷移觸發器,而導致源和目標庫的資料不一致。本文介紹如何配置同步或遷移觸發器的方式,以避免資料不一致的問題。
前提條件
同步或遷移執行個體的源和目標資料庫均為指定類型的資料庫,例如RDS MariaDB同步到RDS MySQL。更多資訊,請參見支援的執行個體。
執行個體同時包含庫表結構和增量任務。
遷移執行個體:遷移類型需勾選庫表結構遷移和增量遷移。
同步執行個體:同步類型預設已勾選增量同步處理,還需勾選庫表結構同步。
在配置同步或遷移執行個體過程中,源庫對象的選擇粒度為整庫或Schema。
支援的執行個體
源庫 | 目標庫 | 說明 |
MySQL、PolarDB MySQL版、MariaDB | MySQL、PolarDB MySQL版、MariaDB | 若源庫觸發器遷移方式選擇為自動遷移,DTS會在目標庫的觸發器中加入觸發控制語句,DTS預設不觸發目標庫中的觸發器。更多資訊,請參見自動執行。 |
SQL Server | SQL Server | 若源庫觸發器遷移方式選擇為自動遷移,DTS會自動將觸發器遷移至目標庫。 重要 若源庫的增量資料變更會導致源和目標庫的觸發器同時更新資料,則可能會使目標庫產生髒資料。建議選擇手動觸發遷移,並執行相應的後續操作。 |
若同步或遷移執行個體的源庫包含觸發器,且目標庫為PostgreSQL、PolarDB PostgreSQL版或PolarDB PostgreSQL版(相容Oracle),DTS支援在執行個體運行過程中,避免因同步或遷移觸發器而導致的資料不一致問題。
若執行個體使用的目標庫帳號有足夠的許可權(高許可權帳號或者super許可權帳號),觸發器同步或遷移到目標庫後,DTS會以Session層級自動禁用該觸發器。
若執行個體使用的目標庫帳號許可權不足,您需要確保在執行個體運行期間目標資料庫中
session_replication_role
的參數值為replica
。
若為其他包含觸發器的同步或遷移執行個體,操作方法請參見源庫存在觸發器時如何配置同步或遷移作業。
執行個體配置
在對象配置階段,選擇源庫觸發器遷移方式。
舊版配置頁需處於配置任務對象及高級配置階段。
選擇手動觸發遷移時:DTS在結構遷移過程中遇到觸發器時,會產生
object ignored due to incremental migration is enabled
警示,而不會直接將其寫入目標庫。需要您在結束增量任務前,手動將源庫的觸發器同步或遷移到目標庫。詳情請參見手動觸發。選擇自動遷移時:您無需額外操作。
手動觸發
同步和遷移執行個體的操作方法類似,本操作以同步執行個體為例進行介紹。
進入目標地區的同步工作清單頁面(二選一)。
通過DTS控制台進入
在左側導覽列,單擊資料同步。
在頁面左上方,選擇同步執行個體所屬地區。
通過DMS控制台進入
說明實際操作可能會因DMS的模式和布局不同,而有所差異。更多資訊,請參見極簡模式控制台和自訂DMS介面布局與樣式。
在頂部功能表列中,選擇
。在同步任務右側,選擇同步執行個體所屬地區。
單擊目標執行個體的ID。
可選:在左側導覽列,單擊任務管理。
在執行個體進展地區,單擊增量寫入模組。
在基本資料頁簽中,單擊遷移trigger按鈕。
說明若沒有遷移trigger按鈕,則表示在結構遷移過程中未發現觸發器。
您可以在執行個體進展地區的結構遷移3模組,查看觸發器的同步結果。
自動執行
DTS會拷貝源庫觸發器的代碼,在觸發器對象頭部加入觸發控制語句後寫入目標庫,範例程式碼如下所示:
源庫觸發器:
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
END;
目標庫觸發器:
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
IF (SELECT @`__#aliyun_dts_writer#__) IS NULL THEN
INSERT INTO test2 SET a2 = NEW.a1;
END IF;
END;