為什么要做遷移?
由於系統版本、數據庫的升級,導致測試流程阻塞,為了保證數據及系統版本的一致性,我又迫切需要想用這套環境做性能測試,所以和領導、開發請示,得到批准后,便有了這次學習的機會,所以特此來記錄下整個過程。
使用方案:
借助工具與編碼相結合形式,備份MySQL
數據庫,並把備份數據庫還原到本地MySQL
數據庫,使用第三方工具完成數據遷移,代碼實現SQL
條數統計按照庫名和表名回寫結果,使用ultracompare
實現比對。
使用工具:
第一種遷移工具
Microsoft SQL Server Migration Assistant for MySQL
:推薦這款工具,微軟出的,但是也會有些問題,如部分表數據不能完全遷移
第二種遷移工具
Navicat Premium 12
:不推薦,速度慢,極容易失敗
第三種遷移工具
Tapdata
:這款也不錯,第三方工具,但不穩定,總內存溢出,底層Java
寫的,需要與客服溝通解決使用中問題,客服響應速度不是很理想
比對工具
ultracompare
:比對結果使用
工具使用
第一種遷移工具使用
Microsoft SQL Server Migration Assistant for MySQL
,這款工具是微軟出的,真的很好用,而且速度也算比較快。
從https://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值
刪除日志
USE [master]
GO
ALTER DATABASE 數據庫名 SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE 數據庫名 SET RECOVERY SIMPLE --簡單模式
GO
USE 數據庫名
GO
DBCC SHRINKFILE (N'數據庫名_log' , 2, TRUNCATEONLY) --設置壓縮后的日志大小為2M,可以自行指定
GO
USE [master]
GO
ALTER DATABASE 數據庫名 SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE 數據庫名 SET RECOVERY FULL --還原為完全模式
GO
修改表字段
alter table 數據庫名 alter column 字段名 字段類型(長度)
解決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支持字段類型,並會影響部分應用服務,使其不能正常啟動,需要開發同事定位並修改成正確類型;
- 部分表會出現沒有主鍵和索引的現象,需要自行手動添加;
- 表字段類型及索引、主鍵修改,如果逐表修改的話,工作量會很大。
寫在最后
整個遷移過程,共耗時近兩周,比我想象中的要難得多,遇到的問題也是真的很棘手,不得不說,當數據量很大時,確實會給數據的操作帶來巨大挑戰。