RMAN跨平臺傳輸資料庫和表空間

lovestanford發表於2015-04-18

      這篇文章詳細討論了使用RMAN工具的CONVERT DATAFILE,CONVERT TABLESPACE和CONVERT DATABASE命令實現跨平臺傳輸表空間和資料庫,這篇文章是基於Oracle 10gR2官方文件翻譯而來。

一.跨平臺傳輸表空間

      使用跨平臺傳輸表空間,平臺之間可以是不同的位元組儲存順序(endian format)。當源平臺和目的地平臺的位元組儲存順序不同,源平臺要傳輸表空間下的資料檔案的位元組儲存順序必須轉換成和目的地平臺相同。轉換操作使用RMAN CONVERT TABLESPACE命令(在源平臺轉換)或者CONVERT DATAFILE命令(在目的地平臺轉換)。


CONVERT TABLESPACE命令必須用在源平臺,CONVERT DATAFILE命令用在目的地平臺。

1.在源平臺使用CONVERT TABLESPACE... TO PLATFORM命令:

     CONVERT TABLESPACE... TO PLATFORM命令用於在源平臺轉換表空間到目的地平臺格式。在源平臺資料庫呼叫CONVERT TABLESPACE命令指定一個或更多表空間名稱,例如:

RMAN> CONVERT TABLEPSACE ts_1, ts_2 ...
  TO PLATFORM 'platform_name';

platform_name支援的值可以從V$TRANSPORTABLE_PLATFORM查詢到。
在源平臺必須轉換整個表空間,不能只轉換一個資料檔案。

CONVERT TABLESPACE ... TO PLATFORM包含如下可選引數:

PARALLELISM n
      用於指定n個伺服器會話並行執行轉換工作,以提升效能。每個資料檔案只能分配一個單獨的伺服器會話進行轉換,因此,不能透過分配一個大並行度轉換單一資料檔案來提升效能。

fileNameConversionSpec
      指定使用fileNameConversionSpec引數,用於對轉換的資料檔案生成新的檔名。

FORMAT formatSpec
      提供一個格式模板用於對轉換的資料檔案生成新的,唯一的檔名。如果沒有指定FORMAT,RMAN使用和平臺相關的目的地和格式。

下面在源平臺轉換表空間的例子:

1).設定傳輸表空間為只讀模式。

2).在V$TRANSPORTABLE_PLATFORM中檢視目的地平臺的名稱。

SQL> SELECT PLATFORM_ID, PLATFORM_NAME, ENDIAN_FORMAT
   FROM V$TRANSPORTABLE_PLATFORM 
   WHERE UPPER(PLATFORM_NAME) LIKE 'LINUX';

針對Linux在PC上的PLATFORM_NAME是'Linux IA (32bit)'。

3).使用CONVERT TABLESPACE轉換命令。
使用RMAN轉換資料檔案到目的地平臺的位元組儲存順序,FORMAT引數控制轉換後資料檔案的名稱和位置:
% rman TARGET /
RMAN> CONVERT TABLESPACE finance,hr
   TO PLATFORM 'Linux IA (32-bit)'
   FORMAT='/tmp/transport_linux/%U';

轉換後的資料檔案被放在/tmp/transport_linux目錄,資料和目的地系統的位元組儲存順序相同。

4).使用匯出工具建立匯出dump檔案。

5).移動轉換後的檔案和匯出的dump檔案到目的地平臺主機。

6).使用匯入工具插入表空間到新資料庫。

7).修改表空間為讀寫模式。


2.在目的地主機使用CONVERT DATAFILE... FROM PLATFORM命令:


       CONVERT DATAFILE ... FROM PLATFORM用於在目的地平臺轉換源平臺的表空間位元組儲存順序。
不能在目的地平臺使用CONVERT TABLESPACE。

CONVERT DATAFILE命令可以跟上一個或多個需要轉換的資料檔案,例如:

RMAN> CONVERT DATAFILE datafile_1, datafile_2 ...
   FROM PLATFORM 'platform_name';

        提供的FROM PLATFORM值必須匹配待轉換資料檔案的真實平臺,否則RMAN返回一個錯誤,platform_name支援的值可以從V$TRANSPORTABLE_PLATFORM查詢到。

PARALLELISM、FORMAT、fileNameConversionSpec引數和CONVERT TABLESPACE在源平臺用法是相同的。

下面是在目的地平臺轉換資料檔案的例子:

