溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MOS怎么利用RMAN可傳輸表空間遷移數據庫到不同字節(jié)序的平臺

發(fā)布時間:2021-11-09 09:56:51 來源:億速云 閱讀:110 作者:小新 欄目:關系型數據庫

小編給大家分享一下MOS怎么利用RMAN可傳輸表空間遷移數據庫到不同字節(jié)序的平臺,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

目標

從 Oracle 數據庫 10g 開始,你可以跨平臺的傳輸表空間。這篇文檔提供了一個逐步指導,來解釋如何實現 ASM 數據文件和 OS 文件系統(tǒng)數據文件的傳輸表空間。

如果你的目標是遷移一個數據庫到不同的字節(jié)序平臺,如下的步驟概述了如何使用可傳輸表空間遷移一個數據庫到一個新的平臺:

1.- 在目標平臺上創(chuàng)建一個新的,空的數據庫。
2.- 從源庫導入傳輸操作要求的對象到目標庫。
3.- 從源庫為所有的用戶表空間導出可傳輸的元數據。
4.- 轉移用戶表空間的數據文件到目標系統(tǒng)。
5.- 使用 RMAN 轉換數據文件到目標系統(tǒng)的字節(jié)序格式。
6.- 導入所有用戶表空間的可傳輸元數據到目標數據庫。
7.- 從源庫導入余下的數據庫對象和元數據(傳輸操作未移動的部分)到目標庫。

你也可以在源平臺轉換數據文件,轉換完成后轉移他們到目標平臺。

MAA 白皮書“利用表空間傳輸實現平臺遷移”請參考:

http://www.oracle.com/technetwork/database/features/availability/maa-wp-11g-platformmigrationtts-129269.pdf

從 11.2.0.4,12c 之后,如果要轉換到 Linux x86-64,那么參考如下文檔:

   Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup [1389592.1]

解決方案

支持的平臺

請查詢 V$TRANSPORTABLE_PLATFORM 來查看受支持的平臺,并確定每個平臺的字節(jié)序。

SQL> COLUMN PLATFORM_NAME FORMAT A32
SQL> SELECT * FROM V$TRANSPORTABLE_PLATFORM;

PLATFORM_ID PLATFORM_NAME                    ENDIAN_FORMAT
----------- -------------------------------- --------------
          1 Solaris[tm] OE (32-bit)          Big
          2 Solaris[tm] OE (64-bit)          Big
          7 Microsoft Windows IA (32-bit)    Little
         10 Linux IA (32-bit)                Little
          6 AIX-Based Systems (64-bit)       Big
          3 HP-UX (64-bit)                   Big
          5 HP Tru64 UNIX                    Little
          4 HP-UX IA (64-bit)                Big
         11 Linux IA (64-bit)                Little
         15 HP Open VMS                      Little
          8 Microsoft Windows IA (64-bit)    Little
          9 IBM zSeries Based Linux          Big
         13 Linux 64-bit for AMD             Little
         16 Apple Mac OS                     Big
         12 Microsoft Windows 64-bit for AMD Little
         17 Solaris Operating System (x86)   Little


如果源平臺和目標平臺是不同的字節(jié)序,那么必須在源平臺或者目標平臺上做一個額外的步驟,來轉換被傳輸的表空間到目標格式。如果它們是同樣的字節(jié)序,那么不需要做轉換,表空間可以像同平臺那樣傳輸。

