
前言
近期將ERP后臺從MSSQL SERVER過渡到了MYSQL,確實經歷了一番波折,轉換程序雖然極其痛苦,這里也不賣慘了,將程序記錄一下,有人愿意的話共同學習,
前面分享過作業系統和資料庫的安裝,倒是沒啥需要注意的地方,前面說的極其痛苦,是從資料導完開始的,暫時還體會不到,本篇介紹一下如何將資料從MSSQL SERVER匯出到MySQL資料庫,
極其重要
如果各位由相同訴求,一定要先做測驗,不可在生產環境直接干活,這點特別重要!
沒有測驗成功前不可在生產環境直接干活!
沒有測驗成功前不可在生產環境直接干活!!
沒有測驗成功前不可在生產環境直接干活!!!
測驗環境搭建就不太多介紹了吧,也就是將源資料庫做個備份,找臺機器裝個相同資料庫,將備份資料導進去,這個新導進去的庫,跟源庫最大的區別是兩個,也是我們最關注的兩個:
1、資料弄壞了不影響生產系統;
2、資料庫沒有應用對其有讀寫操作,
如果生產環境想要資料導過來,最好的辦法是說服領導不要這么干,說服不了的話,至少要多次測驗,將碰到的問題,解決的方法全部記錄在案,評估通過再停機干活!
以下包括后面的文章,都是針對測驗環境的介紹,小編也是多次測驗才敢動ERP系統后臺的,
源資料分析
首先得了解一下遷移目標,我的ERP,經過了5年半的使用,現有資料表188個,記錄條數1033483條,全部都是文本記錄,沒有檔案、圖形等記錄,

打開Microsoft SQL Server Management Studio客戶端工具,連接到MSSQL資料庫后,可以通過資料庫的系統視圖里面查到資料表個數和每個資料表的記錄條數,通過新建查詢輸入下面的命令就可以拿到了,
SELECT a.name,b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE a.xtype='U' AND b.indid=1 order by a.name
干活之前,可以將這個記錄先復制到EXCEL里面,用作記錄,等遷移完成后,核對MySQL資料庫里面的資料表和記錄數,下圖是我的部分記錄表:

本次我遷移的記錄100多萬條里面,有355630條日志記錄,分別在6個日志表里面,分別是常規日志、商品日志、單據日志、單位日志、操作動作日志和錯誤日志,考慮到代碼中日志操作都在幾個函式里面,更改比較簡單,計劃將日志記錄和其他記錄分成兩個庫,這樣后期對資料庫備份遷移啥的也節約一點空間,畢竟不出問題日志記錄并不重要,因為除了日志記錄外,還有一些往來表,包括單位往來表、商品往來表、銀行往來表等等,
188個表格里面,有些表記錄數為0,有些表記錄數過萬,最少的表格欄位數2個,最多的過百,相對來說算是個較復雜的系統了,
資料遷移
資料遷移有很多方法,實際上我也試了多種方法,不過最終棄用的就不介紹了,棄用原因無非是自己英文水平太爛,自己基礎知識太薄弱等等,介紹一下最終采用的方法,
最后我選擇了SQLYOG工具,感覺用慣了微軟的SMSS工具后,還是這個工具更相似一點,
我們前面安裝資料庫的時候,順手建了兩個庫,分別是ErpDb和LogDb,打開了root賬號的遠程訪問,同時更改了資料庫的埠號,
打開SQLYOG,輸入IP地址、用戶名、密碼、埠號,連接上我們新裝上的MySQL服務器,

測驗連接正常就可以連接到MySQL了,
點擊選單【資料庫】---【匯入】---【匯入外部資料】,選擇【開始新作業】,點擊【下一步】,選擇【任何ODBC資料源】,
先創建一個連接SQL SERVER的ODBC資料源檔案,
【建立新的DSN】---【下一頁】---【下一頁】---【瀏覽】命名一個檔案名---【下一頁】---【完成】
服務器的后面輸入SQL SERVER服務器地址,如果不是默認1433埠的話,加上逗號跟上埠號,

輸入連接SQL Server的用戶名和密碼,【下一頁】,更改默認的資料庫為我們需要導資料的那個庫,【下一頁】---【完成】---【測驗資料源】---成功后【確定】,

資料源建好后,選擇該DSN檔案,輸入連接的用戶名和密碼,

輸入要匯入資料的MySQL服務器引數,選擇要匯入的資料庫名稱,點擊【下一頁】,

選擇【從資料源拷貝表】,點擊【下一頁】,選擇要拷貝的表,打勾后,點擊MAP里面查看映射情況,

這個地方有幾個建議,有些表不修改可能會不成功:
1、原表bit型別的,改為bool型別;
2、原表timestamp型別的,默認更改為blob型別,手動更改為datetime型別或者timestamp型別;
3、原表int、smallint、largeint型別的,將長度去掉;
4、原表datetime型別的,默認更改為timestamp型別,建議手動改為datetime,或者將長度去掉;

高級選項里面,存盤型別選擇InnoDB,是否匯入外鍵索引根據需要選擇,
然后直接下一步,到立即運行就可以了,
資料導完發現的問題
我的188個表,103萬條記錄,根據表大小,分了5個任務,反正一晚上搞定了,
搞定之后到MySQL里面做個檢查,為了保證準確,我對每個表做了一個檢查,命令為:
show tables;
查看表都有了,
select count(*) from XXX;
查看每個表的記錄都全了,
資料導完后,發現了很多問題,我用自己的方法一一解決了,下篇介紹出來,可能大神們對我的方法不屑,不過不噴就好,
列舉幾個:
1、MSSQL的命令,最后是沒有符號的,而MySQL名利最后是需要加分號;的,
2、MSSQL的命令,對資料表的表名、欄位名的大小寫不敏感,而MySQL對這些大小寫很敏感,
3、MSSQL的當前時間表示為GETDATE(),MySQL表示為SYSDATE(),
4、MSSQL的日期計算函式為DATEDIFF,而MySQL的日期計算函式為TIMESTAMPDIFF,
5、MSSQL里面欄位名可以用[]括起來,MySQL里面只能用(),
6、MSSQL是用top x來限制條數,MySQL是用limit x來限制條數,
7、MSSQL的欄位名相連的命令直接用+就可以了,MySQL需要用CONCAT連接字串,
作者|IT老叔
本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/Import-data-from-MSSQLServer-to-MySQL.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/547041.html
標籤:MySQL
