5分鐘搞定 SQL Server 到 MySQL 數(shù)據(jù)遷移和同步

簡(jiǎn)述

SQL Server 是一個(gè)值得信賴的老牌數(shù)據(jù)庫(kù)系統(tǒng),自從 1988 年由 Microsoft俺榆、Sybase 和 Ashton-Tate 三家公司共同推出之后就一直不斷迭代更新。而如今我們提到 SQL Server 通常是指 Microsoft 從 SQL Server 2000 之后的版本惭聂。至今 SQL Server 家族已經(jīng)非常繁茂涵蓋了 云上(Azure SQL Server)蒲肋、IoT 設(shè)備(邊緣 SQL Server)、以及經(jīng)典版本(本地 SQL Server)巧颈。

實(shí)現(xiàn) SQL Server 作為源端的實(shí)時(shí)數(shù)據(jù)同步畦木,一般都會(huì)用到它的 CDC 功能,這個(gè)功能是從 2008 版本才開始支持砸泛。因此本文主要也是基于 SQL Server 2008 版本介紹如何使用 CloudCanal 快速構(gòu)建一條穩(wěn)定高效運(yùn)行的 SQL ServerMySQL 數(shù)據(jù)同步鏈路十籍。

技術(shù)點(diǎn)

基于 SQL Server 的 CDC

image.png

SQL Server 將用戶的每一個(gè)數(shù)據(jù)操作都記錄在后綴為 ldf 日志文件中蛆封。這些日志會(huì)保存在 ldf 文件中。當(dāng)數(shù)據(jù)庫(kù)啟用 CDC 能力后勾栗,SQL Server 代理上會(huì)生成一個(gè)專門分析ldf文件的作業(yè)惨篱,再將具體的表啟用 CDC, 則該作業(yè)開始持續(xù)分析文件中的變更事件到指定的表中。

作業(yè)執(zhí)行用到 SQL Server 代理围俘,該組件如果處于非啟動(dòng)狀態(tài)砸讳,則生成任何可消費(fèi)的變更數(shù)據(jù)。通常界牡,我們可以在 Windows 對(duì)象資源管理器中查看是否已經(jīng)開啟了 SQL Server 代理簿寂。

image.png

由于 SQL Server 執(zhí)行作業(yè)時(shí)無(wú)法設(shè)置起始位置,因此對(duì)于一個(gè)表的變更記錄我們最早只能追溯到表啟用 CDC 的那個(gè)時(shí)間點(diǎn)宿亡。具體的起始位點(diǎn)可以在 “cdc.change_tables” 表中查詢得到常遂。

還需要注意的另外一個(gè)細(xì)節(jié)是 CDC 表也是一張普通的表它和用戶共享同一個(gè)數(shù)據(jù)空間。為了防止 CDC 表數(shù)據(jù)無(wú)限膨脹 SQL Server 會(huì)每天定時(shí)執(zhí)行清理作業(yè)挽荠,清理過(guò)期的數(shù)據(jù)(具體時(shí)間視數(shù)據(jù)庫(kù)配置而定)克胳。

SQL Server -> MySQL 的數(shù)據(jù)類型支持

CloudCanal 從 2021 年開始支持 SQL Server 同步后就不斷地豐富它的對(duì)端數(shù)據(jù)源,支持 SQL Server 到 MySQL 是一個(gè)非常重要的同步鏈路圈匆。
目前 CloudCanal 已經(jīng)可以支持的類型和映射關(guān)系如下:

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 類型限制漠另,會(huì)丟棄時(shí)區(qū)信息同時(shí)最多保留 6 位精度
DATETIME2 DATETIME 由于 MySQL 類型限制,會(huì)保留最多 6 位精度
SMALLDATETIME DATETIME
DATETIME DATETIME 由于 MySQL 類型限制跃赚,會(huì)保留最多 6 位精度
TIME TIME 由于 MySQL 類型限制酗钞,會(huì)保留最多 6 位精度
CHAR CHAR
VARCHAR VARCHAR 源端 SQL Server 如果為 VARCHAR(MAX),則按照 TEXT 來(lái)處理
TEXT TEXT
NCHAR CHAR
NVARCHAR VARCHAR 源端 SQL Server 如果為 NVARCHAR(MAX)来累,則按照 NTEXT 來(lái)處理
NTEXT TEXT
BINARY BINARY
VARBINARY VARBINARY 源端 SQL Server 如果為 VARBINARY(MAX)砚作,則按照 IMAGE 來(lái)處理
IMAGE BLOB
TIMESTAMP BIGINT 會(huì)映射為 bigint unsigned
ROWVERSION BIGINT 會(huì)映射為 bigint unsigned
HIERARCHYID -- 暫不支持
UNIQUEIDENTIFIER VARCHAR(36)
SQL_VARIANT -- 暫不支持
XML TEXT
GEOMETRY -- 暫不支持
GEOGRAPHY -- 暫不支持
SYSNAME VARCHAR(128)

