如何判斷數據遷移任務可以停止?
在手動結束遷移任務之前,您需要確認完成以下幾點:
- 至少有過一次完整的數據對比。
- 完成業務割接:
- 先中斷業務(如果業務負載非常輕,也可以嘗試不中斷業務)。
- 在源數據庫端執行如下“show processlist”語句(以MySQL為例),并觀察在1-5分鐘內若無任何新會話執行SQL ,則可認為業務已經完全停止。
- 實時同步時延為0,并穩定保持一段時間;同時,您可以使用數據稽查功能,進行割接前的最后一次數據級對比,耗時可參考之前的對比記錄。
- 確定系統割接時機,業務系統指向目標數據庫,業務對外恢復使用。
- 結束遷移任務,該操作僅刪除了遷移實例,遷移任務仍顯示在任務列表中,您可以進行查看或刪除。
DTS如何遷移MySQL中的存儲過程?
DTS在對MySQL的存儲過程進行遷移時,會做一些特殊處理。具體說來包含以下幾項:
- 變更Definer
- DTS完成MySQL的存儲過程遷移后,會將它的Definer變更為當前實施遷移的用戶。也就是說,假設原始存儲過程在源庫的Definer為userA,實施本次遷移的用戶為userD,則遷移完成后目標端該存儲過程的Definer會變成userD。
- 變更Invoker
- 續上面,存儲過程遷移至目標端之后,原來源庫的userA在目標端會變成Invoker,只具備調用權限,不再具備針對該存儲過程的管理權限。如果需要維持userA的Definer屬性,請手工在目標端執行變更。
如何確認增量遷移/同步過程中源庫數據變更已結束?
要確認增量遷移/同步過程中,源庫數據變更是否已終止,可以通過如下2個方式實現:
方式一:通過查看DTS增量遷移/同步位點的變化情況
-
登錄天翼云官網門戶,進入DTS控制臺頁面。通過“數據遷移/同步列表”->“實例管理”->“實例詳情”->“遷移/同步詳情”->“增量數據遷移/同步”查看當前任務的運行情況。

