移動表空間
概念:可跨平台移動的表空間:
簡化資料倉庫和資料集市之間的資料分發
允許從一個平台向另一個平台移植資料庫
受支援的平台:
solaris[tm] oe(32 位) hp-ux(64 位) microsoft windows ia(64 位)
solaris[tm] oe(64 位) hp tru64 unix 基于ibm zseries 的linux
microsoft windows ia(32 位) hp-ux ia(64 位)适用于amd 的64 位linux
linux ia(32 位) linux ia(64 位) apple mac os
基于aix 的系統(64 位) hp open vms microsoft windows for amd(64 位)
solaris 作業系統(x86)
可以使用可移動表空間功能跨平台移動資料。此功能簡化了從資料倉庫環境向資料集市
(資料集市通常在較小的平台上運作)分發資料的過程。此功能還允許通過重建字典并
移動使用者表空間的方式,将資料庫從一個平台移植到另一個平台。
為了能夠将資料檔案從一個平台移動到另一個平台,必須確定源系統和目标系統都在支援
的平台上運作。
注:可跨平台移動的表空間功能要求兩個平台使用相同的字元集。
概念:最低相容級别
源資料庫和目标資料庫都必須将compatible
設定為10.0.0 或更高。
資料檔案頭可以識别平台。
在移動前,請確定所有隻讀檔案和脫機檔案可以
識别平台
源資料庫和目标資料庫都需要先将其資料庫compatible 初始化參數提高到10.0.0 或
更高,才能使用可跨平台移動的表空間功能。
資料檔案第一次在compatible 設定為10.0.0(或更高)的oracle database 10g 中打
開時,這些檔案将設定為可識别平台。這一點由圖表中的對勾标記表示。每個檔案都可以
确定其所屬的平台。這些檔案在磁盤上有相同的檔案頭塊格式,這些格式用于檔案辨別
和驗證。隻讀檔案和脫機檔案隻有在變為讀/寫狀态或變為聯機之後才能提高其相容性。
這意味着在oracle database 10g 版本之前的資料庫中處于隻讀狀态的表空間必須至少變為
讀/寫狀态一次才能使用可跨平台移動的功能。
可移動表空間過程
将表空間置于隻讀狀态。
使用資料泵提取中繼資料。
目标是否使用相同的endian 格式是
傳送資料檔案并将檔案轉儲到目标。
使用資料泵導入中繼資料。
将表空間置于讀/寫狀态。
目标是否使用相同的endian 格式否
使用rman
轉換資料檔案。
要将表空間從一個平台移動到另一個平台(源到目标),必須将表空間集内的資料檔案轉
換為目标資料庫可以了解的格式。雖然使用oracle database 10g,磁盤結構符合通用格式,
但源平台和目标平台還是可能使用不同的endian 格式(位元組順序)。轉至不同的endian
平台時,必須使用rman 實用程式的convert 指令來轉換位元組順序。可以在源平台或
目标平台上執行此操作。對于endian 格式相同的平台,則不需要轉換。
幻燈片中的圖形描述了從源平台向目标平台移動表空間可能用到的步驟。但是,也可以在
将檔案傳送到目标平台後執行轉換。必須在目标平台上執行最後兩步。
一般情況下,此過程與使用oracle 資料庫的舊發行版時相同,除非兩個平台使用不同的
endian 格式。此處假定兩個平台都支援跨平台移動。
注:讀寫資料時,位元組順序會影響結果。例如,2 個位元組的整數值1 在big-endian 系統
(如sun sparc solaris)上寫為0x0001,而在little-endian 系統(如相容intel 的pc)
上寫為0x0100。
确定平台的endian 格式
select tp.endian_format
from v$transportable_platform. tp,
v$database d
where tp.platform_name = d.platform_name;
可以查詢v$transportable_platform. 來确定兩個平台上的endian 順序是否相同。
v$database 有兩個列可以用于确定您自己的平台名稱和平台辨別符。
在兩個平台上使用幻燈片中的查詢,然後比較結果。在sun sparc solaris 系統上,
select 語句生成以下輸出:
endian_format
-------------
big
在microsoft windows 基于intel 的平台上,select 語句生成以下輸出:
little
移動資料庫
概述可移動表空間功能。
可以輕松地從資料倉庫環境向資料集市(資料集市通常
在較小的平台上運作)分發資料。
資料庫可以非常迅速地從一個平台移植到另一個平台。
在不同平台之間移動資料時,使用可移動表空間功能可以将移動速度加快許多。但仍然
需要解除安裝中繼資料,因為無法移動系統表空間。
資料庫移動功能的目的是在endian 格式相同的不同平台之間輕松快捷地移動資料庫。
但是,源平台和目标平台的磁盤對齊可以不同。例如,hp-ux 和solaris 都是big endian
格式,但hp-ux 上的磁盤對齊為八,而在solaris 上為四。
要從一個平台向另一個平台移動資料庫,必須確定源系統和目标系統都運作于
v$transportable_platform. 中列出的一個平台上,并且具有相同的endian 格式。
例如,可以将在linux ia(32 位)上運作的資料庫移動到一個windows 平台上。
如果兩個資料庫中至少有一個使用自動存儲管理(asm),則可能需要使用
dbms_file_transfer 程式包來将檔案上傳到ftp。
此功能與可移動表空間不同,可移動表空間有一個可以插入資料的目标資料庫,而此功能
将在目标平台上建立新的資料庫。新建立的資料庫中包含的資料與源資料庫中相同。除了
資料庫名、執行個體名和檔案位置等,新資料庫與源資料庫的設定也相同。
注:移動資料庫比使用“資料泵”移動資料更快。
資料庫移動過程:源系統轉換
在隻讀模式下打開資料庫
并且compatible=10.0.0
必須先在隻讀模式下打開資料庫,才能移動該資料庫。然後使用rman 轉換資料庫的必
要資料檔案。
在源平台上執行轉換時,新的rman 指令convert database 将生成一個包含正确的
create controlfile resetlogs 指令的腳本,此指令用于在目标系統上建立新數
據庫。然後convert database 指令将轉換識别出的所有資料檔案,以便這些檔案可
以在目标系統上使用。接着,您需要将已轉換的資料檔案和生成的腳本傳送到目标平台。
通過在目标平台上執行生成的腳本,可以建立資料庫的新副本。
注:源資料庫必須在compatible 初始化參數設為10.0.0 或更高的條件下運作。
自compatible 設定為10.0.0 或更高以來,識别出的所有表空間必須至少被讀寫一次。
資料庫移動過程:目标系統轉換
在目标平台上執行轉換時,(在源系統上執行的)convert database 指令隻生成兩個
腳本,用于在目标系統上轉換資料檔案以及重新建立新資料庫的控制檔案。然後,請将識
别出的資料檔案和兩個腳本都傳送到目标平台。完成後,請按正确的順序執行這兩個腳本。
第一個腳本使用現有的convert datafile rman 指令來進行轉換,第二個腳本随已
轉換的資料檔案一起發出create controlfile resetlogs sql 指令來建立新數
據庫。
資料庫移動:注意事項
在目标平台上建立密碼檔案。
移動在源資料庫中使用的bfile。
生成的pfile 和移動腳本使用omf。
使用dbnewid 來更改dbid。
不會移動重做日志、控制檔案和臨時檔案。将在目标平台上為新資料庫重新建立這些
檔案。是以,目标平台上的新資料庫必須用resetlogs 選項打開。
使用密碼檔案時,不會移動該檔案,需要您在目标平台上建立該檔案。這是因為密碼
檔案支援的檔案名類型是特定于作業系統的。但是,convert database 指令的輸出
将列出所有使用者名及其系統權限,并且建議在目标平台上重新建立密碼檔案并為這些
使用者添加條目。
convert database 指令列出源資料庫中的所有目錄對象以及使用bfile 資料類型
或外部表的對象。可能需要用新的目錄名和檔案名來更新這些對象。如果在資料庫中
使用了bfile,則必須移動bfile。
生成的pfile 和移動腳本将oracle managed files (omf) 用于資料庫檔案。如果不想使用
omf,則必須修改pfile 和移動腳本。
移動的資料庫與源資料庫具有相同的dbid。可以使用dbnewid 實用程式來更改dbid。
在移動腳本以及convert database 指令的輸出中,系統将提示您使用dbnewid
實用程式來更改資料庫id。
下面的使用參數說明來自網絡
http://tech.it168.com/db/2007-12-19/200712191131170.shtml
對于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
8 dbms_output.put_line('false');
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函數沒有參數,直接執行即可。例如:
2 external boolean;
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
2> convert script. 'e:\oratmp\script\cs.rman'
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指令自動生成的)。
你大概也注意到了,此時并未生成資料檔案,這是因為轉換操作将在目标平台執行,是以你直接将源平台中的資料檔案複制到目标平台即可。然後即可将源庫置為read-write狀态了。