操作示例

前置條件

  • 登陸 CloudCanal SaaS版,使用參見(jiàn)快速上手文檔
  • 準(zhǔn)備一個(gè) SQL Server 數(shù)據(jù)庫(kù)嘹锁,和 MySQL 實(shí)例(本例分別使用自建 SQL Server 2008 和 MySQL 8.0)
  • 登錄 CloudCanal 平臺(tái) 葫录,添加 SQL Server 和 MySQL
image.png
  • 創(chuàng)建一條 SQL Server -> MySQL 鏈路作為增量數(shù)據(jù)來(lái)源

任務(wù)創(chuàng)建

  • 任務(wù)管理-> 任務(wù)創(chuàng)建
  • 測(cè)試鏈接并選擇 目標(biāo) 數(shù)據(jù)庫(kù)
  • 點(diǎn)擊下一步
image.png
  • 選擇 數(shù)據(jù)同步,并勾選 全量數(shù)據(jù)初始化领猾,其他選項(xiàng)默認(rèn)
image.png
  • 此時(shí)如果 SQL Server 上數(shù)據(jù)庫(kù)還沒(méi)有啟用 CDC 功能米同,則會(huì)在點(diǎn)擊下一步的時(shí)候提示如何啟用 CDC。只要按照提示的參考語(yǔ)句執(zhí)行即可摔竿。
image.png
  • 選擇需要遷移同步的
image.png

image.png
  • 確認(rèn)創(chuàng)建任務(wù)
image.png
  • 任務(wù)自動(dòng)做結(jié)構(gòu)遷移面粮、全量遷移增量同步
image.png

校驗(yàn)數(shù)據(jù)

  • 程序造數(shù)據(jù)继低, SQL Server -> MySQL熬苍,在源端以 1:1:1 的比例隨機(jī)執(zhí)行Insert、Update、Delete三種類型語(yǔ)句柴底。使用20個(gè)線程并發(fā)寫入變更婿脸。
    image.png
  • 任務(wù)正常運(yùn)行一段時(shí)間后,停止造數(shù)據(jù)
  • 點(diǎn)擊 SQLServer -> MySQL 任務(wù)詳情柄驻,功能列表 -> 創(chuàng)建相似任務(wù)狐树,在創(chuàng)建任務(wù)的第二步選擇數(shù)據(jù)校驗(yàn)
image.png
  • 數(shù)據(jù)校驗(yàn) OK
    • 下面這個(gè)是校驗(yàn)結(jié)果。如果我們對(duì)端和源端一旦出現(xiàn)數(shù)據(jù)不一致就會(huì)像下面這樣非常醒目的提示給用戶鸿脓,有多少數(shù)據(jù)不一致抑钟,有多少數(shù)據(jù)丟失。
image.png

常見(jiàn)問(wèn)題

支持什么版本的 SQL Server 和 MySQL 野哭?

  • 目前源端 SQL Server 2008 及以上版本皆可使用 CloudCanal 進(jìn)行遷移同步(推薦使用 SQL Server 2016 或 SQL Server 2008)
  • 對(duì)端 MySQL 支持 5.6在塔、5.7、8.0 版本虐拓,也可以選用 阿里云 RDS for MySQL 對(duì)應(yīng)的版本心俗,或者其它云服務(wù)商的 MySQL 版本

