數(shù)據(jù)庫(kù)兼容性該如何分析

做數(shù)據(jù)庫(kù)替代,兼容性分析是其中的第一個(gè)步驟,很多用戶(hù)這一步?jīng)]有認(rèn)真做,真正開(kāi)始做數(shù)據(jù)庫(kù)替代的時(shí)候就會(huì)遇到一個(gè)一個(gè)的坑,填起來(lái)相當(dāng)累。如果應(yīng)用系統(tǒng)是重新構(gòu)建,或者有足夠的經(jīng)費(fèi)進(jìn)行應(yīng)用重構(gòu),那么兼容性問(wèn)題不算個(gè)大問(wèn)題,如果你想省點(diǎn)錢(qián),那么兼容性分析還是要做得周到一些比較好。

本文來(lái)自微信公眾號(hào)“白鱔的洞穴”,作者/白鱔。

做數(shù)據(jù)庫(kù)替代,兼容性分析是其中的第一個(gè)步驟,很多用戶(hù)這一步?jīng)]有認(rèn)真做,真正開(kāi)始做數(shù)據(jù)庫(kù)替代的時(shí)候就會(huì)遇到一個(gè)一個(gè)的坑,填起來(lái)相當(dāng)累。如果應(yīng)用系統(tǒng)是重新構(gòu)建,或者有足夠的經(jīng)費(fèi)進(jìn)行應(yīng)用重構(gòu),那么兼容性問(wèn)題不算個(gè)大問(wèn)題,如果你想省點(diǎn)錢(qián),那么兼容性分析還是要做得周到一些比較好。

數(shù)據(jù)庫(kù)兼容性分析首先要分析字符集和時(shí)區(qū)等“小問(wèn)題”,說(shuō)是小問(wèn)題,實(shí)際上也是容易被忽略的。國(guó)產(chǎn)數(shù)據(jù)庫(kù)一般都會(huì)支持我們所需要的時(shí)區(qū)和字符集,因此測(cè)試一下數(shù)據(jù)導(dǎo)入后的生僻字是否能正常顯示基本上字符集的問(wèn)題就不大了。不過(guò)如果今后存在新舊數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交換的場(chǎng)景,那么生僻字在數(shù)據(jù)交換中是否能夠正確被復(fù)制過(guò)來(lái)也是要去認(rèn)真測(cè)試一下的。如果存在dblink訪問(wèn),還需要測(cè)試一下dblink中是否能正確的讀寫(xiě)生僻字。

時(shí)區(qū)的測(cè)試也是類(lèi)似,如果你的系統(tǒng)不存在多時(shí)區(qū)數(shù)據(jù)交換的問(wèn)題,那么測(cè)試一下數(shù)據(jù)導(dǎo)入后時(shí)間是否正確,以及在DBLINK訪問(wèn)時(shí)獲取的遠(yuǎn)端時(shí)間是否存在時(shí)區(qū)偏差就可以了。存在多時(shí)區(qū)數(shù)據(jù)交換的問(wèn)題的用戶(hù),那么就要認(rèn)真測(cè)試一下多時(shí)區(qū)轉(zhuǎn)換是否正常。

第二個(gè)需要分析的是數(shù)據(jù)類(lèi)型的兼容性。數(shù)據(jù)類(lèi)型的兼容性是最重要的一環(huán),Oracle數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型十分豐富,一般國(guó)產(chǎn)數(shù)據(jù)庫(kù)很難做到數(shù)據(jù)類(lèi)型的一對(duì)一兼容,大部分從Oracle向國(guó)產(chǎn)數(shù)據(jù)庫(kù)遷移時(shí)都存在類(lèi)型轉(zhuǎn)換的問(wèn)題。其中最主要的是PFILE、XMLTYPE等數(shù)據(jù)類(lèi)型。如果你的系統(tǒng)是90年代末開(kāi)發(fā)的,那么有一定的概率會(huì)使用嵌套表或者自定義類(lèi)型。如果這樣,目前恐怕沒(méi)有哪個(gè)國(guó)產(chǎn)數(shù)據(jù)庫(kù)能夠完全支持,此類(lèi)應(yīng)用最好的選擇是暫時(shí)不要遷移了。因?yàn)楹芸赡荛_(kāi)發(fā)商都已經(jīng)找不到了,而且應(yīng)用遷移時(shí),PL/SQL的兼容性也是十分成問(wèn)題的,因?yàn)閲?guó)產(chǎn)數(shù)據(jù)庫(kù)雖然有不少兼容oracle的PL/SQL,但是自定義類(lèi)型好像都不支持。在測(cè)試數(shù)據(jù)類(lèi)型的兼容性時(shí),如果你存在nchar/nvarchar等類(lèi)型,那么就要十分小心了,編碼上的差異可能會(huì)導(dǎo)致數(shù)據(jù)遷移過(guò)來(lái)會(huì)不一樣,另外此類(lèi)環(huán)境中,如果還需要和老系統(tǒng)進(jìn)行數(shù)據(jù)復(fù)制,那么數(shù)據(jù)復(fù)制工具是否能夠完成自動(dòng)轉(zhuǎn)換也是一個(gè)需要認(rèn)真測(cè)試的內(nèi)容。另外還要注意char字段的填充問(wèn)題等一系列小問(wèn)題。

