近期將ERP後臺從MSSQL SERVER過渡到了MYSQL,確實經歷了一番波折,轉換過程雖然極其痛苦,這裡也不賣慘了。將過程記錄一下,有人願意的話共同學習。 前面分享過操作系統和資料庫的安裝,倒是沒啥需要註意的地方,前面說的極其痛苦,是從數據導完開始的,暫時還體會不到,本篇介紹一下如何將... ...
前言
近期將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