黃樑昌
(中國(guó)電信集團(tuán)集成股份有限公司廣西分公司,廣西 南寧 530005)
隨著信息技術(shù)廣泛融入人們的生產(chǎn)生活之中,作為信息系統(tǒng)核心的數(shù)據(jù)庫(kù)產(chǎn)品[1]也在最近一二十年得到了快速的發(fā)展。數(shù)據(jù)庫(kù)是所有IT應(yīng)用的核心,其中關(guān)系型數(shù)據(jù)庫(kù)又是現(xiàn)在最主流的數(shù)據(jù)庫(kù)產(chǎn)品。在關(guān)系型數(shù)據(jù)庫(kù)中,Oracle公司的同名關(guān)系型數(shù)據(jù)庫(kù)Oracle數(shù)據(jù)庫(kù)是市場(chǎng)占有率最高的數(shù)據(jù)庫(kù),大量的國(guó)防、金融、政府、教育、通信等行業(yè)的核心業(yè)務(wù)都構(gòu)建在Oracle數(shù)據(jù)庫(kù)之上。作為系統(tǒng)數(shù)據(jù)存儲(chǔ)的核心軟件,數(shù)據(jù)庫(kù)軟件的平均無(wú)故障時(shí)間(Mean time between failures,MTBF)[1]要求最為嚴(yán)格,重要系統(tǒng)的年計(jì)劃內(nèi)停機(jī)時(shí)間按小時(shí)甚至以分鐘計(jì),因此,必須在系統(tǒng)設(shè)計(jì)之初就加以考慮。否則,沒(méi)有任何預(yù)案下的計(jì)劃外停機(jī)導(dǎo)致的損失將會(huì)極其嚴(yán)重。
為應(yīng)對(duì)上訴情況,重要業(yè)務(wù)中數(shù)據(jù)庫(kù)系統(tǒng)的容災(zāi)已經(jīng)是目前信息系統(tǒng)建設(shè)時(shí)的一項(xiàng)必選內(nèi)容。
作為最大的數(shù)據(jù)庫(kù)產(chǎn)品提供商,Oracle數(shù)據(jù)庫(kù)提供了大量技術(shù)可以實(shí)現(xiàn)數(shù)據(jù)保護(hù)、故障切換、故障轉(zhuǎn)移等功能,Oracle統(tǒng)一稱之為高可用方案[2]。其中的Data Guard技術(shù)簡(jiǎn)單介紹如下:
Data Guard分為物理Standby和邏輯Standby兩種實(shí)現(xiàn)。物理 Standby本質(zhì)是日志傳輸和應(yīng)用重做(介質(zhì)恢復(fù)),邏輯Standby本質(zhì)上是日志挖掘(log miner)。物理Standby因?yàn)槠鋵?duì)性能影響非常小、穩(wěn)定、基本無(wú)需維護(hù),并且可以做到異地不丟數(shù)據(jù),在主節(jié)點(diǎn)發(fā)生故障的時(shí)候能夠在分鐘級(jí)甚至是秒級(jí)進(jìn)行切換提供服務(wù),因此是本文研究的重點(diǎn)。邏輯Standby的功能基本上由Streams取代,不再贅述。
某客戶的業(yè)務(wù)系統(tǒng)因?yàn)槠錁I(yè)務(wù)的重要性,需要在異地搭建一套備用系統(tǒng),其中數(shù)據(jù)庫(kù)使用 Oracle Data Guard作為容災(zāi)系統(tǒng)。在生產(chǎn)中,通常數(shù)據(jù)庫(kù)服務(wù)器只安裝數(shù)據(jù)庫(kù),因此為了方便標(biāo)識(shí),本項(xiàng)目主庫(kù)所在的主機(jī)的hostname和主庫(kù)的dbname、sid、server name等均統(tǒng)一命名為pdb(Primary Database),同樣,備庫(kù)的系統(tǒng)和數(shù)據(jù)庫(kù)等也相應(yīng)命名為sdb(Standby Database)。表1具體規(guī)劃了某異地容災(zāi)項(xiàng)目中的參數(shù)配置。

表1 Data Guard 規(guī)劃
業(yè)務(wù)流程如下:

圖1 Data Guard業(yè)務(wù)流程
在開(kāi)始Data Guard的配置之前,主庫(kù)的操作系統(tǒng)、Oracle Database軟件以及數(shù)據(jù)庫(kù)均已經(jīng)安裝完畢;備庫(kù)安裝好操作系統(tǒng)和Oracle Database軟件,不需建庫(kù)。
對(duì)于操作系統(tǒng)的安裝和數(shù)據(jù)庫(kù)軟件本身的安裝可以參考[3]。
配置 Data Guard之前,主庫(kù)需要修改一些參數(shù)以符合Data Guard的實(shí)施要求:
Forced Logging模式下,數(shù)據(jù)庫(kù)會(huì)記錄更改的所有信息。啟用這一模式才能保證備庫(kù)能夠和主庫(kù)的配置完全同步。在sqlplus中啟用Forced Logging的命令如下:
SQL> alter database force logging;
同一個(gè)Data Guard中,所有的數(shù)據(jù)庫(kù)必須擁有獨(dú)立的配置文件,并且其 SYS密碼相同,這樣才能保證日志的順利傳輸。使用oracle用戶在操作系統(tǒng)中產(chǎn)生密鑰文件的命令如下:
$ orapwd file=<fname> password=<password>
該命令會(huì)在 fname的位置生成文件指定的文件,<password>為系統(tǒng)SYS用戶的密碼。
最大保護(hù)和最大可用性模式需要備重做日志,Data Guard從備重做日志比單獨(dú)從歸檔重做日志文件能恢復(fù)和應(yīng)用更多重做數(shù)據(jù)。
雖然備重做日志只有在數(shù)據(jù)庫(kù)運(yùn)行在備角色時(shí)才使用,Oracle 建議在主數(shù)據(jù)庫(kù)上創(chuàng)建一個(gè)備重做日志,使得主數(shù)據(jù)庫(kù)能快速切換到備角色而不需要額外的DBA干涉。
首先查詢目前的重做日志信息:

