1. 程式人生 > >sqlserver遷移到mysql遇到的那些坑

sqlserver遷移到mysql遇到的那些坑

成本 背景 varchar 是否 pda strong 和數 bigint 調研

背景

由於各種原因,成本啊、擴展性等,公司決定把線上的業務從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窗口函數也是我非常喜歡的一個功能,比如分組排序、分組範圍等查詢。

sqlserver遷移到mysql遇到的那些坑