傳輸表空間

  1. 傳輸表空間前的準備工作

    • 檢查表空間是自包含的:

      SQL> execute sys.dbms_tts.transport_set_check('TBS1,TBS2', true);
      SQL> select * from sys.transport_set_violations;


      注意:在表空間被傳輸之前,這些違反傳輸標準的問題必須被解決。

    • 要成功的運行傳輸表空間導出,表空間必須在 READ ONLY 模式:

      SQL> ALTER TABLESPACE TBS1 READ ONLY;
      SQL> ALTER TABLESPACE TBS2 READ ONLY;

  2. 導出元數據

    • 使用傳統(tǒng)導出工具:

      exp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_exp.log transport_tablespace=y tablespaces=TBS1,TBS2

    • 使用數據泵導出:
      首先創(chuàng)建數據泵使用的目錄對象,例如:

      CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir' ;
      GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;


      然后初始化數據泵導出:

      expdp system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir TRANSPORT_TABLESPACES = TBS1,TBS2


      如果你想要在執(zhí)行一個傳輸表空間操作的同時進行嚴格的包含關系檢查,那么使用 TRANSPORT_FULL_CHECK 參數。

      expdp system/password DUMPFILE=expdat.dmp DIRECTORY = dpump_dir TRANSPORT_TABLESPACES= TBS1,TBS2 TRANSPORT_FULL_CHECK=Y


      如果被傳輸的表空間集不是自包含的,那么導出會失敗。

  3. 使用 V$TRANSPORTABLE_PLATFORM 來確定每個平臺的字節(jié)序,你可以在每個平臺實例執(zhí)行如下查詢:

    SELECT tp.platform_id,substr(d.PLATFORM_NAME,1,30), ENDIAN_FORMAT
    FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
    WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;


    如果你發(fā)現字節(jié)序是不同的,那么傳輸表空間集時必須進行轉換:

    RMAN> convert tablespace TBS1 to platform="Linux IA (32-bit)" FORMAT '/tmp/%U';

    RMAN> convert tablespace TBS2 to platform="Linux IA (32-bit)" FORMAT '/tmp/%U';


    然后復制數據文件和導出的文件到目標環(huán)境。

  4. 導入可傳輸表空間

    • 使用傳統(tǒng)導入工具:

      imp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_imp.log transport_tablespace=y datafiles='/tmp/....','/tmp/...'

    • 使用數據泵:

      CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir';
      GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;


      然后執(zhí)行:

      impdp system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir TRANSPORT_DATAFILES='/tmp/....','/tmp/...' REMAP_SCHEMA=(source:target) REMAP_SCHEMA=(source_sch3:target_schema_sch3)


      如果你想要改變傳輸的數據庫對象的屬主,可以使用 REMAP_SCHEMA。

  5. 將表空間置于 read/write 模式:

    SQL> ALTER TABLESPACE TBS1 READ WRITE;
    SQL> ALTER TABLESPACE TBS2 READ WRITE;

使用 DBMS_FILE_TRANSFER

你也可以是使用 DBMS_FILE_TRANSFER 來拷貝數據文件到另外一個主機。

從 12c 和 11.2.0.4 開始 DBMS_FILE_TRANSFER 默認的進行轉換。若使用 DBMS_FILE_TRANSFER,當目標數據庫收到一個來自不同字節(jié)序的平臺的文件時,它對每一個塊進行轉換。作為可傳輸操作的一部分,在數據文件被移動到目標數據庫后,不需 RMAN 轉換,即可導入。

在低于 11.2.0.4 的版本上,對于 ASM 文件同樣需要執(zhí)行上面的步驟。但是如果字節(jié)序格式不同,那么你必須在轉移文件后,使用 RMAN 轉換。文件無法直接在不同平臺的兩個 ASM 實例間進行拷貝。


如下是一個使用范例:

RMAN> CONVERT DATAFILE
      '/hq/finance/work/tru/tbs_31.f',
      '/hq/finance/work/tru/tbs_32.f',
      '/hq/finance/work/tru/tbs_41.f'
      TO PLATFORM="Solaris[tm] OE (32-bit)"
      FROM PLATFORM="HP TRu64 UNIX"
      DB_FILE_NAME_CONVERT= "/hq/finance/work/tru/", "/hq/finance/dbs/tru"
      PARALLELISM=5;


相同的范例,但是這里顯示目的地是一個 ASM 磁盤組:

RMAN> CONVERT DATAFILE
      '/hq/finance/work/tru/tbs_31.f',
      '/hq/finance/work/tru/tbs_32.f',
      '/hq/finance/work/tru/tbs_41.f'
      TO PLATFORM="Solaris[tm] OE (32-bit)"
      FROM PLATFORM="HP TRu64 UNIX"
      DB_FILE_NAME_CONVERT="/hq/finance/work/tru/", "+diskgroup"
      PARALLELISM=5;

*** 警告***

  • 當使用可傳輸表空間(TTS)從 Solaris,Linux 或者 AIX 遷移到 HP/UX 時,索引組織表(IOT)可能損壞。
    這是 BUG:9816640 帶來的限制。
    當前針對這個問題沒有補丁。索引組織表(IOT)需要在 TTS 之后進行重建。

    參考文檔 1334152.1 Corrupt IOT when using Transportable Tablespace to HP from different OS
    。

  • 當使用被 drop 掉的列,可能遇到這個 Bug:13001379 - Datapump transport_tablespaces produces wrong dictionary metadata for some tables can occur。文檔 1440203.1 給出了這個警告的細節(jié)。