-
刷新頁面,如果源庫、DTS拉取位點多次均不變更,且無延遲,說明源庫數據變更已結束。
-
如果源庫位點不斷變更,但DTS拉取位點多次均不變更,且延遲逐漸增大,需要參照下面的說明部分來做進一步確認。
方式二:通過查詢數據庫是否還有遷移/同步任務關聯的DDL或DML語句
- 登錄數據庫,執行如下sql語句,并記錄語句的輸出結果。
show binlog events limit 10; - 分析上述結果中是否有DTS遷移/同步任務關聯的庫表DDL或DML語句。
- 多次重復執行步驟1和2。
- 確認輸出結果中沒有任何DTS遷移/同步任務關聯的任何庫表DDL或DML語句,表示當前源庫數據變更已結束。
數據遷移至MySQL時,為什么會提示索引超長?
MySQL中字符集不同,單個字符所能包含的最大字節數也不相同。當前天翼云RDS for MySQL默認的字符集為utf8mb4,存儲引擎為InnoDB,在此情況下,不同索引所能容忍的最大長度如下:
- 單字段索引,字段長度不應超過767個字節(字符數=767/最大字節數)。
- 聯合索引,每個字段長度除應滿足“單字段索引”的要求外,同時所有字段長度之和應不超過聯合索引合計最大字符數的3072個字節。
詳細說明可參照MySQL官方文檔:
故此,要順利完成數據遷移至MYSQL,請合理設置源端索引的長度。
DTS如何遷移MySQL中的MyISAM表到天翼云RDS for MySQL?
- 如果源庫是天翼云RDS for MYSQL,則默認的存儲引擎為InnoDB,不存在需要遷移MyISAM表的情況。
- 如果源庫是他云MySQL產品或用戶本地自建MySQL,此時如果源端存在待遷移的MyISAM表,根據目標端版本不同進行如下操作:
- 目標端是MySQL 5.7,請您先手工將源端的MyISAM存儲引擎改為InnoDB再進行遷移。
- 目標端是MySQL 8.0,DTS會自動將存儲引擎MyISAM轉換成InnoDB。
如何將MySQL低版本數據遷移至MySQL8.0?
當前DTS在實施MySQL的數據遷移時,支持從低版本遷移至高版本的8.0。具體說來就是:
- MySQL 5.6部分版本 -> MySQL 8.0
- MySQL 5.7 -> MySQL 8.0
另外,由于DTS支持MySQL的表、索引、存儲過程、視圖、函數、事件、觸發器等的遷移,所以在實施MySQL 5.6/5.7數據遷移至MySQL 8.0時,用戶需要做一些額外的確認工作,具體如下:
- 待遷移對象中是否有被移除的函數?
在MySQL8.0中,有一些原本存在于低版本中的內置函數已經被廢除,具體可參照如下MySQL官方鏈接。
所以在遷移一些復合對象時,請確保源對象中沒有引用一些已經被廢除的函數。如果有,待DTS遷移完成之后,用戶需自行修改目標端的已遷移對象,做一些適配。具體如下表:
名稱 作用 是否已廢除 字符串解碼 是 字符串解密 是 字符串加密 是 字符串編碼 是 字符串加密 是 返回密碼串 是
- 待遷移表是否使用了已被廢除的字符集UTF8MB3?
- 在MySQL 8.0.29之前,UTF8是UTF8MB3的別名,兩者是等同的,所有語句中的UTF8MB3會被默認轉換成UTF8。
- MySQL 8.0.30及之后的版本中,情況相反。SHOW CREATE TABLE或SELECT CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.COLUMNS或SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS這樣的語句中,用戶會看到以UTF8MB3或MTF8MB3_為前綴的字符集或排序規則名稱。
- 由于DTS在執行MySQL -> MySQL的結構遷移時,會直接保留源庫/表字符集。此時如果源庫/表字符集是UTF8MB3,那么到了目標端仍然是UTF8MB3。考慮到后續的兼容性,建議用戶在遷移完成后,手工將字符集修改為官方建議的UTF8MB4。
- 在MySQL 8.0.29之前,UTF8是UTF8MB3的別名,兩者是等同的,所有語句中的UTF8MB3會被默認轉換成UTF8。
DTS如何處理MySQL的事件和觸發器遷移?
為保證遷移后的數據一致性,DTS在執行MySQL的事件/觸發器遷移時,會采取如下處理措施:
- 和不同的表、視圖、存儲過程等不同,所有的事件/觸發器均被劃分為后向遷移對象(Post Migration Object)。
- 所有的后向遷移對象,均在全量數據遷移完成之后,增量遷移開始之前才開始。
- 如果遷移任務不包含全量,則后向遷移對象在結構遷移階段最后開始。
- 遷移開始后,后向遷移對象和普通對象一樣執行結構遷移。
執行MySQL數據遷移時,如何正確配置lower_case_table_names參數?
- lower_case_table_names配置參數會影響數據庫表在系統中的存儲以及對比方式,具體可參照MySQL官方文檔。
- 為確保在使用DTS執行MySQL的數據遷移時,數據一致性得到保障,用戶需要將源庫和目標庫的lower_case_table_names設置成一樣。
- 在預檢查階段,DTS如果發現源庫、目標庫的lower_case_table_names值不一致,會產生錯誤提示,用戶需按照指引修改配置項。
數據庫全量自動備份期間適合進行DTS全量遷移操作嗎?
不適合。
數據庫全量自動備份期間,若進行DTS全量遷移,可能會導致數據庫備份操作因加鎖失敗而失敗,同時備份操作又會影響DTS遷移的效率。因此,需要客戶合理安排,將DTS全量遷移操作與數據庫自動全量備份操作在時間上錯開,以避免交叉影響。