都說國(guó)產(chǎn)數(shù)據(jù)庫90%兼容Oracle,為何遷移過程中總遇難題?
Q1 目前國(guó)產(chǎn)數(shù)據(jù)庫與Oracle相比主要欠缺在哪些方面?
孔再華:我所在的民生銀行正在做數(shù)據(jù)庫國(guó)產(chǎn)化改造,選型時(shí)全面分析了國(guó)產(chǎn)數(shù)據(jù)庫相比于Oracle等傳統(tǒng)商業(yè)數(shù)據(jù)庫的欠缺之處。
一、性能。我們看到目前國(guó)產(chǎn)數(shù)據(jù)庫在性能上多數(shù)會(huì)偏重于某個(gè)方向,有些是OLTP的性能較好,有些則是OLAP的性能較好,所以從HTAP的角度來說,國(guó)產(chǎn)數(shù)據(jù)庫與Oracle相比還是存在一定的差距。
但也不妨從另一個(gè)方向考慮:我們是不是因?yàn)樾阅苓@個(gè)問題才做國(guó)產(chǎn)化改造的呢?顯然不是。所以我們需要解決的是怎樣去克服數(shù)據(jù)庫國(guó)產(chǎn)化的性能問題。一方面,不同性能類型的數(shù)據(jù)庫,需要采用不同的國(guó)產(chǎn)化方案;另一方面,像分布式數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫這樣一些超融合的數(shù)據(jù)庫,也是可以“彎道超車”的地方,我們可以將自身的需求融入到這些數(shù)據(jù)庫里進(jìn)行改造和實(shí)現(xiàn)。
二、功能性。Oracle等傳統(tǒng)商業(yè)數(shù)據(jù)庫經(jīng)歷了幾十年的發(fā)展,功能已相當(dāng)成熟,周邊生態(tài)也非常完善,這些對(duì)于“年輕”的國(guó)產(chǎn)數(shù)據(jù)庫來說還有很長(zhǎng)的路要走。
在這個(gè)問題上,目前國(guó)產(chǎn)數(shù)據(jù)庫可粗略分為兩種類型,一種是研發(fā)之初就朝著接軌Oracle生態(tài)的方向,照著Oracle的功能做一遍,總體來說可能做到80%-90%,還存在一定欠缺;另一種則是跟Oracle完全不同,但其實(shí)數(shù)據(jù)庫在保障性能和主要功能的前提下,有很多功能差異是很正常的,比如Oracle和DB2就是很不一樣的兩款數(shù)據(jù)庫,所以我們也不能僅僅參照Oracle來做對(duì)比。
當(dāng)然這些功能差異也是我們需要克服的困難,對(duì)于原本用得很熟練的功能,國(guó)產(chǎn)化后我們可能需要另找一些替代方案,甚至聯(lián)合一些國(guó)內(nèi)廠商或第三方廠商去改善這些功能和生態(tài)環(huán)境。所以國(guó)產(chǎn)數(shù)據(jù)庫在功能性方面的欠缺,需要大家共同努力。
三、可用性。像Oracle這么成熟的數(shù)據(jù)庫,在每次新版本發(fā)布時(shí)都還會(huì)有大量bug的修復(fù),但由于目前國(guó)產(chǎn)數(shù)據(jù)庫的使用率還不算高,大家探坑的機(jī)會(huì)也就不多,使用起來才發(fā)現(xiàn)有不少bug也是可以預(yù)見的情況。所以在可用性這方面同樣需要大家共同努力,一起去踩坑,一起將國(guó)產(chǎn)數(shù)據(jù)庫推向更好的方向。
Q2 Oracle往往與應(yīng)用耦合度較高,遷移過程中會(huì)涉及應(yīng)用遷移和改造,如何評(píng)估改造量和改造難度?如何保障兼容性?
孔再華:這是一個(gè)非常好的問題,也是我們目前面臨的最大痛點(diǎn)。我們銀行之前在使用Oracle的過程中,在應(yīng)用開發(fā)時(shí)大量使用到Oracle提供的一些功能,國(guó)產(chǎn)化后就面臨著很大的改造難度。所以說,怎么進(jìn)行改造和遷移?怎樣評(píng)估改造難度?確實(shí)是很關(guān)鍵的問題。
我們做國(guó)產(chǎn)數(shù)據(jù)庫選型時(shí),一般會(huì)看它們對(duì)Oracle的兼容性。很多國(guó)產(chǎn)數(shù)據(jù)庫都會(huì)聲稱,自己對(duì)Oracle的兼容性能達(dá)到百分之九十幾。那到底是百分之九十幾呢?其實(shí)這個(gè)準(zhǔn)確的數(shù)據(jù)無需較真,因?yàn)槭O碌陌俜种畮滓捕际俏覀冊(cè)谶w移過程中經(jīng)常會(huì)碰到的東西,為了做好遷移工作,我們少不了需要一定的借力。
在應(yīng)用改造遷移方面,我們最大的難點(diǎn)是:怎樣評(píng)估應(yīng)用里有哪些東西是不兼容的?
這時(shí)就需要利用一些工具,比如代碼掃描工具、SQL抓取工具等。我們聯(lián)合了一些第三方的廠商,讓他們按照我們的需求開發(fā)一些工具,使用這些工具掃描代碼就能把里面的SQL全部掃描出來,或者掃描數(shù)據(jù)庫,無論是生產(chǎn)環(huán)境還是測(cè)試環(huán)境的,都可以把曾經(jīng)跑過的SQL全部找出來。當(dāng)拿到這些東西之后,我們?cè)俜诺揭粋€(gè)評(píng)估的工具里去驗(yàn)證,原來的語法是否能在新的數(shù)據(jù)庫里執(zhí)行。對(duì)于不能夠執(zhí)行的語法,則需要推薦一些建議去進(jìn)行改造。
所以這些工具的成熟與否,跟我們遷移改造的過程是否順利息息相關(guān)。工具如果好用,遷移起來就更便捷,如果不好用,那很多時(shí)候都需要人為判斷、人為尋找替代方案,甚至人為地把整個(gè)應(yīng)用進(jìn)行改造,而不僅僅是改造SQL。
在數(shù)據(jù)庫遷移方面,金融行業(yè)很多數(shù)據(jù)庫都是7*24小時(shí)工作的,我們并沒有太多時(shí)間去做離線的數(shù)據(jù)遷移,所以要評(píng)估在數(shù)據(jù)遷移的過程中,DDL的對(duì)象過去是否可行?數(shù)據(jù)離線的時(shí)間是否被允許?
關(guān)于DDL的對(duì)象,首先,從Oracle遷移到國(guó)產(chǎn)數(shù)據(jù)庫,肯定有相關(guān)材料介紹一一對(duì)應(yīng)的關(guān)系。然后,需要一個(gè)遷移工具,這個(gè)工具負(fù)責(zé)將原有Oracle里的字段類型、對(duì)象,轉(zhuǎn)換成國(guó)產(chǎn)數(shù)據(jù)庫的對(duì)象。經(jīng)評(píng)估,現(xiàn)有的開源工具和商業(yè)工具,對(duì)于我們遷移到國(guó)產(chǎn)數(shù)據(jù)庫中的一些規(guī)則類型的改造都稍顯不足,所以我們跟相關(guān)的廠商合作,把這些規(guī)則梳理好、把相應(yīng)的工具造出來,并且在我們遷移過程中不停加以完善,這個(gè)工具就會(huì)變得越來越好使。
由此,我們?cè)贒DL的轉(zhuǎn)換上問題就不大了,但接下來問題比較大的是存儲(chǔ)過程這塊,還有一些用到Oracle自身函數(shù)的東西。同樣的,我們也需要進(jìn)行詳細(xì)的梳理,然后打造相關(guān)的工具。其實(shí)我們以往不推薦大家去使用存儲(chǔ)過程,因?yàn)槭褂昧舜鎯?chǔ)過程就相當(dāng)于跟對(duì)應(yīng)的數(shù)據(jù)庫綁定了。我們一直推薦大家簡(jiǎn)單地使用數(shù)據(jù)庫,因?yàn)閿?shù)據(jù)庫作為后端最核心的一個(gè)提供服務(wù)的組件,需要很高的可用性,所以還是要盡量給數(shù)據(jù)庫減負(fù),而不是一味地依賴數(shù)據(jù)庫的這些能力。如果之前已經(jīng)這么干了,就只能通過工具,逐個(gè)發(fā)現(xiàn)不適合的地方進(jìn)行改造。如果未來自己有機(jī)會(huì)做新數(shù)據(jù)庫的開發(fā),一定要避免使用觸發(fā)器、存儲(chǔ)過程等這些跟數(shù)據(jù)庫耦合度很高的東西。
當(dāng)解決了這些問題之后,接下來就是關(guān)于數(shù)據(jù)遷移這塊。如果是從Oracle遷移到其它數(shù)據(jù)庫,可能會(huì)有些不錯(cuò)的方法可以做在線遷移。因?yàn)镺racle本身或者一些第三方廠商都具有在線遷移工具,這些工具會(huì)通過掃日志的方式同步數(shù)據(jù),然后在需要做切換時(shí),停業(yè)務(wù)同步最后一段數(shù)據(jù),切換業(yè)務(wù)到新的國(guó)產(chǎn)數(shù)據(jù)庫。
但也有可能這些工具并不支持你選用的國(guó)產(chǎn)數(shù)據(jù)庫,這種情況就需要單獨(dú)造一個(gè)離線工具進(jìn)行評(píng)估,從Oracle到國(guó)產(chǎn)數(shù)據(jù)庫里怎么改造。最好還是找廠家協(xié)助寫一個(gè)在線遷移工具,這個(gè)在線遷移最好不要落地,能夠去并發(fā)、不落地地將Oracle的數(shù)據(jù)查詢出來,放到國(guó)產(chǎn)數(shù)據(jù)庫里去。
對(duì)于一些特別大的表,我們可能還需要提高它的并發(fā),還需要工具提供單表并發(fā)的功能。通過寫一定的查詢語句,把單表里的內(nèi)容拆成更多份,然后每一份之間再進(jìn)行并行,提高遷移速度。
總體來說,做替代Oracle的國(guó)產(chǎn)化改造其實(shí)非常困難,但這注定是一個(gè)任務(wù),是一個(gè)目標(biāo),我們就是要這么去干!以上我所講述的,就是怎么在各環(huán)節(jié)采取合適的方式來加快國(guó)產(chǎn)化改造的建議,希望能對(duì)大家有所啟發(fā)。