5分鐘搞定 SQL Server 到 MySQL 數據遷移和同步

来源:https://www.cnblogs.com/clougence/archive/2022/11/21/16910780.html
-Advertisement-
Play Games

簡述 SQL Server 是一個值得信賴的老牌資料庫系統,自從 1988 年由 Microsoft、Sybase 和 Ashton-Tate 三家公司共同推出之後就一直不斷迭代更新。而如今我們提到 SQL Server 通常是指 Microsoft 從 SQL Server 2000 之後的版本。 ...


簡述

SQL Server 是一個值得信賴的老牌資料庫系統,自從 1988 年由 Microsoft、Sybase 和 Ashton-Tate 三家公司共同推出之後就一直不斷迭代更新。而如今我們提到 SQL Server 通常是指 Microsoft 從 SQL Server 2000 之後的版本。至今 SQL Server 家族已經非常繁茂涵蓋了 雲上(Azure SQL Server)、IoT 設備(邊緣 SQL Server)、以及經典版本(本地 SQL Server)。

實現 SQL Server 作為源端的實時數據同步,一般都會用到它的 CDC 功能,這個功能是從 2008 版本才開始支持。因此本文主要也是基於 SQL Server 2008 版本介紹如何使用 CloudCanal 快速構建一條穩定高效運行的 SQL ServerMySQL 數據同步鏈路。

技術點

基於 SQL Server 的 CDC

image.png
SQL Server 將用戶的每一個數據操作都記錄在尾碼為 ldf 日誌文件中。這些日誌會保存在 ldf 文件中。當資料庫啟用 CDC 能力後,SQL Server 代理上會生成一個專門分析ldf文件的作業,再將具體的表啟用 CDC, 則該作業開始持續分析文件中的變更事件到指定的表中。

作業執行用到 SQL Server 代理,該組件如果處於非啟動狀態,則生成任何可消費的變更數據。通常,我們可以在 Windows 對象資源管理器中查看是否已經開啟了 SQL Server 代理。

image.png

由於 SQL Server 執行作業時無法設置起始位置,因此對於一個表的變更記錄我們最早只能追溯到表啟用 CDC 的那個時間點。具體的起始位點可以在 “cdc.change_tables” 表中查詢得到。

還需要註意的另外一個細節是 CDC 表也是一張普通的表它和用戶共用同一個數據空間。為了防止 CDC 表數據無限膨脹 SQL Server 會每天定時執行清理作業,清理過期的數據(具體時間視資料庫配置而定)。

SQL Server -> MySQL 的數據類型支持

CloudCanal 從 2021 年開始支持 SQL Server 同步後就不斷地豐富它的對端數據源,支持 SQL Server 到 MySQL 是一個非常重要的同步鏈路。
目前 CloudCanal 已經可以支持的類型和映射關係如下:

SQL Server 類型 MySQL 類型 備註
BIT BIT
DECIMAL DECIMAL
NUMERIC DECIMAL
SMALLINT SMALLINT
TINYINT TINYINT 映射為 tinyint unsigned�
INT INT
BIGINT BIGINT
SMALLMONEY FLOAT
MONEY FLOAT
FLOAT FLOAT
REAL DOUBLE
DATE DATE
DATETIMEOFFSET DATETIME 由於 MySQL 類型限制,會丟棄時區信息同時最多保留 6 位精度
DATETIME2 DATETIME 由於 MySQL 類型限制,會保留最多 6 位精度
SMALLDATETIME DATETIME
DATETIME DATETIME 由於 MySQL 類型限制,會保留最多 6 位精度
TIME TIME 由於 MySQL 類型限制,會保留最多 6 位精度
CHAR CHAR
VARCHAR VARCHAR 源端 SQL Server 如果為 VARCHAR(MAX),則按照 TEXT 來處理
TEXT TEXT
NCHAR CHAR
NVARCHAR VARCHAR 源端 SQL Server 如果為 NVARCHAR(MAX),則按照 NTEXT� 來處理
NTEXT TEXT
BINARY BINARY
VARBINARY VARBINARY 源端 SQL Server 如果為 VARBINARY(MAX),則按照 IMAGE� 來處理
IMAGE BLOB
TIMESTAMP BIGINT 會映射為 bigint unsigned
ROWVERSION BIGINT 會映射為 bigint unsigned
HIERARCHYID -- 暫不支持
UNIQUEIDENTIFIER VARCHAR(36)
SQL_VARIANT -- 暫不支持
XML TEXT
GEOMETRY -- 暫不支持
GEOGRAPHY -- 暫不支持
SYSNAME VARCHAR(128)

操作示例

前置條件

  • 登陸 CloudCanal SaaS版,使用參見快速上手文檔
  • 準備一個 SQL Server 資料庫,和 MySQL 實例(本例分別使用自建 SQL Server 2008 和 MySQL 8.0)
  • 登錄 CloudCanal 平臺 ,添加 SQL Server 和 MySQL

image.png

  • 創建一條 SQL Server -> MySQL 鏈路作為增量數據來源

任務創建

  • 任務管理-> 任務創建
  • 測試鏈接並選擇 目標 資料庫
  • 點擊下一步

image.png

  • 選擇 數據同步,並勾選 全量數據初始化,其他選項預設

image.png

  • 此時如果 SQL Server 上資料庫還沒有啟用 CDC 功能,則會在點擊下一步的時候提示如何啟用 CDC。只要按照提示的參考語句執行即可。