第三個(gè)需要分析的是索引,Oracle數(shù)據(jù)庫(kù)的索引其實(shí)很簡(jiǎn)單,不外乎B樹(shù)(包含反轉(zhuǎn)鍵、函數(shù)索引等變種)、位圖、位圖連接索引等幾種。因此在索引方面哪怕兼容性不高,也大多數(shù)能夠找到解決方案。索引的問(wèn)題大部分會(huì)涉及到性能問(wèn)題,另外就是不同數(shù)據(jù)庫(kù)的索引在處理空值方面會(huì)有些不同。如果有些特殊的應(yīng)用,那么需要換種方法來(lái)提高性能。

第四個(gè)需要分析的是序列號(hào)、自增字段、物化視圖、觸發(fā)器、全局臨時(shí)表等特殊功能。Oracle和國(guó)產(chǎn)數(shù)據(jù)庫(kù)會(huì)有些不同,有些時(shí)候需要通過(guò)修改應(yīng)用來(lái)適應(yīng)新的數(shù)據(jù)庫(kù)。不過(guò)一般來(lái)說(shuō)大部分國(guó)產(chǎn)數(shù)據(jù)庫(kù)都具有類(lèi)似的功能,哪怕沒(méi)有的話,也可以通過(guò)一些技術(shù)手段來(lái)實(shí)現(xiàn),只不過(guò)這種外掛式實(shí)現(xiàn),性能方面可能會(huì)存在一些問(wèn)題。

第五個(gè)方面是事務(wù)隔離級(jí)別和MVCC的兼容性。分布式數(shù)據(jù)庫(kù)在事務(wù)隔離級(jí)別上和Oracle有所不同,一般情況下我們的應(yīng)用只使用read commited事務(wù)隔離級(jí)別,這是幾乎所有數(shù)據(jù)庫(kù)都必須支持的事務(wù)隔離級(jí)別。不過(guò)如果你的應(yīng)用用到了其他的事務(wù)隔離級(jí)別,正巧你又想使用分布式數(shù)據(jù)庫(kù),那么你就要認(rèn)真測(cè)試下你的目標(biāo)數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別和你目前在Oracle上用的事務(wù)隔離級(jí)別是否完全一致。

第六個(gè)方面是SQL語(yǔ)法的兼容性,Oracle并不十分嚴(yán)格的遵循SQL 1999等國(guó)際規(guī)范,而且早期的Oracle數(shù)據(jù)庫(kù)版本中存在大量的自己風(fēng)格的SQL。不過(guò)如果你的應(yīng)用能夠修改,那么這些問(wèn)題也并不太大,不兼容的SQL的數(shù)量一般來(lái)說(shuō)不會(huì)太多。見(jiàn)到最大不兼容的是dual表、insert select等語(yǔ)法方面的不同,還有就是序列號(hào)的取法,一般來(lái)說(shuō)解決起來(lái)并不困難。另外要注意的是,如果你的應(yīng)用中有不少統(tǒng)計(jì)分析方面的SQL,那么要注意的是統(tǒng)計(jì)函數(shù)和窗口函數(shù)方面的兼容性,你用到的統(tǒng)計(jì)函數(shù)和窗口函數(shù)有可能在某些國(guó)產(chǎn)數(shù)據(jù)庫(kù)中并不支持。

第七個(gè)方面是hint、sql profile等優(yōu)化SQL執(zhí)行計(jì)劃的能力,這種能力是必須的。因?yàn)橄到y(tǒng)遷移后可能會(huì)有一些SQL無(wú)法生成好的執(zhí)行計(jì)劃,從而導(dǎo)致性能無(wú)法滿(mǎn)足應(yīng)用需要。此時(shí)只能通過(guò)這些手段去做優(yōu)化。Hint的功能與有效性都是需要認(rèn)真去分析的,這些保命的手段如果不能起作用,那么系統(tǒng)切換后就麻煩大了。

