當您在同步或遷移數據時包含了觸發器(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控制臺進入
登錄數據傳輸服務DTS控制臺。
在左側導航欄,單擊數據同步。
在頁面左上角,選擇同步實例所屬地域。
通過DMS控制臺進入
說明實際操作可能會因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;