image.png

  • 選擇需要遷移同步的

image.png
image.png

  • 確認創建任務

image.png

  • 任務自動做結構遷移全量遷移增量同步

image.png

校驗數據

  • 程式造數據, SQL Server -> MySQL,在源端以 1:1:1 的比例隨機執行Insert、Update、Delete三種類型語句。使用20個線程併發寫入變更。
    image.png
  • 任務正常運行一段時間後,停止造數據
  • 點擊 SQLServer -> MySQL 任務詳情功能列表 -> 創建相似任務,在創建任務的第二步選擇數據校驗

image.png

  • 數據校驗 OK
    • 下麵這個是校驗結果。如果我們對端和源端一旦出現數據不一致就會像下麵這樣非常醒目的提示給用戶,有多少數據不一致,有多少數據丟失。

image.png

常見問題

支持什麼版本的 SQL Server 和 MySQL ?

  • 目前源端 SQL Server 2008 及以上版本皆可使用 CloudCanal 進行遷移同步(推薦使用 SQL Server 2016 或 SQL Server 2008)
  • 對端 MySQL 支持 5.6、5.7、8.0 版本,也可以選用 阿裡雲 RDS for MySQL 對應的版本,或者其它雲服務商的 MySQL 版本

數據不同步了都有哪些情況?

  • SQL Server CDC 需要依賴 SQL Server 代理,首先要確定 SQL Server 代理服務是否啟動
  • 表在啟動 CDC 的時候會確定要捕獲的列清單,此時如果修改列的類型可能會導致 CDC 中斷。目前解決辦法只能重建任務。
  • 增/減 同一個列名的列,對一個列刪除後在增加。雖然 CDC 表中欄位依然存在但是也會導致整個 CDC 中斷。

什麼情況下會影響穩定的數據同步?

  • 如果任務在同步期間出現了異常導致任務延遲。這時候需要格外註意,如果過長時間的延遲,即便是修複了延遲的問題(比如對端資料庫長時間出現不可用)在後續數據同步上也可能存在丟失數據的風險。
  • SQL Server 為了防止 CDC 表數據無限膨脹 SQL Server 會每天定時執行清理作業,清理超過 3天的數據。
  • 為了增加延遲的容忍度可以執行這條 SQL 來增加 CDC 數據的保存時間,代價是這些數據需要存放到資料庫表中,如果每日數據變更很多對磁碟開銷會有額外的要求。
    • execute sys.sp_cdc_change_job @job_type = n'cleanup', @retention = 4320
    • msdb.dbo.cdc_jobs 表中保存了具體 捕獲任務的數據保存時間。

總結

本文簡單介紹瞭如何使用 CloudCanal 進行 SQL Server -> MySQL 數據遷移同步。各位讀者朋友,如果你覺得還不錯,請點贊、評論加轉發吧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 代碼生成器(CodeBuilder) 經過這幾個版本的完善,目前功能也趨於穩定,詳細的線上文檔也得到維護,不失為一款強大的代碼生成工具。 官網:http://www.fireasy.cn/codebuilder ==版本維護== Version 2.9.41、解決擴展文件編輯與編譯有問題;2、提升應 ...
  • 個人名片: 對人間的熱愛與歌頌,可抵歲月冗長:sun_with_face: Github👨🏻‍💻:念舒_C.ying CSDN主頁✏️:念舒_C.ying 個人博客:earth_asia: :念舒_C.ying 1 基礎環境 創建centos虛擬機,需要兩張網路適配器 1.1 配置網卡 IP地 ...
  • (文章目錄) 一、調度演算法的原理和分類 1.進程調度簡介 進程調度的研究是整個操作系統理論的核心,在多進程的操作系統中,進程調度是一個全局性的、關鍵性的問題,它對系統的總體設計、系統的實現、功能設置以及各方面的性能都有著決定性的影響。進程運行需要各種各樣的系統資源,如記憶體、文件、印表機和最寶貴的CP ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:nw MySQL Hash Join前世今生 因工作需要,對MySQL Hash Join的內部實現做了一些探索和實踐,對這個由8.0.18開始引 ...
  • 前端做數據分頁,至少需要傳給後端的關鍵數據: 當前頁碼:pageNum(需要查第幾頁的數據,必須前端提供) 每頁顯示數據條數:limit 或 pageSize(可前端傳,可後端自定義) 前端需要的數據,即後端需要查的數據:(可定義 PageHelper 封裝數據) int count:總記錄數 (直 ...
  • 首發微信公眾號:SQL資料庫運維 原文鏈接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1&sn=450e9e94fa709b5eeff0de371c62072b&chksm=ea37536cdd40da7 ...
  • 摘要:為了持續打造核心競爭力,英克康健聯合華為雲,基於雲資料庫RDS for PostgreSQL全新打造了一個高性能、大容量、高可用的SaaS醫葯管理系統,助力萬千藥企業務邁上新臺階。 本文分享自華為雲社區《雲時代下,醫葯行業管理居然這麼簡單》,作者:GaussDB 資料庫 。 乘借數字化東風,醫 ...
  • 在mysql中,hint指的是“查詢優化提示”,會提示優化器按照一定的方式來生成執行計划進行優化,讓用戶的sql語句更具靈活性;Hint可基於表的連接順序、方法、訪問路徑、並行度等規則對DML(數據操縱語言,Data Manipulation Language)語句產生作用。 我們在操作表、欄位或索 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...