sqlserver迁移到mysql遇到的那些坑
背景
由于各種原因,成本啊、擴展性等,公司決定把線上的業務從sql server遷移到mysql RDS。
遷移過程主要包括了程序修改和數據庫的遷移。程序修改我們略過不談,我們重點關注數據庫遷移。
?
大概過程
由于是異構的數據庫,沒有找到數據實時同步的方法(若哪位大俠可以異構實時同步,還請多多指教),所有使用ETL工具定時同步數據。
同步的數據包括insert和update的數據(還好業務中沒有物理的delete)。
待萬事俱備,切換數據庫之前,再進行一次數據同步。
切換完成之后,在進行數據檢查,把最后一次同步之后,寫入到sqlserver中的數據,傳輸到mysql上。
大功告成!!!
?
那些坑
本文主要介紹遷移過程中的那些坑,主要是結構和語法上的。
1,時間戳timestamp數據類型
sqlserver和mysql都有timestamp數據類型,但是兩者的實現區別很大。
在sql server中,該類型表明數據庫中數據修改發生的相對順序,它的值本質上是一個bigint類型的一個遞增數字,與時間和日期無關,?該數字在數據庫實例級別不會重讀。
在mysql中,該類型表明數據庫中數據修改發生的相對順序, 它的本質是一個時間,該時間再表級別都有可能重復。
最坑的是該類型的字段是我們業務的關鍵字段,用于用戶從服務器上拉去數據。
最后的解決辦法,該字段的數據按照bigint的值從sql server遷移到mysql,mysql在添加一個timastamp數據類型,程序添加判斷機制。
2,字符集和emoji表情
sqlserver中默認直接可以保存emoji表情。開始遷移過程沒有注意到該問題。歷史數據遷移完畢以后,才發現該問題。omg!!
mysql中需要使用utf8mb4來保存此數據。
3,索引不能超過大小
mysql中索引長度不能超過767字節,這可是個大坑啊!!!
這個只能是優化數據類型。
比如有的字段保存設備的macid,數據類型是varchar(50),經過調研發現macid只有12位,可以修改成varchar(12)。
再有int是否可以改為tinyint或者smallint、是否可以用latin1代替utf8(當然最好是都統一使用utf8)等
這里主要就是數據類型的優化,稍后會有專門的文章來介紹數據類型優化。
4,varchar(max)類型
mysql沒有該數據類型,如果使用power designer反向工程的話,從sqlserver到mysql,該數據類型會變為char(1)。mysql中需要使用text類型。
5,常見的不兼容的語法
sqlserver中一個使用top取前幾行的數據,mysql使用limit完成此功能。這個相對還比較好修改。
兩者使用臨時表的方法也不一樣。
存儲過程和函數的格式。
6,CTE遞歸
在存在遞歸查詢的操作里,sqlserver有一個非常棒的功能就是CTE遞歸查詢。
7,over窗口查詢
sqlserver中的over窗口函數也是我非常喜歡的一個功能,比如分組排序、分組范圍等查詢。
?
轉載于:https://www.cnblogs.com/shizheyangde/p/7410816.html
總結
以上是生活随笔為你收集整理的sqlserver迁移到mysql遇到的那些坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: securecrt如何保存操作日志
- 下一篇: MySQL异步复制延迟解决的架构设计与运