記一次MySQL數據遷移到SQLServer全過程
為什麼要做遷移?
由於系統版本、資料庫的升級,導致測試流程阻塞,為了保證數據及系統版本的一致性,我又迫切需要想用這套環境做性能測試,所以和領導、開發請示,得到批准後,便有了這次學習的機會,所以特此來記錄下整個過程。
使用方案:
藉助工具與編碼相結合形式,備份MySQL
資料庫,並把備份資料庫還原到本地MySQL
資料庫,使用第三方工具完成數據遷移,程式碼實現SQL
條數統計按照庫名和表名回寫結果,使用ultracompare
實現比對。
使用工具:
第一種遷移工具
Microsoft SQL Server Migration Assistant for MySQL
:推薦這款工具,微軟出的,但是也會有些問題,如部分表數據不能完全遷移
第二種遷移工具
Navicat Premium 12
:不推薦,速度慢,極容易失敗
第三種遷移工具
Tapdata
:這款也不錯,第三方工具,但不穩定,總記憶體溢出,底層Java
寫的,需要與客服溝通解決使用中問題,客服響應速度不是很理想
比對工具
ultracompare
:比對結果使用
工具使用
第一種遷移工具使用
Microsoft SQL Server Migration Assistant for MySQL
,這款工具是微軟出的,真的很好用,而且速度也算比較快。
從//www.microsoft.com/en-us/download/details.aspx?id=54257
,下載安裝.
下面來介紹如何使用這款工具,具體步驟如下:
第一步:創建一個遷移工程
需要注意的是你需要選擇遷移到的SQL Server
資料庫的版本,目前支援:SQL Azure,SQL Server 2005,SQL Server2008,SQL Server 2012,SQL Server2014
,根據實際需要選擇你要遷移到目標資料庫的版本。
第二步:連接源資料庫和目標資料庫
上面的是源:MySQL
,下面的是目標:SQL Server
第三步:選擇需要遷移的資料庫創建遷移分析報告
此報告會分析當前需要遷移的資料庫中的所有表結構並會生成一個可行性報告
生成的報告如下:
分析需要轉換的對象,表,資料庫有多少個,是否存在不可轉換的對象等資訊,如有檢查錯誤會下下面輸出
第四步: 轉換schema
也就是資料庫結構
遷移分兩步:1.轉換資料庫結構,2.遷移數據;
第五步:在源資料庫轉換完schema
之後記得在目標資料庫上執行同步schema
操作
否則轉換的資料庫結構是不會到目標資料庫的
點擊同步之後同樣會有一個同步的報告:
點擊OK
之後就真正執行同步操作會將你轉換完的結構同步到目標資料庫上,創建對應的表及其他對象。同步操作完成之後會有如下輸出:
第六步:結構同步完成之後接下來就是數據遷移操作了
我們可以看到右邊有幾個tab
頁,當前選中的是Type Map
,會列出源資料庫和目標資料庫的欄位類型的mapping
關係
因為不同資料庫之間的數據類型還是有所差異的。
點擊Migrate Data
之後需要再次確認輸入源資料庫密碼和目標資料庫密碼,然後開始真正的數據的遷移。
執行之後就等待完成就好,同樣會生成一個數據遷移完成的報告。至此數據遷移就可以完成了。
第二種遷移工具使用
Navicat Premium 12
這款工具操作更簡單,因為很多步驟可以圖形化,相對簡便。
具體操作步驟如下:
建立MySQL、SqlServer
連接,
雙擊MySQL
的連接,建立連接
然後選擇navicat 的左上角工具
數據將自動導入
注意:該工具將不會同步約束,比如:默認值之類的。但是非空約束是可以傳遞到SqlServer
。
第三種遷移工具
Tapdata
,這個工具是永久免費的,也算比較好用,具體使用方法如下:
第一步:配置MySQL
連接
1、點擊 Tapdata Cloud
操作後台左側菜單欄的【連接管理】,然後點擊右側區域【連接列表】右上角的【創建連接】按鈕,打開連接類型選擇頁面,然後選擇MySQL
2、在打開的連接資訊配置頁面依次輸入需要的配置資訊
【連 接 名 稱】:設置連接的名稱,多個連接的名稱不能重複
【資料庫地址】:資料庫 IP / Host
【端 口】:資料庫埠
【資料庫名稱】:tapdata
資料庫連接是以一個 db
為一個數據源。這裡的 db
是指一個資料庫實例中的 database
,而不是一個 mysql
實例。
【賬 號】:可以訪問資料庫的帳號
【密 碼】:資料庫帳號對應的密碼
【時 間 時 區】:默認使用該資料庫的時區;若指定時區,則使用指定後的時區設置
第二步:配置 SQL Server
連接
3、同第一步操作,點擊左側菜單欄的【連接管理】,然後點擊右側區域【連接列表】右上角的【創建連接】按鈕,打開連接類型選擇頁面,然後選擇 SQL Server
4、在打開的連接資訊配置頁面依次輸入需要的配置資訊,配置完成後測試連接保存即可。
第三步:選擇同步模式-全量/增量/全+增
進入Tapdata Cloud
操作後台任務管理頁面,點擊添加任務按鈕進入任務設置流程
根據剛才建好的連接,選定源端與目標端。
根據數據需求,選擇需要同步的庫、表,如果你對錶名有修改需要,可以通過頁面中的表名批量修改功能對目標端的表名進行批量設置。
在以上選項設置完畢後,下一步選擇同步類型,平台提供全量同步、增量同步、全量+增量同步,設定寫入模式和讀取數量。
如果選擇的是全量+增量同步,在全量任務執行完畢後,Tapdata Agent
會自動進入增量同步狀態。在該狀態中,Tapdata Agent
會持續監聽源端的數據變化(包括:寫入、更新、刪除),並實時的將這些數據變化寫入目標端。
點擊任務名稱可以打開任務詳情頁面,可以查看任務詳細資訊。
點擊任務監控可以打開任務執行詳情頁面,可以查看任務進度/里程碑等的具體資訊。
第四步:進行數據校驗
一般同步完成後,我都習慣性進行一下數據校驗,防止踩坑。
Tapdata
有三種校驗模式,我常用最快的快速count
校驗 ,只需要選擇到要校驗的表,不用設置其他複雜的參數和條件,簡單方便。
如果覺得不夠用,也可以選擇表全欄位值校驗 ,這個除了要選擇待校驗表外,還需要針對每一個表設置索引欄位。
在進行表全欄位值校驗時,還支援進行高級校驗。通過高級校驗可以添加JS校驗邏輯,可以對源和目標的數據進行校驗。
還有一個校驗方式關聯欄位值校驗 ,創建關聯欄位值校驗時,除了要選擇待校驗表外,還需要針對每一個表設置索引欄位。
以上就是 MySQL
數據實時同步到 SQL Server
的操作分享。
使用到的SQL技術
MySQL部分
查詢某個庫的所有表名稱
select table_name from information_schema.tables where table_schema='資料庫名';
查詢某個資料庫中所有的表名 列名 欄位長度
SELECT TABLE_NAME as '表名', COLUMN_NAME as '列名',COLUMN_COMMENT,DATA_TYPE as '欄位類型' ,COLUMN_TYPE as '長度加類型' FROM information_schema.`COLUMNS` where TABLE_SCHEMA='資料庫名' order by TABLE_NAME,COLUMN_NAME
sqlserver部分
SQLserver 查詢當前庫 所有表名
SELECT Name FROM SysObjects Where XType='U' ORDER BY Name;
查詢資料庫中重複數據按照ID查詢
SELECT id FROM 資料庫名 where id<>'' GROUP BY id HAVING COUNT(*)>1
刪除一個表中各欄位完全相同情況,只留一條數據
-- delete top(1) from 資料庫名 where id =id值
解決sqlserver問題:超時時間已到。在操作完成之前超時時間已過或伺服器未響應。
1、點開菜單欄:工具
– > 選項
2、設置腳本執行超時時間(根據自己需求,0為不限制)
3、設置鏈接字元串更新時間(根據自己需求,範圍為1-65535)
Navicat Premium 16 無限試用
@echo off
echo Delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration[version and language]
for /f %%i in ('"REG QUERY "HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium" /s | findstr /L Registration"') do (
reg delete %%i /va /f
)
echo.
echo Delete Info folder under HKEY_CURRENT_USER\Software\Classes\CLSID
for /f %%i in ('"REG QUERY "HKEY_CURRENT_USER\Software\Classes\CLSID" /s | findstr /E Info"') do (
reg delete %%i /va /f
)
echo.
echo Finish
pause
遷移數據成功後遇到的問題
- 部分表數據會重複,多次嘗試遷移引起,需要手動刪除重複數據,極小概率出現,一般出現在數據量大的表;
- 部分表欄位類型會改變,遷移工具會自動轉換成SqlServer支援欄位類型,並會影響部分應用服務,使其不能正常啟動,需要開發同事定位並修改成正確類型;
- 部分表會出現沒有主鍵和索引的現象,需要自行手動添加;
- 表欄位類型及索引、主鍵修改,如果逐表修改的話,工作量會很大。
寫在最後
整個遷移過程,共耗時近兩周,比我想像中的要難得多,遇到的問題也是真的很棘手,不得不說,當數據量很大時,確實會給數據的操作帶來巨大挑戰。