1).在源庫將需要轉換的表空間設定為只讀模式,表空間對應的資料檔案包括:
/tmp/transport_solaris/fin/fin01.dbf
/tmp/transport_solaris/fin/fin02.dbf
/tmp/transport_solaris/hr/hr01.dbf
/tmp/transport_solaris/hr/hr02.dbf

2).在源庫使用匯出工具建立dump檔案。

3).複製dump檔案和資料檔案到目的地。

4).使用RMAN CONVERT命令轉換資料檔案到目標主機格式,將轉換後的資料檔案存放在/orahome/dbs目錄。

% rman TARGET /
RMAN> CONVERT DATAFILE
   '/tmp/transport_solaris/fin/fin01.dbf',
   '/tmp/transport_solaris/fin/fin02.dbf',
   '/tmp/transport_solaris/hr/hr01.dbf',
   '/tmp/transport_solaris/hr/hr02.dbf'
   DB_FILE_NAME_CONVERT
        '/tmp/transport_solaris/fin','/orahome/dbs/fin',
        '/tmp/transport_solaris/hr','/orahome/dbs/hr';

注意:
     a).FORMAT引數控制資料檔案的名稱和位置。
     b).當在目的地平臺轉換資料檔案時,必須使用FROM PLATFORM引數指定源平臺。否則,RMAN將假設源和目的地平臺位元組儲存順序是相同的。

5).使用匯入工具插入轉換後的表空間到新的資料庫。

6).修改表空間為讀寫模式。

        對於跨平臺傳輸表空間而言,如果源平臺和目的地平臺的位元組儲存順序是相同,那麼可以不必執行CONVERT TABLESPACE或CONVERT DATAFILE進行轉換,直接簡單複製即可

CONVERT TABLESPACE和CONVERT DATAFILE限制:
a).源和目的地資料庫的COMPATIBLE初始化引數必須設定為10.0或者更高。

b).不是所有源和目的地平臺的組合都是支援的,確定源和目的地平臺是否被支援需要查詢V$TRANSPORTABLE_PLATFORM。如果源和目的地都在該檢視列表中,那麼CONVERT能用於一個平臺到另一個平臺的轉換。


c).在10g版本,使用CONVERT命令將表空間傳遞到另一個平臺之前必須至少一次被設定為讀寫模式。

d).RMAN的endian轉換不能處理使用者自定義資料型別。

e).10g之前的版本,CLOBs以可變長度字符集建立,並且依賴位元組儲存順序儲存,CONVERT命令不能執行CLOBs的轉換,RMAN捕獲每個LOB欄位的位元組儲存順序,傳播它到目的地資料庫。之後透過SQL層讀寫這個資料,基於兩者之一的位元組儲存順序正確翻譯資料,如果表空間可寫,那麼基於相關位元組儲存順序寫資料。

f).在Oracle Database 10g建立的CLOBs,儲存在AL16UTF16字符集中,具有平臺獨立性。


二.跨平臺傳輸資料庫

      RMAN CONVERT DATABASE命令用於自動從一個平臺(源平臺)移動整個資料庫到另一個平臺(目的地平臺)。源和目的地平臺必須是相同的位元組儲存順序,RMAN在目的地平臺自動完成大多數建立新資料庫的步驟,確保與源資料庫有相同的資料,相同的設定。

      CONVERT DATABASE步驟可以在源平臺或者目的地平臺執行。
      跨平臺傳輸資料庫要求平臺之間必須有相同的位元組儲存順序(endian format),傳輸資料庫的資料檔案必須經歷轉換過程,不能簡單的從一個平臺複製到另一個平臺,可傳輸表空間是可以的。

      如果資料庫使用的是PFILE,它是可以被傳遞的。如果使用的是SPFILE,那麼將基於SPFILE生成PFILE,進行傳遞,之後在目標主機基於PFILE的設定建立一個新的SPFILE。大多數情況下,PFILE中的一些引數要求手動更新到新的資料庫,例如,DB_NAME,CONTROL_FILES等。


跨平臺傳輸資料庫的限制:

a).源和目的地平臺位元組儲存順序必須是相同的。

b).資料庫檔案不能簡單的直接從源複製到目標主機,必須經過轉換過程。

c).源平臺的Redo日誌檔案和控制檔案不支援傳輸,在傳輸過程中,針對新的資料庫將建立新的控制檔案和redo日誌檔案,OPEN RESETLOGS執行一次,新資料庫即被建立。

注意:轉換後的資料庫控制檔案不會包含源庫的RMAN資料庫的複製資訊,源資料庫的備份不能用於轉換後的新資料庫。

