對於Oracle10g的可傳輸表空間特性而言,我覺著最另人興奮的就是跨平台的傳輸了(盡管仍非所有平台都支持)。這意味著一旦數據庫涉及到操作系統平台的變更,再不用像之前那樣通過exp/imp這類慢的要死的應用來操作了。更加值的慶幸的是,轉換這個操作並不復雜,歸根結底,它只是一個命令(撓頭,難道真的只有一個嗎,不像oracle風格啊,Oracle一向是喜歡出選擇題的),是的,只有一個--CONVERT。
CONVERT是RMAN中提供的一個命令,專門用於進行字節順序轉換的解決方案,其語法如圖所示:
由上圖可見,CONVERT命令可以轉換數據文件、表空間甚至整個數據庫的字節順序,
l CONVERT TABLESPACE:用於在源庫轉換指定表空間的數據文件(第3步執行)。
l CONVERT DATAFILE:用於在目標庫轉換數據文件到目標平台(第4步執行)。
l CONVERT DATABASE:用於從源平台轉換及傳輸整個數據庫到目標平台,並確保創建需要的數據文件,視你的需求即可以在源庫執行也可以在目標庫執行。
CONVERT DATAFILE和CONVERT TABLESPACE還可用於操作ASM(Automatic Storage Management自動存儲管理)文件的移入移出,這項功能用處極大,因為眾所周知通常操作系統的命令例如Unix系統的cp或Windows系統的copy等命令是不能直接讀寫ASM中文件。要想操作ASM中文件,只有RMAN,這可是真正的華山一條路,捨它其誰。
沒有CONVERT是不行的,但是CONVERT也不是萬能的。
1、對於CONVERT DATAFILE, CONVERT TABLESPACE以及CONVERT DATABASE的所有應用,需要注意:
l CONVERT操作並不會改變源文件,轉換操作也並不是在本地完成,而是直接寫入目的地。
l 源庫和目標庫的初始化參數中COMPATIBLE參數至少被設置為10.0
l 在10g之前,CLOB字段做為變長字符集創建,CONVERT命令並不會轉換這些列,而直接將其傳輸到目標庫。直到後續有讀取操作時,自動將其轉換為目標字節順序格式並保存。10g之後CLOB列的字符集被設置為AL16UTF16,完全平台無關,所以就更加不用考慮了。
l CONVERT命令並不會轉換用戶自定義的數據類型。如果你希望在數據庫之間傳輸平台指定格式的映射對象,應該調用Data Pump。
l 在傳輸到其它平台之前,要傳輸的表空間至少要被置為read-write狀態一次(為什麼?因為數據文件的文件頭必須能夠識別其所屬的原平台是什麼)。因此對於那些read-only的待傳輸表空間,你必須先將其置為read-write,然後再置為read-only。
2、對於CONVERT DATAFILE和CONVERT TABLESPACE操作的一些注意事項:
l 如果在源庫平台操作,必須使用CONVERT TABLESPACE... TO PLATFORM,不能使用CONVERT DATAFILE轉換個別數據文件。而如果是在目標庫平台操作,則必須使用CONVERT DATAFILE... FROM PLATFORM... TO PLATFORM而不能用CONVERT TABLESPACE。因為目標庫還沒有表空間的信息,自然也找到其對應的數據文件。
l FORMAT和DB_FILE_NAME_CONVERT參數可以同時使用,也可以都不使用,如果兩個參數都不使用的話,目標平台中的文件路徑會默認引用源平台中的路徑。
l 並非所有的平台都支持CONVERT,通過查詢V$TRANSPORTABLE_PLATFORM視圖確認所操作的平台是否支持CONVERT命令。要跨平台的傳輸表空間必須源和目標平台都在視圖中的平台列表才可以。
l 由於操作系統命令不支持直接操作文件到ASM,你可以通過CONVERT TABLESPACE或CONVERT DATAFILE移動文件到ASM中即使不涉及endian format的轉換。使用CONVERT命令可以提供與操作系統的copy操作等同的功能,所不同的是CONVERT操作的是ASM。
3、對於CONVERT DATABASE的操作,除了上述第1條中的限制外,還有些其它的注意事項:
對於傳輸整個數據庫而言最主要的一個限制是源平台和目標平台必須擁有相同的endian format(只能有限跨平台了)。例如,你可以從Windows系統傳輸數據庫到Linux x86系統,或者從HP-UX到AIX,但是如果你想從Solaris傳輸整個數據庫到Linux x86的話就不能應用這項特性了。當然如果必須在這種情況下傳輸的話,可以選擇手工建庫,然後通過CONVERT TABLESPACE或CONVERT DATAFILE命令傳輸:)
提示:事實上,即使源平台和目標平台的endian formats完全相同,對於CONVERT DATABASE命令而言也仍然需要轉換的過程。這主要是為了保證各種類型,比如回滾段等都被重新格式以確保與目標平台的兼容性。
下面是些其它方面不支持直接使用的限制:
l 控制文件和Redo log文件不會被傳輸。目標平台的控制文件和redo logs會在傳輸過程中自動創建,並且目標庫建立後以open resetlogs方式打開新數據庫。
提示:由於目標庫的控制文件是在傳輸過程中創建,源庫中的RMAN備份信息並不會被生成到新庫中(即使有)。
l BFILE類型對應的文件不會被傳輸。不過RMAN在執行CONVERT DATABASE時會將引用BFILE類型的對象輸出一個列表,用戶可以根據列表手工操作BFILE的文件到目標平台。
l 本地管理的臨時表空間數據文件不會被傳輸,而在傳輸過程中自動重建。
l 外部表以及DirectorIEs不會被傳輸。與BFILE一樣,RMAN也會提供一個列表供你手工操作時參考。
l 密碼文件不會被傳輸。不過RMAN也會在執行CONVERT DATABASE命令時輸出用戶以及其對應的權限,你可以對照輸出手工創建新的密碼文件。
CONVERT命令的參數並不多,而且也都比較容易理解,不再一一詳細介紹,後面我們通過具體示例演示來輔助理解。
一、使用CONVERT TABLESPACE
前面提到,CONVERT TABLESPACE必須在源平台執行,用於轉換表空間的endian format到目標平台,通常的調用形式是:
RMAN> CONVERT TABLESPACE ts_1, ts_2...
TO PLATFORM ''platform_name'';
並且可以在命令中指定FORMAT或DB_FILE_NAME_CONVERT參數來設置轉換後數據文件的命名規則,PARALLELISM參數指定轉換的並行度(用於提高轉換效率的,有點類似rman備份恢復中的通道數概念)。例如:
RMAN> CONVERT TABLESPACE JSsweb
TO PLATFORM ''Linux IA (32-bit)''
db_file_name_convert ''E:\ora10g\oradata\JSsweb'',''e:\oratmp\oradata''
PARALLELISM 3;
注意示例中的PARALLELISM參數,如果該參數值設置的不合理,有可能適得其反,花費的時間反而更長,一般而言,推薦並行度大小不要超過要轉換的數據文件的數量。
另外對於FORMAT和DB_FILE_NAME_CONVERT參數前面介紹中也提到了,兩個參數可以同時指定,如果同時指定了兩個參數,則rman會以FORMAT參數的設定為准。如果兩個參數都未指定的話,rman就會按照它自己的規則生成文件。具體規則呢這裡就不描述了,總之就是數字和字母組合,如果你決定按照它的規則命令文件,那麼我至少能確認一件事---單看文件名,你已經不能分辯這個文件是干嘛的了。
二、使用CONVERT DATAFILE
CONVERT DATAFILE則是必須在目標平台執行,用於轉換指定數據文件到指定的endian format.通常的調用形式如下:
RMAN> CONVERT DATAFILE datafile_1, datafile_2...
FROM PLATFORM ''platform_name'';
可以通過指定TO PLATFORM參數設定轉換到的字節順序,如果不指定該參數,默認轉換到當前平台。不過FROM PLATFORM參數的值必須是與其對應的源平台,不然convert可能會出錯。同樣CONVERT DATAFILE也可以指定FORMAT,DB_FILE_NAME_CONVERT,PARALLELISM等參數,如例:
RMAN> CONVERT DATAFILE
2> ''E:\ora10g\oradata\jssweb\JSsweb1.dbf'',
3> ''E:\ora10g\oradata\jssweb\JSsweb2.dbf''
5> TO PLATFORM="Linux IA (32-bit)"
6> FROM PLATFORM="Microsoft Windows IA (32-bit)"
7> DB_FILE_NAME_CONVERT=
8> "E:\ora10g\oradata", "/opt/oar10g/oradata";
這些參數的功能的格式與CONVERT TABLESPACE中介紹的完全一致,這裡就不多廢話了。
三、使用CONVERT DATABASE
假設源平台與目標平台擁有相同的字節順序,RMAN能夠自動處理大多數在目標平台創建新庫的操作。CONVERT DATABASE 傳輸數據庫到新平台需要一個較長的過程,主要包含下面一些部分:
1、准備工作:使用DBMS_TDB包。
DMBS_TDB包提供了兩個非常有用的函數:
提示:建議將SERVEROUTPUT設置為ON,以便能夠查看到函數執行過程的輸出。
l DBMS_TDB.CHECK_DB檢查數據庫狀態
此函數檢查數據庫是否能被傳輸到目標平台以及數據庫當前狀態是否能夠進行傳輸操作。擁有下列幾個可選參數:
target_platform_name:目標平台的名稱,可以通過V$DB_TRANSPORTABLE_PLATFORM視圖查詢獲得。此參數並非必選,但如果你指定了skip_option參數,則本參數也必須指定。忽略此參數,則默認目標平台與源平台相同,
skip_option:非必選參數,指定待傳輸的數據庫要跳過檢查的選項(如果有)。支持字符或數值調用。
Ø DBMS_TDB.SKIP_NONE或0:檢查所有表空間
Ø DBMS_TDB.SKIP_OFFLINE或2:跳過offline表空間的數據文件
Ø DBMS_TDB.SKIP_READONLY或3:跳過read-only表空間的數據文件
例如:
提示:執行前先將數據庫置為read-only模式。
SQL> set serveroutput on
SQL> declare
2 db_ready boolean;
3 begin
4 db_ready := dbms_tdb.check_db(''Microsoft Windows IA (32-bit)'', 2);
5 if (db_ready) then
6 dbms_output.put_line(''True'');
7 else
9 end if;
10 end;
11 /
Database is not open in READ-ONLY mode. Open the database in READ-ONLY mode and retry.
False
如果數據庫可被傳輸,DBMS_TDB.CHECK_DB會返回true,否則返回false,如果執行結果返回false,會自動輸出數據庫不能夠傳輸的原因(如果SERVEROUTPUT被置為on的話),下表是一些可能遇到的問題以及解決方案:
提示信息
解決方案
Unrecognized target platform name.
不能識別目標平台的名稱
檢查V$DB_TRANSPORTABLE_PLATFORM視圖,確實目標平台在視圖列表中,或者,你沒敲錯字母。
Target platform has a different endian format.
目標平台擁有不同的字節順序,不能被CONVERT DATABASE所支持,死了這條心吧。
Database is not open read-only.
源庫未被以read only模式打開,shutdown了重開一遍再試試。
There are active or in-doubt transactions in the database.
源庫存在活動事務,回滾或解決該事務然後打開數據庫到read-only模式再重試。
Deferred transaction rollback needs to be done.
源庫有未完成的延期事務,以正常模式打開數據庫完成它,然後再read only模式打開數據庫重試
Database compatibility version is below 10.
源庫初始化參數中COMPATIBLE參數低於10,修改該參數,重啟數據庫到read only後重試
Some tablespaces have not been open read-write with compatibility version is 10 or higher.
源庫初始化參數中COMPATIBLE參數修改後,表空間尚未被置為read-write過,還記得我們前面說過的嗎?表空間至少要被置為read-write一次。
在serveroutput被置為on的情況下,如果DBMS_TDB.CHECK_DB執行後除了pl/sql成功執行外沒有其它輸出信息,說明數據庫狀態正常,支持傳輸操作。
l DBMS_TDB.CHECK_EXTERNAL確認外部對象
必須使用DBMS_TDB.CHECK_EXTERNAL函數來檢查是否存在外部表,directorIEs或Bfiles,因為RMAN的CONVERT命令不能自動傳輸這些對象。DBMS_TDB.CHECK_EXTERNAL函數沒有參數,直接執行即可。例如:SQL> set serveroutput on
SQL> declare
2 external boolean;
3 begin
4 external := dbms_tdb.check_external;
5 end;
6 /
The following directorIEs exist in the database:
SYS.DATA_PUMP_DIR
如果沒有任何外部的對象,除了pl/sql成功執行外不會有其它輸出信息,但一旦有輸出信息,如上例中所示的你就需要注意,最好記錄下來,當傳輸完成之後,根據需要手工創建這些對象到目標數據庫中。聽明白了吧,本函數成功執行與否並不會影響傳輸操作,這個函數說白了就是給你列個單兒,然後告訴你單子上有的這些它都不負責傳送,如果確實需要那你就得自個干。
2、轉換數據庫
前面就已經提到過,轉換操作即可以在源平台執行也可以在目標平台執行,並且我們推薦轉換操作在目標平台執行,對於CONVERT DATABASE而言,源平台執行和目標平台執行還是有些區別,具體操作的時候還得根據實據情況做選擇,下面分別說明:
對於在源平台執行轉換操作而言,通常步驟如下:
·啟動數據庫到read only模式。
·DBMS_TDB.CHECK_DB檢查數據庫是否可被傳輸
·DBMS_TDB.CHECK_EXTERNAL檢查外部對象
·執行CONVERT DATABASE命令,例如:
RMAN> convert database new database ''JSstts''
2> transport script ''e:\oratmp\script\ts.sql''
3> to platform ''Linux IA (32-bit)''
4> db_file_name_convert ''E:\ora10g\oradata\JSsweb'' ''e:\oratmp\oradata'';
得到下列文件:
Ø 轉換後的數據文件:已轉換的待傳輸文件,本例中保存至:e:\oratmp\oradata'',文件名與源庫中相同。
Ø transport script:在目標平台執行的創建數據庫的腳本,本例中名為ts.sql,該文件內容僅供參考,你需要再根據實際情況修改其中的參數值。
Ø 客戶端初始化參數文件:文件名及路徑包含在CONVERT DATABASE的輸出內容中,在輸出結果的最後。文件中的參數值多繼承自源庫,你可以根據需要進行適當修改。
轉換完成(此時可將源庫置為read-write了),然後將文件復制到目標數據庫,在目標平台執行transport script,創建數據庫即可。注意,如果前一步操作生成的文件復制到目標平台後路徑發生修改,務必修改transport script文件中對應的參數值。
對於在目標平台執行轉換操作:
前面的准備工作與在源平台進行轉換操作是一樣的,所不同的僅僅只是執行CONVERT DATABASE命令時調用的參數,如例:
RMAN> convert database on target platform
3> transport script ''e:\oratmp\script\ts.sql''
4> new database ''JSstts''
5> db_file_name_convert ''E:\ora10g\oradata\JSsweb'' ''e:\oratmp\oradata'';
得到下列文件:
Ø convert script:在目標平台執行的轉換數據文件的腳本(實際內容就是前面講到的convert datafile命令,不過這個是convert database命令自動生成的)。
Ø transport script:在目標平台執行的創建數據庫的腳本,本例中名為ts.sql,該文件內容僅供參考,你需要再根據實際情況修改其中的參數值。
Ø 客戶端初始化參數文件:文件名及路徑包含在CONVERT DATABASE的輸出內容中,在輸出結果的最後。文件中的參數值多繼承自源庫,你可以根據需要進行適當修改。
你大概也注意到了,此時並未生成數據文件,這是因為轉換操作將在目標平台執行,所以你直接將源平台中的數據文件復制到目標平台即可。然後即可將源庫置為read-write狀態了。