大家可能都知道在進行Oracle數據庫版本升級的時候會有2種方式
1.通過dbua(database upgrade assistant)
2.exp/imp
通過dbua來升級的話由於不涉及到數據文件的改變,所以速度會比較快,但是如果dbua一旦在升級的過程中出現問題可能會導致原來的庫不可用。
而通過exp/imp雖然對原來的庫不會有影響,但是如果數據庫比較大的話那麼升級的時間將會是不可接受的(尤其對24*7)的應用來說。
針對這個問題,這次的2006 Oracle openworld法國的amadeus公司提供了一個非常有創意的點子,就是利用dataguard和transport tablespace功能來實現最短時間內的安全升級。
首先讓我們來了解一下amadeus公司
艾瑪迪斯全球旅游分銷系統公司(Amadeus Global Travel Distribution SA)是全球領先的旅游行業技術及分銷供應商。1987年艾瑪迪斯總部建立於西班牙馬德裡。在 Sophia Antipolis(法國尼斯附近)和美國波士頓設立有市場及開發部門。公司的數據中心位於德國慕尼黑附近的Erding。公司提供各種先進的旅游行業技術解決方案,至今已成為成長最快並被最廣泛使用的全球分銷系統(GDS)。
作為卓越的技術合作伙伴,艾瑪迪斯把最先進的信息技術帶入旅游行業,使眾多的旅游供應商、休閒及商務旅游服務商從中獲益。通過設立服務於當地市場的national marketing companIEs(NMCs),艾瑪迪斯用其龐大的信息技術資源向全世界200個國家和地區提供優質的技術解決方案。
我們再來看一下跟它們的數據庫相關的信息
他們的業務系統達到99.99%的可用率,每秒鐘有30萬次的數據庫請求,每天有2億8千萬次transaction,這是一個相當大的數據庫系統,如果用dbua或者exp/imp他們都不能接受升級的風險,於是他們的技術人員就想出了用dataguard和transport tablespace功能來實現最短時間內的安全升級。
具體的實現方法是這樣的
1.先為主庫建立一個dataguard數據庫(可以在線做)
2.在dataguard庫上安裝10g軟件(可以在線做)
3.整理一些不能通過transport tablespace搞定的東西,比如sequence,synonyms,grants......
4.停止主庫這邊所有write的應用,提供read的服務(寫入停止,提供查詢)
5.強制歸檔主庫redo log並傳到dataguard恢復(寫入停止,提供查詢)
6.利用transport tablespace來轉換數據庫版本,並創建sequencee,synonyms,grants等(寫入停止,提供查詢)。
7.驗證新環境的過程,在驗證過程中如果發現有問題,則可以切換會原來的系統(寫入停止,提供查詢)。
8.切換應用到10g數據庫(提供服務)
amadeus在演習時做到10分鐘內完成4,5,6,7並成功切換了系統,考慮到他們的數據庫繁忙程度和數據庫容量非常大,這真是一項偉大的成就。我們可以在以後的數據庫版本的升級過程中借鑒他們的方法。
我們再從技術上驗證一下transport tablespace可以運用在版本升級
在9i的庫上創建一個test tablespace
create tablespace test
datafile '/opt/Oracle/test.dbf' size 10m
extent management local autoallocate;
創建一張表在test表空間上
create table test1(a number) tablespace test;
insert into test1 values(1);
commit;
SQL 9i>select * from test1;
A
----------
1
把test表空間置為read only模式
alter tablespace test read only;
到處test tablespace的metadata
exp 'sys/sys as sysdba' transport_tablespace=y tablespaces=(TEST) file=test.dmp log=test.log
傳輸dmp文件和數據文件(在amadeus的案例裡面由於10g的庫和9i的庫在同一台機器上,所以避免了拷貝數據文件的時間,這也是整個方案的重點之一)到遠程
scp test.dmp [email protected]:/opt/Oracle/
scp /opt/oracle/test.dbf [email protected]:/opt/Oracle/
在目標庫上導入metadata數據
imp 'sys/sys as sysdba' transport_tablespace=y tablespaces=(TEST) file='/opt/Oracle/test.dmp' datafiles=
('/opt/Oracle/test.dbf') tts_owners=test fromuser=test touser=test log=tts_i.log
查看test1表,發現數據一致
SQL 10G>select * from test1;
A
----------
1
把test表空間置為read write模式
alter tablespace test read write;
insert into test1 values(2);
SQL 10G>select * from test1;
A
----------
1
2
一切正常,測試完畢
這個測試簡單的模仿了transport tablespace升級數據庫的可能性,當然在實際過程中我們要校驗是否自包含表空間,是否需要創建sequence等,但是總體來說這種方案能提供最短時間內的數據庫版本升級。