d).BFILEs不能被傳輸,RMAN在CONVERT DATABASE命令的輸出中包含BFILE型別的物件列表,使用者必須複製BFILEs到目的地平臺指定的位置。

e).屬於本地管理的臨時表空間下的臨時檔案不能被傳輸,當執行transport script時,臨時表空間將在目的地平臺被重建。

f).外部表和directory不能傳輸,RMAN在CONVERT DATABASE命令的輸出中列出了受影響的物件,使用者必須在目的地資料庫重新定義。

g).密碼檔案不能被傳輸。如果源庫有密碼檔案,CONVERT DATABASE命令的輸出將包括密碼檔案中所有使用者的列表和它們對應的許可權,使用者參考這些資訊在目的地資料庫中重新建立新的密碼檔案。


1.使用DBMS_TDB包準備CONVERT DATABASE操作。

DBMS_TDB PL/SQL包定義了兩個函式用於準備CONVERT DATABASE操作。

      1).使用DBMS_TDB.CHECK_DB檢查資料庫狀態:

      DBMS_TDB.CHECK_DB檢查資料庫是否能被傳輸到期望的平臺,當前資料庫狀態是否允許傳輸。它能在不跟任何引數的情況下被呼叫,檢視源庫是否有任何條件輸出。

      DBMS_TDB.CHECK_DB返回TRUE,表示源資料庫能使用CONVERT DATABASE傳輸,FALSE表示不能被傳輸。

      確保資料庫以只讀模式開啟,然後再帶上合適的引數呼叫DBMS_TDB.CHECK_DB。

      如果SERVEROUTPUT是ON,DBMS_TDB.CHECK_DB返回FALSE,那麼會輸出資料庫不能被傳輸的原因。以下是可能阻止使用CONVERT DATABASE傳輸的原因:
      a).未知的目的地平臺名稱。
      b).目的地平臺有不同的位元組儲存順序。
      c).資料庫不是以只讀模式開啟。
      d).資料庫有活動或被懷疑的事務。
      e).需要執行事務回滾操作。
      f).資料庫相容版本小於10。
      g).一些表空間沒有在相容版本是10或更高的庫中以讀寫模式開啟過。

      如果呼叫DBMS_TDB.CHECK_DB在PL/SQL procedure successfully completed訊息之前沒有阻止傳輸的訊息顯示,表明資料庫準備好被傳輸。

       2).使用DBMS_TDB.CHECK_EXTERNAL標識外部物件:

       DBMS_TDB.CHECK_EXTERNAL用於表示任何外部表,directory或者BFILEs。RMAN不能自動傳輸這些檔案。

       DBMS_TDB.CHECK_EXTERNAL沒有引數,當SERVEROUTPUT設定為ON,DBMS_TDB.CHECK_EXTERNAL輸出資料庫包含的外部表,directory和BFILEs。


2.使用RMAN CONVERT DATABASE命令轉換資料庫。


      在源和目的地平臺執行CONVERT DATABASE的過程是不同的。

      1).在源平臺使用CONVERT DATABASE轉換資料檔案。

下面是轉換步驟:

 a).準備傳輸資料庫,源資料庫必須以只讀方式開啟。
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE OPEN READ ONLY;

 b).使用DBMS_TDB.CHECK_DB檢查資料庫狀態。
使用DBMS_TDB包的CHECK_DB函式檢查資料庫是否準備好了。
set serveroutput on
declare
    db_ready boolean;
  begin
    /* db_ready is ignored, but with SERVEROUTPUT set to ON any 
     * conditions preventing transport will be output to console */
    db_ready := dbms_tdb.check_db('Microsoft Windows IA (32-bit)',
        dbms_tdb.skip_none);
  end;

 c).使用DBMS_TDB.CHECK_EXTERNAL標識外部物件。
SQL> set serveroutput on
SQL> declare
     external boolean;
  begin
    /* value of external is ignored, but with SERVEROUTPUT set to ON
     * dbms_tdb.check_external displays report of external objects
     * on console */
    external := dbms_tdb.check_external;
  end;

      當資料庫準備好傳輸後,執行RMAN CONVERT DATABASE命令,指定目的地平臺和輸出檔名稱。RMAN處理需要移動到目的地資料庫的檔案,包括以下:

*
資料庫資料檔案的完整複製,準備傳輸。