使用 DBMS_FILE_TRANSFER 的已知問題

=> 未公開的 Bug 13636964 - ORA-19563 from RMAN convert on datafile copy transferred with DBMS_FILE_TRANSFER (Doc ID 13636964.8)
 確認受影響的版本     
    11.2.0.3 
 問題在如下版本修復   
    12.1.0.1 (Base Release)
    11.2.0.4 (Future Patch Set) 
    
描述

    使用 DBMS_FILE_TRANSFER 轉移的文件在 RMAN convert 操作中失敗。
    例如:
     RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
     RMAN-00571: ===========================================================
     RMAN-03002: failure of conversion at target command at 01/24/2012 16:22:23
     ORA-19563: cross-platform datafile header validation failed for file +RECO/soets_9.tf 
     
    Rediscovery Notes:
     如果 RMAN 轉換一個使用 DBMS_FILE_TRANSFER 轉移的文件失敗,那么可能是由于這個 Bug。
     
    規(guī)避方案:
     使用 OS 工具轉移文件。

=> Dbms_file_transfer Corrupts Dbf File When Copying between endians (Doc ID 1262965.1)

額外的資源

社區(qū): Database Utilities

仍有其它問題嗎? 使用如上的社區(qū)來搜索相似的討論,或者就此主題開啟一個新的討論。

可傳輸表空間使用的限制

  1. 源庫和目標庫必須使用相同的字符集和國家字符集。

  2. 如果目標庫上已經有一個同名的表空間,無法進行傳輸。然而,你可以在傳輸之前,重命名要傳輸的表空間或者目標庫上的表空間。

  3. 若對象帶有下層對象(例如物化視圖)或者被包含的對象(例如分區(qū)表),則無法被傳輸。除非所有下層對象或者被包含的對象都在這個表空間集里。

    • 查看 Oracle Database Utilities 文檔中的表"Objects Exported and Imported in Each Mode",里面有幾個對象類型在表空間模式中不被導出。

  4. 如果表空間對象的所有者在目標庫中不存在,則需要在開始可傳輸表空間導入之前,手動的創(chuàng)建用戶名。

    • 注意在 10gR1 和 10gR2 中,對于 spatial 索引,不支持跨不同字節(jié)序平臺的 TTS 操作。這個限制在 11g 中取消了。

    • 在導出之前和傳輸之后,必須運行專門的 spatial 包,請參閱 Oracle Spatial 文檔.

    • 如果你使用了 spatial 索引,那么:

  5. 從 Oracle Database 11gR1 開始,對于含有 XMLType 的表空間,必須使用數據泵來導出和導入表空間元數據。

    如下的查詢返回了包含 XMLType 的表空間的列表:

    select distinct p.tablespace_name
    from dba_tablespaces p, dba_xml_tables x, dba_users u, all_all_tables t
    where t.table_name=x.table_name and
          t.tablespace_name=p.tablespace_name and
          x.owner=u.username;


    傳輸帶有 XMLType 的表空間有如下限制

    1. 目標數據庫必須安裝 XML DB。

    2. XMLType 表引用的 schema 不能是 XML DB 標準 schema。

    3. XMLType 表引用的 schema 不能有循環(huán)依賴。

    4. XMLType 表上的任何行級別安全性都會在導入時丟失。

    5. 如果一個傳輸的 XMLType 表的 schema 不在目標數據庫里,它會被導入并且注冊。如果這個 schema 在目標數據庫里已經存在了,就會返回一個錯誤,除非使用 ignore=y 選項。

  6. 高級隊列可傳輸表空間不支持帶有多個容器的 8.0 兼容版高級隊列。

  7. 你無法傳輸 SYSTEM 表空間或者用戶 SYS 擁有的對象。

  8. 不透明類型(例如 RAW,BFILE 和 AnyTypes)可以被傳輸,但是他們不會在跨平臺傳輸操作中被轉換。他們的實際框架只有應用知道,所以應用必須在這些類型被移動到新的平臺后處理字節(jié)序的問題。

  9. 浮點數 BINARY_FLOAT 和 BINARY_DOUBLE 類型是可以傳輸的,但必須使用 Data Pump,不能使用原始的導出工具 EXP。

  10. 其它更多的限制和要求,請查看以下文檔: Document 1454872.1 - Transportable Tablespace (TTS) Restrictions and Limitations: Details, Reference, and Version Where Applicable