數(shù)據(jù)不同步了都有哪些情況傲武?

  • SQL Server CDC 需要依賴 SQL Server 代理蓉驹,首先要確定 SQL Server 代理服務(wù)是否啟動(dòng)
  • 表在啟動(dòng) CDC 的時(shí)候會(huì)確定要捕獲的列清單,此時(shí)如果修改列的類型可能會(huì)導(dǎo)致 CDC 中斷揪利。目前解決辦法只能重建任務(wù)态兴。
  • 增/減 同一個(gè)列名的列,對(duì)一個(gè)列刪除后在增加疟位。雖然 CDC 表中字段依然存在但是也會(huì)導(dǎo)致整個(gè) CDC 中斷瞻润。

什么情況下會(huì)影響穩(wěn)定的數(shù)據(jù)同步?

  • 如果任務(wù)在同步期間出現(xiàn)了異常導(dǎo)致任務(wù)延遲甜刻。這時(shí)候需要格外注意绍撞,如果過(guò)長(zhǎng)時(shí)間的延遲,即便是修復(fù)了延遲的問(wèn)題(比如對(duì)端數(shù)據(jù)庫(kù)長(zhǎng)時(shí)間出現(xiàn)不可用)在后續(xù)數(shù)據(jù)同步上也可能存在丟失數(shù)據(jù)的風(fēng)險(xiǎn)得院。
  • SQL Server 為了防止 CDC 表數(shù)據(jù)無(wú)限膨脹 SQL Server 會(huì)每天定時(shí)執(zhí)行清理作業(yè)傻铣,清理超過(guò) 3天的數(shù)據(jù)。
  • 為了增加延遲的容忍度可以執(zhí)行這條 SQL 來(lái)增加 CDC 數(shù)據(jù)的保存時(shí)間祥绞,代價(jià)是這些數(shù)據(jù)需要存放到數(shù)據(jù)庫(kù)表中非洲,如果每日數(shù)據(jù)變更很多對(duì)磁盤開銷會(huì)有額外的要求。
    • execute sys.sp_cdc_change_job @job_type = n'cleanup', @retention = 4320
    • msdb.dbo.cdc_jobs 表中保存了具體 捕獲任務(wù)的數(shù)據(jù)保存時(shí)間蜕径。

總結(jié)

本文簡(jiǎn)單介紹了如何使用 CloudCanal 進(jìn)行 SQL Server -> MySQL 數(shù)據(jù)遷移同步两踏。各位讀者朋友,如果你覺(jué)得還不錯(cuò)兜喻,請(qǐng)點(diǎn)贊梦染、評(píng)論加轉(zhuǎn)發(fā)吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末朴皆,一起剝皮案震驚了整個(gè)濱河市弓坞,隨后出現(xiàn)的幾起案子隧甚,更是在濱河造成了極大的恐慌,老刑警劉巖渡冻,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戚扳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡族吻,警方通過(guò)查閱死者的電腦和手機(jī)帽借,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)超歌,“玉大人砍艾,你說(shuō)我怎么就攤上這事∥【伲” “怎么了脆荷?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)懊悯。 經(jīng)常有香客問(wèn)我蜓谋,道長(zhǎng),這世上最難降的妖魔是什么炭分? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任桃焕,我火速辦了婚禮,結(jié)果婚禮上捧毛,老公的妹妹穿的比我還像新娘观堂。我一直安慰自己,他們只是感情好呀忧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布师痕。 她就那樣靜靜地躺著,像睡著了一般而账。 火紅的嫁衣襯著肌膚如雪胰坟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天福扬,我揣著相機(jī)與錄音腕铸,去河邊找鬼。 笑死铛碑,一個(gè)胖子當(dāng)著我的面吹牛狠裹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汽烦,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼涛菠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起俗冻,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤礁叔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后迄薄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琅关,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年讥蔽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涣易。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冶伞,死狀恐怖新症,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情响禽,我是刑警寧澤徒爹,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站芋类,受9級(jí)特大地震影響涕滋,放射性物質(zhì)發(fā)生泄漏梅鹦。R本人自食惡果不足惜软啼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一航背、第九天 我趴在偏房一處隱蔽的房頂上張望铺董。 院中可真熱鬧巫击,春花似錦、人聲如沸精续。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)重付。三九已至顷级,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間确垫,已是汗流浹背弓颈。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留删掀,地道東北人翔冀。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像披泪,于是被迫代替她去往敵國(guó)和親纤子。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容