*用於目的地平臺新資料庫的PFILE,包括源資料庫PFILE或者SPFILE的設定:
# Please change the values of the following parameters:
  control_files            = "/tmp/convertdb/cf_D-NEWDBT_id-1778429277_00gb9u2s"
  db_recovery_file_dest    = "/tmp/convertdb/orcva"
  db_recovery_file_dest_size= 10737418240
  instance_name            = "NEWDBT"
  service_names            = "NEWDBT.regress.rdbms.dev.us.oracle.com"
  plsql_native_library_dir = "/tmp/convertdb/plsqlnld1"
  db_name                  = "NEWDBT"

*transport script,包含用於在目的地平臺建立新資料庫SQL語句。

 d).執行CONVERT DATABASE操作。
以下是在源平臺使用CONVERT DATABASE的例子:
RMAN> CONVERT DATABASE NEW DATABASE 'newdb'
        transport script '/tmp/convertdb/transportscript'
        to platform 'Microsoft Windows IA (32-bit)'
        db_file_name_convert '/disk1/oracle/dbs' '/tmp/convertdb'
        ;
 
Starting convert at 25-JAN-05
using channel ORA_DISK_1
 
External table SH.SALES_TRANSACTIONS_EXT found in the database
 
Directory SYS.DATA_PUMP_DIR found in the database
Directory SYS.MEDIA_DIR found in the database
Directory SYS.DATA_FILE_DIR found in the database
Directory SYS.LOG_FILE_DIR found in the database
 
BFILE PM.PRINT_MEDIA found in the database
 
User SYS with SYSDBA and SYSOPER privilege found in password file
User OPER with SYSDBA privilege found in password file
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00001 name=/disk1/oracle/dbs/tbs_01.f
converted datafile=/tmp/convertdb/tbs_01.f
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00002 name=/disk1/oracle/dbs/tbs_ax1.f
converted datafile=/tmp/convertdb/tbs_ax1.f
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
.
.
.
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00016 name=/disk1/oracle/dbs/tbs_52.f
converted datafile=/tmp/convertdb/tbs_52.f
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01
Run SQL script /tmp/convertdb/transportscript on the target platform 
  to create database
Edit init.ora file init_00gb3vfv_1_0.ora.This PFILE will be used to 
  create the database on the target platform
To recompile all PL/SQL modules, run utlirp.sql and utlrp.sql on 
  the target platform
To change the internal database identifier, use DBNEWID Utility
Finished backup at 25-JAN-05

      當CONVERT DATABASE完成,源資料庫可以以讀寫模式被再次開啟。

 e).將所有處理的檔案複製到目的地主機。

      放置資料檔案到目的地主機期望的位置,如果在目的地的資料檔案路徑和源不同,編輯transport script引用新的資料檔案位置。同時編輯PFILE修改任何針對目的地資料庫的設定。

 f).在目的地主機的SQL*PLUS中執行transport scirpt建立新資料庫。

SQL> @transportscript

當transport sciprt完成,新資料庫即建立完成。


2).在目的地主機使用CONVERT DATABASE轉換資料檔案。


      我們可能基於以下的原因考慮在目的地執行CONVERT DATABASE轉換操作:
      *防止在源主機執行轉換過程帶來任何效能的開銷。
      *從源系統分發資料庫到多個可接受的不同的平臺。

下面是轉換步驟:

 a).以只讀模式開啟源資料庫。

 b).執行DBMS_TDB.CHECK_DB標識任何阻止傳輸的原因。

 c).執行DBMS_TDB.CHECK_EXTERNAL標識外部物件。

 d).在源平臺執行RMAN CONVERT DATABASE命令指定ON TARGET PLATFORM引數,下面是源主機上執行CONVERT DATABASE ON TARGET PLATFORM的例子:

RMAN> convert database on target platform
convert script '/tmp/convertdb/convertscript-target'
   transport script '/tmp/convertdb/transportscript-target'
   new database 'newdbt'
   format '/tmp/convertdb/%U'
   ;
 
Starting convert at 28-JAN-05
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=39 devtype=DISK
 
External table SH.SALES_TRANSACTIONS_EXT found in the database
 
Directory SYS.DATA_PUMP_DIR found in the database
Directory SYS.MEDIA_DIR found in the database
Directory SYS.DATA_FILE_DIR found in the database
Directory SYS.LOG_FILE_DIR found in the database
 
BFILE PM.PRINT_MEDIA found in the database
 
User SYS with SYSDBA and SYSOPER privilege found in password file
User OPER with SYSDBA privilege found in password file
channel ORA_DISK_1: starting to check datafiles
input datafile fno=00001 name=/disk1/oracle/dbs/tbs_01.f
channel ORA_DISK_1: datafile checking complete, elapsed time: 00:00:00
channel ORA_DISK_1: starting to check datafiles
input datafile fno=00002 name=/disk1/oracle/dbs/tbs_ax1.f
channel ORA_DISK_1: datafile checking complete, elapsed time: 00:00:00
channel ORA_DISK_1: starting to check datafiles
input datafile fno=00017 name=/disk1/oracle/dbs/tbs_03.f
channel ORA_DISK_1: datafile checking complete, elapsed time: 00:00:00
.
.
.
channel ORA_DISK_1: starting to check datafiles
input datafile fno=00015 name=/disk1/oracle/dbs/tbs_51.f
channel ORA_DISK_1: datafile checking complete, elapsed time: 00:00:00
channel ORA_DISK_1: starting to check datafiles
input datafile fno=00016 name=/disk1/oracle/dbs/tbs_52.f
channel ORA_DISK_1: datafile checking complete, elapsed time: 00:00:00
Run SQL script /tmp/convertdb/transportscript-target on the target platform to create database
Edit init.ora file /tmp/convertdb/init_00gb9u2s_1_0.ora. This PFILE will be used to create the database on the target platform
Run RMAN script /tmp/convertdb/convertscript-target on target platform to convert datafiles
To recompile all PL/SQL modules, run utlirp.sql and utlrp.sql on the target platform
To change the internal database identifier, use DBNEWID Utility
Finished backup at 28-JAN-05

      在源平臺執行CONVERT DATABASE ON TARGET PLATFORM命令產生transport script,包含在目的地平臺建立新資料庫的SQL*PLUS命令,和包含同源資料庫相同設定的新資料庫PFILE。

 e).將所有要處理的檔案複製到目的地主機。

 f).執行convert script。

      CONVERT DATABASE ON TARGET PLATFORM針對被傳輸的資料庫的每個資料檔案生成一個convert script,包含RMAN CONVERT DATAFILE命令。必須複製未轉換的源資料檔案到目的地相同的位置,然後在目的地執行轉換指令碼,轉換資料檔案到目的地可用的位元組儲存順序。傳統的轉換命令類似以下內容:

RUN {
 
  CONVERT DATAFILE '/disk1/oracle/dbs/tbs_01.f'
  FROM PLATFORM 'Linux IA (32-bit)'
  FORMAT '/tmp/convertdb/data_D-TV_I-1778429277_TS-SYSTEM_FNO-1_7qgb9u2s';
 
  CONVERT DATAFILE '/disk1/oracle/dbs/tbs_ax1.f'
  FROM PLATFORM 'Linux IA (32-bit)'
  FORMAT '/tmp/convertdb/data_D-TV_I-1778429277_TS-SYSAUX_FNO-2_7rgb9u2s';
 
  CONVERT DATAFILE '/disk1/oracle/dbs/tbs_03.f'
  FROM PLATFORM 'Linux IA (32-bit)'
  FORMAT '/tmp/convertdb/data_D-TV_I-1778429277_TS-SYSTEM_FNO-17_7sgb9u2s';
.
.
.
 
  CONVERT DATAFILE '/disk1/oracle/dbs/tbs_51.f'
  FROM PLATFORM 'Linux IA (32-bit)'
  FORMAT '/tmp/convertdb/data_D-TV_I-1778429277_TS-TBS_5_FNO-15_8egb9u2u';
 
  CONVERT DATAFILE '/disk1/oracle/dbs/tbs_52.f'
  FROM PLATFORM 'Linux IA (32-bit)'
  FORMAT '/tmp/convertdb/data_D-TV_I-1778429277_TS-TBS_5_FNO-16_8fgb9u2u';
 
}

CONVERT DATABASE ON TARGET PLATFORM不能處理轉換後的資料檔案複製。
如果源和目的地的臨時位置不同,注意修改convert script中的CONVERT和FORMAT指定的位置。

 g).建立引數檔案和執行transport script。

      在目的地平臺執行convert script準備資料檔案,然後建立期望改變的引數檔案,最後執行transport script建立新資料庫。

當transport script完成,新資料庫就建立。


參考文章:
Oracle Database Backup and Recovery Advanced User's Guide
10g Release 2 (10.2)
B14191-03



--end--


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21754115/viewspace-1585120/,如需轉載,請註明出處,否則將追究法律責任。

相關文章