目前有三個(gè)重做日志組,備重做日志組數(shù)量由如下公式確定:
備重做日志組數(shù)量=(每個(gè)線程的日志文件的最大數(shù)目+1)×線程最大數(shù)目
由于未使用RAC,因此線程取1,需要建立的備重做日志組為 4組。備重做日志文件的大小需要和重做日志文件大小完全一致。同時(shí)為了統(tǒng)一管理,將備重做日志和重做日志放在相同位置。
創(chuàng)建的命令示例如下:
sql> alter database add standby logfile('/u01/app/oracle/data/pdb/st01.log') size 50m;
database altered.
……
只有在歸檔模式下,數(shù)據(jù)庫(kù)才會(huì)產(chǎn)生歸檔日志。開(kāi)啟歸檔的命令序列如下:

通過(guò)修改主庫(kù)的初始化參數(shù),就可以將主庫(kù)配置為Data Guard的一部分。本例中單向Data Guard主庫(kù)需要修改或確認(rèn)的初始化參數(shù)如下:


完成上述配置,主庫(kù)的初始化參數(shù)配置完畢。
3.4.1 備份數(shù)據(jù)文件
RMAN> backup database;
3.4.2 由主庫(kù)的初始化文件 spfile生成備庫(kù)的初始化文件pfile,修改相應(yīng)的初始化參數(shù)。首先生成可編輯的pfile:
3.4.3 由主庫(kù)的控制文件生成備庫(kù)的控制文件
SQL> alter database create standby controlfile as '/u01/control01.ctl';
3.4.4 使用rman創(chuàng)建備份數(shù)據(jù)庫(kù)
(1)按照備庫(kù)的初始化參數(shù)文件指定的位置建立相應(yīng)的文件夾,之后將4.4.1至4.4.3三步得到的文件復(fù)制到備庫(kù)對(duì)應(yīng)的位置,其中備份文件在備庫(kù)的目錄位置需要和主庫(kù)完全一樣.
(2)按表1的規(guī)劃使用netca和netmgr配置對(duì)應(yīng)的監(jiān)聽(tīng)服務(wù)相關(guān)的文件listener.ora和tnsname.ora
(3)由修改好的pfile生成spfile,啟動(dòng)到nomount狀態(tài):

(4)使用 rman登錄主庫(kù),使用備份文件恢復(fù)到備庫(kù)創(chuàng)建備庫(kù):
$ rman target / auxiliary sys/oracle@sdb
RMAN> duplicate target database for standby;
3.4.5 備庫(kù)開(kāi)始接受歸檔并應(yīng)用
SQL> alter database recover managed standby database using current logfile disconnect from session;
Oracle Data Guard搭建完成。可以通過(guò)監(jiān)控日志的傳輸情況對(duì)主庫(kù)進(jìn)行DML、DDL操作,驗(yàn)證Data Guard的配置。

Oracle Data Guard是Oracle數(shù)據(jù)庫(kù)提供的免費(fèi)的故障轉(zhuǎn)移、容災(zāi)解決方案。該方案的優(yōu)點(diǎn)是對(duì)系統(tǒng)影響小、配置完成后易于維護(hù),同時(shí)因?yàn)槿罩緜鬏敺?wù)是基于網(wǎng)絡(luò)的,可以提供數(shù)據(jù)庫(kù)級(jí)別的異地容災(zāi),同時(shí)結(jié)合應(yīng)用系統(tǒng)即能夠?qū)崿F(xiàn)業(yè)務(wù)層的容災(zāi)。合理的配置下,Data Guard還能做到不丟失數(shù)據(jù)。因此,Oracle Data Guard是企業(yè)級(jí)系統(tǒng)數(shù)據(jù)保護(hù)、容災(zāi)方案的熱門選項(xiàng)。
[1] Abraham Silberschatz,Henry F.Korth and S. Sudarshan.Database System Concepts[M].New York:McGraw Hill. 2010.
[2] Scott Jesse, Bill Burton and Bryan Vongray. Oracle Database 11g Release 2 High Availability: Maximize Your Availability with Grid Infrastructure, RAC and Data Guard[M]. New York:McGraw Hill.2011.
[3] Ian Abramson, Michael Abbey and Michael Corey. Oracle Database 11g A Beginner's Guide[M].New York:McGraw Hill.2008.