ASM 文件的可傳輸表空間導出/導入

  • 使用 RMAN CONVERT

    沒有直接的方法將 ASM 文件作為可傳輸表空間導出/導入。但是,可以通過 RMAN 實現這個功能。

    請務必遵照如下步驟:

    • 使用原始的導入工具:

      imp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_imp.log transport_tablespace=y datafiles='/tmp/....','/tmp/...'

    • 使用數據泵導入:

      CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir';
      GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;


      然后執(zhí)行:

      impdp system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir TRANSPORT_DATAFILES='/tmp/....','/tmp/...' REMAP_SCHEMA=(source:target) REMAP_SCHEMA=(source_sch3:target_schema_sch3)


      如果你想要改變傳輸的數據庫對象的屬主的話,可以使用 REMAP_SCHEMA 參數。

    • 使用原始導出工具:

      exp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_exp.log transport_tablespace=y tablespaces=TBS1,TBS2

    • 使用數據泵導出:

      CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir';
      GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;


      然后執(zhí)行:

      expdp system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir TRANSPORT_TABLESPACES = TBS1,TBS2


      如果你想要在執(zhí)行可傳輸表空間操作同時進行嚴格的包容性檢查,那么使用 TRANSPORT_FULL_CHECK 參數:

      expdp system/password DUMPFILE=expdat.dmp DIRECTORY = dpump_dir TRANSPORT_TABLESPACES= TBS1,TBS2 TRANSPORT_FULL_CHECK=Y

    • 檢查表空間是自包含的:

      SQL>execute sys.dbms_tts.transport_set_check('TBS1,TBS2', true);
      SQL> select * from sys.transport_set_violations;


      注意:這些違反限制的結果必須在表空間傳輸前解決。

    • 要成功的進行可傳輸表空間導出,這些表空間必須處于 READ ONLY 模式。

      SQL> ALTER TABLESPACE TBS1 READ ONLY;
      SQL> ALTER TABLESPACE TBS2 READ ONLY;

    1. 導出表空間前的準備。

    2. 導出元數據。

      如果傳輸的表空間不是自包含的,那么導出會出錯。

    3. 使用 V$TRANSPORTABLE_PLATFORM 找到目標庫準確的平臺名。你可以在目標平臺實例上執(zhí)行如下的查詢。

      SELECT tp.platform_id,substr(d.PLATFORM_NAME,2,30), ENDIAN_FORMAT
      FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
      WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

    4. 以目標平臺的格式,從 ASM 文件生成一個 OS 文件。

      RMAN> CONVERT TABLESPACE TBS1
            TO PLATFORM 'HP-UX (64-bit)' FORMAT '/tmp/%U';
      RMAN> CONVERT TABLESPACE TBS2
            TO PLATFORM 'HP-UX (64-bit)' FORMAT '/tmp/%U';

    5. 拷貝生成的文件到目標服務器(如果跟源服務器不是同一臺機器)。

    6. 導入可傳輸表空間。

    7. 將表空間放置在 read/write 模式。

      SQL> ALTER TABLESPACE TBS1 READ WRITE;
      SQL> ALTER TABLESPACE TBS2 READ WRITE;


      如果你想要將數據文件從 ASM 環(huán)境傳輸到文件系統(tǒng),那么操作到此結束。但如果你想要在兩個 ASM 環(huán)境之間傳輸表空間,那么你要繼續(xù)下面的操作。

    8. 使用 rman 拷貝文件'/tmp/....dbf' 到 ASM 環(huán)境。

      rman nocatalog target /
      RMAN> backup as copy datafile '/tmp/....dbf' format '+DGROUPA';


      這里 +DGROUPA 是 ASM 磁盤組名字。

    9. 將數據文件交換到這個拷貝。
      如果是 10g 數據庫,首先要將數據文件離線:

      SQL> alter database datafile '/tmp/....dbf' offline;


      文件交換到這個拷貝:

      rman nocatalog target /
      RMAN> switch datafile '/tmp/....dbf' to copy;


      記下在 +DGROUPA 磁盤組中創(chuàng)建的拷貝的名字,例如,'+DGROUPA/s101/datafile/tts.270.5'。

    10. 使文件重新在線,我們首先要 recover 它。

      SQL> recover datafile '+DGROUPA/s101/datafile/tts.270.5';
      SQL> alter database datafile '+DGROUPA/s101/datafile/tts.270.5' online;

    11. 檢查數據文件確實已經是 ASM 環(huán)境的一部分,并且在線。

      SQL> select name, status from v$datafile;


      輸出應該是:

      +DGROUPA/s101/datafile/tts.270.5 ONLINE

  • 使用DBMS_FILE_TRANSFER

    你同樣可以使用 DBMS_FILE_TRANSFER 來將數據文件從一個 ASM 磁盤組拷貝到另外一個,甚至到另外一個主機上。從 10gR2 開始你同樣可以使用 DBMS_FILE_TRANSFER 來拷貝數據文件從 ASM 到文件系統(tǒng),以及從文件系統(tǒng)到 ASM。

    PUT_FILE 過程讀取一個本地文件或者 ASM 并且聯系遠端數據庫來創(chuàng)建一個在遠端文件系統(tǒng)的拷貝。被拷貝的文件是源文件,拷貝帶來的新文件是目標文件。直到過程成功完成,目標文件都不會被關閉。

    語法:

    DBMS_FILE_TRANSFER.PUT_FILE(
       source_directory_object       IN  VARCHAR2,
       source_file_name              IN  VARCHAR2,
       destination_directory_object  IN  VARCHAR2,
       destination_file_name         IN  VARCHAR2,
       destination_database          IN  VARCHAR2);


    其中:

    如果我們想要使用 DBMS_FILE_TRANSFER.PUT_FILE 來從源端傳輸文件到目的地主機,步驟3,4,5做如下修改:

    • dbs1: 到源數據庫的連接字符串

    • dbs2: 到目標數據庫的 dblink

    • a1.dat: 源數據庫的文件名

    • a4.dat: 目標數據庫的文件名

    • source_directory_object: 在本地源端拷貝的文件所在的目錄對象。在源端,這個目錄對象必須存在。

    • source_file_name: 從本地文件系統(tǒng)拷貝的文件的名字。這個文件必須存在于本地文件系統(tǒng)上 source_directory_object 所指定的目錄里。

    • destination_directory_object: 這是在目標端文件所要放置的目錄對象。這個目錄對象必須存在于遠端文件系統(tǒng)。

    • destination_file_name: 放在遠端文件系統(tǒng)的文件的名字。在遠端文件系統(tǒng)目標目錄中必須沒有重名的文件。

    • destination_database: 指向作為拷貝文件的目的地的遠端數據庫的數據庫鏈接的名字。

    1. 在目標數據庫主機創(chuàng)建一個目錄,授權給本地用戶。這是文件要在目標端放置的目錄對象,必須在遠端的文件系統(tǒng)存在。

      CREATE OR REPLACE DIRECTORY target_dir AS '+DGROUPA';
      GRANT WRITE ON DIRECTORY target_dir TO "USER";

    2. 在源數據庫主機創(chuàng)建一個目錄。這是要拷貝的文件在本地源端所存在的目錄對象。這個目錄對象必須在源端存在。

      CREATE OR REPLACE DIRECTORY source_dir AS '+DGROUPS/subdir';
      GRANT READ,WRITE ON DIRECTORY source_dir TO "USER";
      CREATE OR REPLACE DIRECTORY source_dir_1 AS '+DGROUPS/subdir/subdir_2';

    3. 創(chuàng)建一個 dblink 連接到目標數據庫主機:

      CREATE DATABASE LINK DBS2 CONNECT TO 'user' IDENTIFIED BY 'password' USING 'target_connect';


      這里 target_connect 是目標數據庫的連接字符串,USER 是我們將要用來轉移數據文件的用戶。

    4. 連接到源實例。會用到如下項目:

      CONNECT user/password@dbs1

      -- - put a1.dat to a4.dat (using dbs2 dblink)
      -- - level 2 sub dir to parent dir
      -- - user has read privs on source_dir_1 at dbs1 and write on target_dir 
      -- - in dbs2
      BEGIN
          DBMS_FILE_TRANSFER.PUT_FILE('source_dir_1', 'a1.dat',
                                      'target_dir', 'a4.dat', 'dbs2' );
      END;

以上是“MOS怎么利用RMAN可傳輸表空間遷移數據庫到不同字節(jié)序的平臺”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI