記一次MSSQL到MySQL大數據遷移過程

工做中遇到一個需求 要將MSSQL數據庫中共計12張表的數據大概1000W行數據遷移到MySQL數據庫中,去年另外一個同事負責這件事情,他採用的方法是先將MSSQL數據庫裏的數據生成同MySQL數據庫表結構一致的12張表,而後用我提供的一個delphi寫的一個工具來進行遷移。工具用的UniDAC的TCRBatchMove控件批量移動數據控件,開始測試了小批量數據效果還不錯。最後在遷移數據彙總時程序運行幾個小時也沒完,還出現卡死的狀況。後來採用生成SQL語句的方式,生成出來的SQL有2G多,在查詢工具裏執行,也直接執行死了。沒辦法,把SQL分段執行吧。。。最後折騰1個星期左右才把數據導進去。
今年讓我接手這件事情,對於去年這痛苦的經歷真是往事不堪回首。此次查閱各類資料,最終解決了問題,處理數據加修正不規則數據用時20分鐘,導出導入10分鐘總計用時半個小時。不算完美,仍是很滿意了。
下面就講講此次解決問題的過程
一、開始想試試原來的方式,由於原來的程序是delphi7寫的換成xe4,並生成64位exe(保證內存不會溢出),效果沒有,速度太慢。修改批量遷移控件MovedCount 5000, 10000 DMDst.CRBatchMove.MovedCount := 5000依然沒有效果,發現MovedCount不管怎麼修改或者設置爲默認0數據插入速度均保持在1000條左右。也許是我還沒搞明白,也可能性能極限就這樣了吧。行不通 Pass
二、查閱資料發現mysql有load data能夠快速導入數據 MSSQL有sqlcmd能夠快速導出數據測試發現幾十W數據的表都是秒級導入導出。
MSSQL導出
MySQL導入
決定用這種方案試試,在進一步測試全部數據過程當中發現數據格式問題 在MSSQL導出過程當中遇到 ,英文逗號, '單引號 ,\正斜槓, /反斜槓等特殊字符時均要報錯,我導出的數據以逗號作爲分隔符,當字段數據中今有回車導出文本時會當作一條新記錄,導入時便會報字段不匹配。回車符也要處理掉,由於咱們有一個字段數據自己就要求要有回車符這個問題困擾我很長時間,開始忽略掉這個問題留到最後解決,一直沒找到解決辦法,最後換了一個思路先把在MSSQL中將回車用<br>字符替換,導入MySQL後再把<br>替換成回車字符。也算是曲線求國了。
三、這一過程測試經過後就要將全部操做集成在一個程序裏了,這最後要反覆使用的功能用在cmd裏敲命令,顯示是不現實的了。在寫成程序的過程當中又遇到各類問題,一度讓我回到從新嘗試第1種解決方案。其實這過程當中主要是遇到程序裏MySQL讀取txt路徑的問題。
 
下面是整個實現過程
配置SQL
 1 -- 容許配置高級選項
 2 EXEC sp_configure 'show advanced options', 1
 3 GO
 4 -- 從新配置
 5 RECONFIGURE
 6 GO
 7 -- 啓用xp_cmdshell
 8 EXEC sp_configure 'xp_cmdshell', 1
 9 GO
10 --從新配置
11 RECONFIGURE
12 GO
13  
14 --執行想要的xp_cmdshell語句
15 Exec xp_cmdshell 'query user'
16 GO

......處理數據表中特殊字符 代碼略......mysql

下面兩句是關鍵代碼 實現導出和導入,實際項目是10幾張表循環執行這一操做sql

sqlcmd -d DBNAME -E -o "my.ini下的datadir設置的路徑\xx.txt" -f 65001 -Q "SELECT * FROM db..xx" -W -w 8000 -s, -h-1shell

load data infile 'xx.txt' replace into table xx character set utf8 fields terminated by ',' enclosed by '"' lines terminated by '\n' (a, b);數據庫

 
 1 --用完後,要記得將xp_cmdshell禁用(出於安全考慮)
 2 -- 容許配置高級選項
 3 EXEC sp_configure 'show advanced options', 1
 4 GO
 5 -- 從新配置
 6 RECONFIGURE
 7 GO
 8 -- 禁用xp_cmdshell
 9 EXEC sp_configure 'xp_cmdshell', 0
10 GO
11 --從新配置
12 RECONFIGURE
13 GO

 

 MySQL my.ini配置以下,主要注意紅色部分
注意:sqlcmd裏面的輸出路徑爲my.in配置裏的datadir路徑,這樣MySQL的load data就不須要指定路徑會自動找到文件。
相關文章
相關標籤/搜索