從Oracle遷移到MySQL需要考慮的事情其實遠比我們要理清數據類型轉換這些技術細節要多,也更重要。
有兩個問題需要前置考慮:
為什么要從Oracle遷移出去?
為什么要遷移到MySQL
如果解答了上述的兩個問題,也就基本理順了整個事情的脈絡,我會本著基本客觀的態度來說明。
問題1:為什么要從Oracle遷移出去?
這件事情從行業的實踐來看(主要是說互聯網行業),絕對不是先從技術可行性觸發,而是從業務可行性來入手,歸根結底,主要的出發點就兩個字:成本。
MySQL開源免費,更重要的是行業實踐驗證充分,所以它具有得天獨厚的優勢。阿里多年前的去IOE風風火火,儼然成為了行業的標桿。
成本的事情很微妙,三言兩語說不清。舉例來說,你可以使用Office來辦公,當然你可能考慮買授權或者綠色版激活,但是如果使用WPS就是名正言順的事情,當然功能上是和Office有一些差距,但是不會存在一些模糊的邊界。
從業務的另一個維度來看,試想我們所接觸的互聯網行業,很多業務除了充值和錢相關的業務,其實對于數據完整性一致性的要求就會降低一個維度,很多時候錢能解決的問題都不是問題,比錢更重要的是什么,我覺得應該是安全,安全包括生命安全,行業安全,系統安全,這些絕對不允許出一些重大問題的,這些影響面太大,比如醫院醫生給患者開藥的數據,這些影響面是很大的,一旦出問題很容易成為公眾事件。而以金融級業務作為一個分界點,之上的是安全領域,之下的領域其實就是一些可選擇的空間了,這些空間很大。選擇商業的一個原因也在此,有技術兜底,這些成本對企業來說也是需要和廠商的綁定關系。稀里糊涂硬上,出了問題找不到專業的快速支持,那就悲劇了。
然后是開源定制,其實很多開源技術的開源協議是有差別的,我們采用開源技術也需要考慮這些協議的邊界和適用范圍。
所以到此需要明確的是:
1.成本因素需要權衡,絕對不是非黑即白的事情
2.遷移到MySQL其實不是終極解決方案,只是一種可選的方案
3.對開源技術積累足夠,技術把控能力要強
4.遷移的本質是找到最適合的業務場景,而不是為了技術實現而實現
對于第4點,舉個例子,Oracle從性能上是毫無疑問的,但是如果有海量的讀請求,其實就不適合Oracle來扛了,當然也不適合用MySQL,可能Redis的方案會更好一些。
問題2:為什么要遷移到MySQL
要回答這個問題,其實我們的主線就是MySQL可以做什么。
第一還是成本,開源免費,方便定制,MySQL的可選方案可絕對不只有社區版,還有一系列的分支,比如Percona分支,MariaDB分支,存儲引擎InnoDB,MyRocks等統統都是免費可選。
第二是MySQL效率高,足夠輕量級。MySQL的效率從使用上來說,學習周期會很短,容易上手,而且對于系統的資源要求不高。
第三是水平擴展能力,把Oracle比作地鐵,MySQL比作公交車會更容易理解,我們可以很輕松的加開公交專線,但是加開地鐵線路那就完全不同了。我覺得這是遷移到MySQL的一個核心點,這也就是為什么很多互聯網的MySQL規模動輒幾百幾千了,爆發式增長的業務,MySQL擴展能力了不是體現在MySQL數據庫本身,而是對于架構的擴展性上,而這也就是為什么很多MySQL DBA比較貴的一個原因。
第四是復制,這是MySQL相比Oracle的一個亮點,如果需要做跨數據中心的復制,允許存在一定的延遲,使用MySQL原生的復制方案是一件很容易的事情,MySQL支持很多不同維度的復制方案。
第五是業務輕依賴,這個可以分為兩個維度來說。一個是功能限制,一個是性能限制。這本身是MySQL功能和性能上的缺失,但是反而是一個優點因為要支撐分布式需求,需要業務對數據庫的依賴要更輕巧一些,原本支持不好的存儲過程就可以很自然的弱化了。
第六是開源帶來的生態體系,開源紅利帶給企業的是很多的技術方案選擇,讓原本需要花錢買的事情變成了我們干我們用。
問題3:從Oracle遷移到MySQL需要考慮的事情
首先是架構的差異,在oracle和MySQL里面的差異還是比較大的,當然Oracle里面也是可以使用同義詞的架構來實現類似MySQL的訪問模型的。
數據類型的差異其實是比較具體的技術細節,我舉一些補充的。
oracle里面的Null和空串都可以按照null來處理,但是MySQL里兩者是不同的。
oracle表名,用戶名都是有長度限制,在30個字符以內,在MySQL里長度要大得多,尤其是表名就需要注意了。
oracle里會默認統一按照大寫來處理,MySQL里面默認是大小寫敏感的。
對于MySQL類型在MySQL里需要考慮的細節較多,比如數值型,oracle里面number搞定,MySQL有一系列的數值類型可以選擇,不建議大一統的big int適配所有需求。
要更清晰的回答注意事項,可以歸類為一個問題:MySQL相比Oracle少了些什么?
性能上肯定有差異,我們主要理一理功能上的。比較的原則不是說oracle有一定要MySQL有,而是從一些使用場景上來說更好的使用特性。
存儲過程支持有限,這是很多企業的技術債,處理好了是坦途,處理不好是大坑。比如存儲過程,硬要用存儲過程調用來對接,后期后患無窮。
沒有同義詞
沒有db link,這個特性MySQL里不支持其實是件好事,杜絕了那種跨庫關聯的需求。
沒有sequence,這個MySQL的自增列完全可以彌補。
沒有物化視圖,難以實現增量刷新的需求。
分區表有,但是很少用
優化器薄弱,多表關聯,Hash Join在MySQL里還是一個弱項。
索引的差異,覆蓋索引的實現兩者差異也很大。
綁定變量的性能差異不大,Oracle里面敏感的綁定變量問題在MySQL里不是問題。
性能工具,MySQL里面的性能工具還是比較少的,而且粒度和效果有限。
小結一下:
遷移的本質是找到最適合的業務場景,而不是為了技術實現而實現