第八個(gè)方面是PL/SQL的兼容性,目前國(guó)產(chǎn)數(shù)據(jù)庫(kù)有不少都支持類(lèi)似ORACLE PL/SQL的語(yǔ)法,不過(guò)大部分只能支持常用的簡(jiǎn)單語(yǔ)法,語(yǔ)法支持度不超過(guò)80%,一般在60-70%之間。如果你的應(yīng)用使用的都是PL/SQL的常見(jiàn)功能,那么今后改造起來(lái)工作量也不大。甚至有些國(guó)產(chǎn)數(shù)據(jù)庫(kù)并不具備PL/SQL,但是有存儲(chǔ)過(guò)程轉(zhuǎn)換工具。你的應(yīng)用并不是重度使用存儲(chǔ)過(guò)程,那么遷移的工作量也還是可以接受的。

第九個(gè)方面是表連接的方式與限制條件。Oracle在NESTED LOOP/HASH JOIN/SORT MERGE JOIN等方面的能力超強(qiáng),國(guó)產(chǎn)數(shù)據(jù)庫(kù)或多或少都會(huì)存在一些問(wèn)題。有些SQL雖然不經(jīng)過(guò)修改就能夠在國(guó)產(chǎn)數(shù)據(jù)庫(kù)上跑,不過(guò)性能恐怕不盡如人意,必須進(jìn)行改寫(xiě)。你需要把你們業(yè)務(wù)系統(tǒng)中的一些常用的表連接比較復(fù)雜的SQL或者各種種類(lèi)的表連接SQL都在新數(shù)據(jù)庫(kù)上用模擬真實(shí)數(shù)據(jù)的數(shù)據(jù)量跑一跑,看看那些SQL在執(zhí)行計(jì)劃上存在問(wèn)題,必須改寫(xiě),并根據(jù)需要改寫(xiě)的數(shù)量評(píng)估是否可以接受這種數(shù)據(jù)庫(kù)。

第十個(gè)方面是數(shù)據(jù)庫(kù)導(dǎo)入導(dǎo)出、備份/恢復(fù)等方面的基本能力,是否與你目前的備份環(huán)境相兼容。

第十一個(gè)方面是高可用切換的便捷性與RTO/RPO方面的指標(biāo),數(shù)據(jù)庫(kù)廠商標(biāo)稱(chēng)的數(shù)據(jù)只是考慮了十分有限的場(chǎng)景,而你的應(yīng)用場(chǎng)景很可能有所不同。如果有條件的話模擬生產(chǎn)環(huán)境做一做測(cè)試還是十分必要的。

第十二個(gè)方面是系統(tǒng)包的兼容性,一般來(lái)說(shuō),國(guó)產(chǎn)數(shù)據(jù)庫(kù)的系統(tǒng)包和Oracle存在較大的差別,如果你的應(yīng)用重度使用Oracle系統(tǒng)包,那么遷移工作還是會(huì)增加一些工作量的。不過(guò)這方面一般還是比較容易解決,通過(guò)自行編寫(xiě)一組和Oracle接口兼容的系統(tǒng)包,就可以解決這個(gè)問(wèn)題。只是會(huì)增加一定的工作量了。比較麻煩的是dbms_client_info這樣的包,Oracle的這個(gè)包可以修改會(huì)話的信息,如果你的應(yīng)用中有這方面的需求,那么可能會(huì)麻煩一些。

第十三個(gè)方面是安全方面的問(wèn)題,比如透明數(shù)據(jù)加密、客戶(hù)端SSL連接服務(wù)器等,這些特性并不是所有國(guó)產(chǎn)數(shù)據(jù)庫(kù)都支持。如果你的應(yīng)用必須這些特性,那么就會(huì)減少可以選擇的數(shù)據(jù)庫(kù)的種類(lèi)了。

應(yīng)用遷移中大家都希望找一個(gè)兼容性好的數(shù)據(jù)庫(kù)產(chǎn)品,不過(guò)兼容性分析是個(gè)細(xì)活,在分析和選擇過(guò)程中也會(huì)有很多坑。如果你有大量的系統(tǒng)要遷移,那么這項(xiàng)工作還是做得仔細(xì)一點(diǎn)為好。上面的十幾個(gè)點(diǎn)也是今早坐在電腦前臨時(shí)起意寫(xiě)的,可能有些遺漏,如果有朋友發(fā)現(xiàn)還有一些重點(diǎn)的遺漏,請(qǐng)留言告知,我會(huì)繼續(xù)整理一個(gè)更為完整的清單。

THEEND

最新評(píng)論(評(píng)論僅代表用戶(hù)觀點(diǎn))

更多
暫無(wú)評(píng)論