ORACLE CONVERT DATABASE

        RMAN新增了CONVERT命令,對於相同字節序的數據庫,Oracle還提供了CONVERT DATABASE的命令。假設源平臺與目標平臺擁有相同的字節順序,RMAN能夠自動處理大多數在目標平臺創建新庫的操作。CONVERT DATABASE 傳輸數據庫到新平臺需要一個較長的過程,主要包含下面一些部分:
1、準備工作:使用DBMS_TDB包。
DMBS_TDB包提供了兩個非常有用的函數:
提示:建議將SERVEROUTPUT設置爲ON,以便能夠查看到函數執行過程的輸出。
    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模式。 
如: 設置SERVEROUTPUT爲on         SQL> set serveroutput on
declare
  db_ready boolean;
begin
  db_ready := dbms_tdb.check_db('Microsoft Windows IA (32-bit)', 2);
  if (db_ready) then
    dbms_output.put_line('True');
  else
    dbms_output.put_line('False');
  end if;
end;

         如果數據庫可被傳輸,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成功執行外沒有其它輸出信息,說明數據庫狀態正常,支持傳輸操作。 
DBMS_TDB.CHECK_EXTERNAL確認外部對象
必須使用DBMS_TDB.CHECK_EXTERNAL函數來檢查是否存在外部表,directories或Bfiles,因爲RMAN的CONVERT命令不能自動傳輸這些對象。DBMS_TDB.CHECK_EXTERNAL函數沒有參數,直接執行即可。

如:設置SERVEROUTPUT爲on         SQL> set serveroutput on
declare
  external boolean;
begin
  external := dbms_tdb.check_external;
end;

        如果沒有任何外部的對象,除了pl/sql成功執行外不會有其它輸出信息,但一旦有輸出信息,你就需要注意,最好記錄下來,當傳輸完成之後,根據需要手工創建這些對象到目標數據庫中。

2、轉換數據庫 
        轉換操作即可以在源平臺執行也可以在目標平臺執行,可以通過視圖v$transportable_platform查詢數據庫支持的平臺。我們推薦轉換操作在目標平臺執行,對於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命令自動生成的)。
     transport script:在目標平臺執行的創建數據庫的腳本,本例中名爲ts.sql,該文件內容僅供參考,你需要再根據實際情況修改其中的參數值。
     客戶端初始化參數文件:文件名及路徑包含在CONVERT DATABASE的輸出內容中,在輸出結果的最後。文件中的參數值多繼承自源庫,你可以根據需要進行適當修改。
         注意,此時並未生成數據文件,這是因爲轉換操作將在目標平臺執行,所以你直接將源平臺中的數據文件複製到目標平臺即可。然後即可將源庫置爲read-write狀態了。

發佈了46 篇原創文章 · 獲贊 30 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章