當您同步實例的對象為整庫,且該數據庫中包含了會更新庫內某個表的觸發器(Trigger)時,可能會導致源庫和目標庫的數據不一致。本文介紹源庫存在觸發器的情況下如何正確地配置同步作業,以確保數據的一致性和完整性。
背景信息
若同步或遷移實例的源庫包含觸發器且實例滿足以下條件,請參考相關文檔同步或遷移觸發器,以確保源庫和目標庫的數據一致性。其他包含觸發器的同步或遷移實例,請參考本文進行操作。
源庫 | 目標庫 | 說明 | 相關文檔 |
無限制 | PostgreSQL、PolarDB PostgreSQL版、PolarDB PostgreSQL版(兼容Oracle) |
| |
MySQL、PolarDB MySQL版、MariaDB | MySQL、PolarDB MySQL版、MariaDB | 支持手動配置同步或遷移觸發器的方式。 | |
SQL Server | SQL Server |
實現流程
案例介紹
本操作以自建MySQL同步至RDS MySQL為例介紹配置流程。
數據準備
MySQL數據庫triggertestdata中存在了兩個表:parent和child。其中,表parent中有一個觸發器(定義:當INSERT一條數據到表parent之后,將其INSERT寫入的數據寫入一份至表child中)。
表結構及觸發器定義如下表所示。
對象類型 | 名稱 | 結構語句 |
表 | parent |
|
表 | child |
|
觸發器 | data_check |
|
在此案例中,如果在數據同步時,在源庫的表parent中執行了INSERT操作,將導致源和目標庫中的表child數據不一致。為解決該問題,需要刪除被遷移到目標庫中的觸發器。
操作步驟
創建一個數據遷移實例,將源庫的結構遷移至目標庫。
進入遷移任務的列表頁面。
登錄DMS數據管理服務。
在頂部菜單欄中,單擊集成與開發。
在左側導航欄,選擇 。
說明實際操作可能會因DMS的模式和布局不同,而有所差異。更多信息,請參見極簡模式控制臺和自定義DMS界面布局與樣式。
您也可以登錄新版DTS遷移任務的列表頁面。
在遷移任務右側,選擇遷移實例所屬地域。
說明新版DTS遷移任務列表頁面,需要在頁面左上角選擇遷移實例所屬地域。
單擊創建任務,進入任務配置頁面。
配置源庫信息和目標庫信息后,單擊頁面下方的測試連接以進行下一步。
參數說明等信息,請參見自建MySQL遷移至RDS MySQL。
將遷移類型選擇為庫表結構遷移,然后選擇待遷移的數據庫或Schema。
根據業務需求,完成后續配置。
由于執行結構遷移時,觸發器也會被遷移至目標庫中。當遷移實例完成后,您需要登錄目標數據庫,執行如下命令刪除被遷移過去的觸發器。
drop trigger <觸發器名稱>;
示例:
drop trigger data_check;
創建數據同步實例,將源庫的數據同步至目標庫中。
在左側導航欄,單擊數據同步。
配置源庫信息和目標庫信息后,單擊頁面下方的測試連接以進行下一步。
參數說明等信息,請參見自建MySQL同步至RDS MySQL。
說明同步實例配置的源庫和目標庫需與步驟1保持一致。
同步類型手動勾選全量同步。
說明同步對象需和步驟1中配置的遷移對象保持一致。
同步類型默認已勾選增量同步,請勿勾選庫表結構同步。
根據業務需求,完成后續配置。
數據一致性測試
登錄源數據庫,在表parent中插入一條記錄。
insert into parent values(1,'testname');
執行該操作后,由于源庫觸發器的緣故,該條記錄也會被寫入至源庫的child表中。
登錄源和目標數據庫,查詢表child的數據,比對其數據是否一致。
源庫查詢結果
+--------------+------------+----------+ | sys_child_id | user_vs_id | name | +--------------+------------+----------+ | 2001 | 1 | testname | +--------------+------------+----------+
目標庫查詢結果
+--------------+------------+----------+ | sys_child_id | user_vs_id | name | +--------------+------------+----------+ | 2001 | 1 | testname | +--------------+------------+----------+
經比對,數據一致。