【DB寶50】Oracle異構平臺遷移之完全可傳輸導出導入(Full Transportable Export & Import)

一、簡介

完全可傳輸導出導入(Full Transportable Export & Import)可以認爲是TTS的一個升級版,如下所示:

官網:

https://docs.oracle.com/en/database/oracle/oracle-database/21/upgrd/transporting-upgrading-database-full-transportable-export-import.html#GUID-E5765990-0A20-4AAC-8AFC-1930B929A172

1.1、使用場景

完全可傳輸導出/導入功能可以讓數據庫遷移更快、更容易,比exp更有效,可用於多種情形:
版本升級至新發行版Oracle DB:可以使用完全可傳輸導出/導入功能將數據庫從11.2.0.3或更高版本升級至Oracle Database 12c。要執行上述升級操作,請安裝Oracle Database 12c並創建一個空數據庫。接着,使用完全可傳輸導出/導入功能將11.2.0.3數據庫移動到Oracle Database 12c數據庫。
將數據庫移動到新計算機系統:可以使用完全可傳輸導出/導入功能將數據庫從一個計算機系統移動到另一個計算機系統。您可能想要將數據庫移動到新計算機系統以升級硬件,或將數據庫移動到其他平臺上。
將非CDB移動到非CDB或CDB:移動到CDB後,移動的數據庫將成爲與CDB關聯的PDB。完全可傳輸導出/導入功能可以高效地將11.2.0.3或更高版本的數據庫移動到Oracle Database 12c數據庫。

1.2、限制條件

執行完全可傳輸導出時有以下限制:
•如果要導出的數據庫包含加密表空間或具有加密列(透明數據加密(TDE)列或SecureFile LOB列)的表,則還必須提供ENCRYPTION_PASSWORD參數。
•如果源數據庫中含有加密表空間,則源數據庫和目標數據庫必須位於具有相同字節排列順序(endianness)的平臺上。
•如果源平臺和目標平臺的字節排列順序(endianness)不同,則必須轉換要移動的數據,使其格式與目標平臺的格式相同。使用DBMS_FILE_TRANSFER程序包或RMAN CONVERT命令。
•完全可傳輸導出無法重新啓動。
•具有存儲且已選定要導出的所有對象中的所有存儲段,必須完全位於不可移動的管理表空間(SYSTEM/SYSAUX)中或完全位於用戶定義的可移動表空間中。單個對象的存儲不能跨越這兩種表空間。
•使用完全可傳輸導出通過網絡移動數據庫時,含有LONG或LONG RAW列且位於管理表空間(例如SYSTEM或SYSAUX)中的表不受支持。
•使用完全可傳輸導出通過網絡移動數據庫時,如果審計線索信息本身存儲在用戶定義的表空間中,則無法爲存儲在管理表空間(例如SYSTEM和SYSAUX)中的表啓用審計。
•如果源數據庫和目標數據庫都運行Oracle Database 12c發行版1(12.1),則必須至少將Oracle數據泵VERSION參數設置爲12.0或將COMPATIBLE數據庫初始化參數設置爲12.0或更高版本,才能執行完全可傳輸導出。
•從11.2.0.3源數據庫開始才支持完全可傳輸導出。完全可傳輸導出功能用於11.2.0.3或更高版本的數據庫,完全可傳輸導入功能用於Oracle 12c數據庫。

執行完全可傳輸導入時有以下要求:

•如果您使用的是網絡鏈接,則在NETWORK_LINK參數中指定的數據庫必須爲Oracle Database 11g發行版2(11.2.0.3)或更高版本,且Oracle數據泵VERSION參數必須至少設置爲12。(在非網絡導入中,會從轉儲文件隱式確定VERSION=12。)

•如果源平臺和目標平臺的endian格式不同,則必須轉換要移動的數據,使其格式與目標平臺的格式相同。可使用DBMS_FILE_TRANSFER程序包或RMAN CONVERT命令轉換數據。

•如果源平臺和目標平臺的endian格式不同,則在網絡模式或轉儲文件模式下不支持對加密表空間進行完全可傳輸導入。

•使用完全可傳輸導入功能通過網絡移動數據庫時,含有LONG或LONG RAW列且位於管理表空間(例如SYSTEM或SYSAUX)中的表不受支持。

•使用完全可傳輸導入功能通過網絡移動數據庫時,如果審計線索信息本身存儲在用戶定義的表空間中,則無法爲存儲在管理表空間(例如SYSTEM和SYSAUX)中的表啓用審計。

• 目標庫字符集需要和源庫保持一致。

二、完全可傳輸操作步驟

要執行完全可傳輸操作,請執行下列步驟:
1.在導出之前,將數據庫中的所有用戶定義的表空間置於只讀狀態,排除SYSTEM、SYSAUX、TEMP和Undo表空間。

2.以具有DATAPUMP_EXP_FULL_DATABASE角色的用戶身份調用Oracle數據泵導出實用程序,並指定完全可傳輸導出選項:FULL=Y、TRANSPORTABLE=ALWAYS。LOGFILE參數很重要,因爲它將包含導入操作需要移動的數據文件的列表。要在11.2.0.3數據庫上執行該操作,請使用VERSION參數。只有Oracle Database 12c數據庫才支持完全可傳輸導入。

3.將導出的轉儲文件拷貝到目標端。

4.將相關只讀表空間的數據文件拷貝到目標端。

5.(可選)轉換文件的字節序。如果要將數據庫移動到與源平臺不同的平臺中,則請確定源平臺和目標平臺是否都支持跨平臺數據庫移動。如果兩個平臺的endian格式相同,則不必進行轉換。否則,必須使用DBMS_FILE_TRANSFER或RMAN CONVERT命令轉換源平臺或目標平臺中數據庫內的每個表空間。

6.將源表空間置於讀寫狀態。

7.以具有DATAPUMP_IMP_FULL_DATABASE角色的用戶身份調用Oracle數據泵導入實用程序,並指定完全可傳輸導入選項:FULL=Y、TRANSPORT_DATAFILES。

三、案例演示

需求:將11.2.0.3中的表空間ts_lhr、users、example,遷移到12.1.0.2的CDB數據庫的lhrpdb1中作爲一個PDB存在。

3.1、環境

源庫 目標庫
版本 11.2.0.3 12.1.0.2
ORACLE_SID LHR11G lhrcdb1
用戶表空間 ts_lhr、users、example ts_lhr、users、example
平臺 Linux x86 64-bit Linux x86 64-bit
字節序 Little Little
IP地址 172.17.0.3 172.17.0.15
字符集 AMERICAN_CHINA.AL32UTF8 AMERICAN_CHINA.AL32UTF8
-- 查詢平臺和字節序
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
     FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
     WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
     
-- 查詢字符集
select userenv('language') from dual;

3.2、源庫操作

3.2.1、將需要傳輸的用戶表空間設置爲RO狀態

將除'SYSTEM','SYSAUX','UNDOTBS1','TEMP'之外的表空間都設置爲read only模式:

select 'ALTER TABLESPACE '||name||' READ ONLY;' exec_sql
from v$tablespace 
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');

select tablespace_name,status from dba_tablespaces;

執行過程:

SYS@LHR11G> create table lhr.test tablespace ts_lhr as select * from dba_tables;

Table created.


SYS@LHR11G> select count(*) from  lhr.test;

  COUNT(*)
----------
      2835

SYS@LHR11G> select 'ALTER TABLESPACE '||name||' READ ONLY;' exec_sql
  2  from v$tablespace 
  3  where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');

EXEC_SQL
--------------------------------------------------------------------------------------------------------------------
ALTER TABLESPACE USERS READ ONLY;
ALTER TABLESPACE EXAMPLE READ ONLY;
ALTER TABLESPACE TS_LHR READ ONLY;

SYS@LHR11G> ALTER TABLESPACE USERS READ ONLY;

Tablespace altered.

SYS@LHR11G> ALTER TABLESPACE EXAMPLE READ ONLY;

Tablespace altered.

SYS@LHR11G> ALTER TABLESPACE TS_LHR READ ONLY;

Tablespace altered.

SYS@LHR11G> select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME                                              STATUS
------------------------------------------------------------ ------------------
SYSTEM                                                       ONLINE
SYSAUX                                                       ONLINE
UNDOTBS1                                                     ONLINE
TEMP                                                         ONLINE
USERS                                                        READ ONLY
EXAMPLE                                                      READ ONLY
TS_LHR                                                       READ ONLY

7 rows selected.

SYS@LHR11G> select DIRECTORY_PATH from dba_directories where DIRECTORY_NAME='DATA_PUMP_DIR';

DIRECTORY_PATH
---------------------------------------
/u01/app/oracle/admin/LHR11G/dpdump/

3.2.2、使用Data Pump導出工具執行full transportable export操作

-- 在執行導出時必須指定transportable=always,它用來判斷是否使用傳輸選項。full參數用來指定將導出整個數據庫
expdp system/lhr dumpfile=expdp_lhr_`date +%Y%m%d`.dmp directory=DATA_PUMP_DIR \
transportable=always full=y EXCLUDE=STATISTICS  PARALLEL=4 version=12 logfile=expdp_lhr_`date +%Y%m%d`.log

-- 或者可以將不需要的內容排除掉
cat > /tmp/exclude_schema.par <<"EOF"
transportable=always
full=y
PARALLEL=4
version=12
EXCLUDE=STATISTICS,SCHEMA:"in ('MDSYS','DBSNMP','SCOTT','WMSYS','SH','HR','BI','OE','IX','SYSMAN','XDB','OUTLN','MGMT_VIEW','FLOWS_FILES','ORDSYS','EXFSYS','APPQOSSYS','APEX_030200','OWBSYS_AUDIT','ORDDATA','CTXSYS','ANONYMOUS','ORDPLUGINS','OWBSYS','SI_INFORMTN_SCHEMA','OLAPSYS','ORACLE_OCM','XS$NULL','PM','MDDATA','DIP','APEX_PUBLIC_USER','SPATIAL_CSW_ADMIN_USR','SPATIAL_WFS_ADMIN_USR')"
EOF


expdp system/lhr dumpfile=expdp_lhr_`date +%Y%m%d`.dmp directory=DATA_PUMP_DIR \
parfile=/tmp/exclude_schema.par logfile=expdp_lhr_`date +%Y%m%d`.log

執行過程:


[oracle@lhrora11203 ~]$ expdp system/lhr dumpfile=expdp_lhr.dmp directory=DATA_PUMP_DIR transportable=always EXCLUDE=STATISTICS full=y version=12 logfile=expdp_lhr.log

Export: Release 11.2.0.3.0 - Production on Thu Apr 8 10:03:26 2021

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_FULL_02":  system/******** dumpfile=expdp_lhr.dmp directory=DATA_PUMP_DIR transportable=always full=y version=12 logfile=expdp_lhr.log 
Estimate in progress using BLOCKS method...
Processing object type DATABASE_EXPORT/PLUGTS_FULL/FULL/PLUGTS_TABLESPACE
Processing object type DATABASE_EXPORT/PLUGTS_FULL/PLUGTS_BLK
Processing object type DATABASE_EXPORT/EARLY_OPTIONS/TABLE_DATA
Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA
Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE_DATA
Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 90.06 MB
Processing object type DATABASE_EXPORT/PRE_SYSTEM_IMPCALLOUT/MARKER
Processing object type DATABASE_EXPORT/PRE_INSTANCE_IMPCALLOUT/MARKER
Processing object type DATABASE_EXPORT/TABLESPACE
。。。。。。。。。。。。
. . exported "XDB"."XDB$H_INDEX"                         1.177 MB     306 rows
. . exported "XDB"."XDB$H_LINK"                          811.9 KB    7666 rows
. . exported "XDB"."XDB$ACL"                             13.64 KB      11 rows
。。。。。。。。。。。。
. . exported "SYSTEM"."REPCAT$_TEMPLATE_TARGETS"             0 KB       0 rows
. . exported "SYSTEM"."REPCAT$_USER_AUTHORIZATIONS"          0 KB       0 rows
. . exported "SYSTEM"."REPCAT$_USER_PARM_VALUES"             0 KB       0 rows
. . exported "SYSTEM"."SQLPLUS_PRODUCT_PROFILE"              0 KB       0 rows
Master table "SYSTEM"."SYS_EXPORT_FULL_02" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_FULL_02 is:
  /u01/app/oracle/admin/LHR11G/dpdump/expdp_lhr.dmp
******************************************************************************
Datafiles required for transportable tablespace EXAMPLE:
  /u01/app/oracle/oradata/LHR11G/example01.dbf
Datafiles required for transportable tablespace TS_LHR:
  /u01/app/oracle/oradata/LHR11G/ts_lhr01.dbf
Datafiles required for transportable tablespace USERS:
  /u01/app/oracle/oradata/LHR11G/users01.dbf
Job "SYSTEM"."SYS_EXPORT_FULL_02" successfully completed at 10:14:13

3.2.3、將dmp文件和數據文件傳輸到目的端

將文件/u01/app/oracle/admin/LHR11G/dpdump/expdp_lhr.dmp、/u01/app/oracle/oradata/LHR11G/example01.dbf、/u01/app/oracle/oradata/LHR11G/ts_lhr01.dbf、/u01/app/oracle/oradata/LHR11G/users01.dbf傳輸到目的端:

scp expdp_lhr_20210408.* [email protected]:/u01/app/tts/
scp /u01/app/oracle/oradata/LHR11G/example01.dbf [email protected]:/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/
scp /u01/app/oracle/oradata/LHR11G/ts_lhr01.dbf [email protected]:/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/
scp /u01/app/oracle/oradata/LHR11G/users01.dbf [email protected]:/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/

另外,拷貝數據文件也可以使用dbms_file_transfer包,如下:

-- 源庫執行
create database link dbl_lhrpdb1
  connect to system identified by "lhr"
 using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 172.17.0.15)(PORT = 1521)) )(CONNECT_DATA =(SERVICE_NAME = lhrpdb1)))';


-- 源庫執行
create or replace directory TTS_DATAFILE_SOURCE as '/u01/app/oracle/oradata/LHR11G/';
grant all on directory TTS_DATAFILE_SOURCE to public;


-- 目標庫執行
create or replace directory TTS_DATAFILE_DES as '/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/';
grant all on directory TTS_DATAFILE_DES to public;


--  源庫執行,拷貝文件到目標庫
exec dbms_file_transfer.put_file(source_directory_object =>'TTS_DATAFILE_SOURCE',source_file_name => 'example01.dbf',destination_directory_object => 'TTS_DATAFILE_DES',destination_file_name => 'example01.dbf',destination_database => 'dbl_lhrpdb1');
exec dbms_file_transfer.put_file(source_directory_object =>'TTS_DATAFILE_SOURCE',source_file_name => 'ts_lhr01.dbf',destination_directory_object => 'TTS_DATAFILE_DES',destination_file_name => 'ts_lhr01.dbf',destination_database => 'dbl_lhrpdb1');
exec dbms_file_transfer.put_file(source_directory_object =>'TTS_DATAFILE_SOURCE',source_file_name => 'users01.dbf',destination_directory_object => 'TTS_DATAFILE_DES',destination_file_name => 'users01.dbf',destination_database => 'dbl_lhrpdb1');

3.2.4、將源數據庫中的所有用戶表空間設置爲讀寫模式

select 'ALTER TABLESPACE '||name||' READ WRITE;' exec_sql
from v$tablespace 
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');

select tablespace_name,status from dba_tablespaces;

3.3、目標庫操作

3.3.1、轉換字節序(可選)

若原平臺和目標平臺的字節序不一樣,則還需要進行字節序的轉換;若一樣,則不需要執行轉換。在rman中執行:

CONVERT DATAFILE 
'/u01/app/tts/example01.dbf',
'/u01/app/tts/ts_lhr01.dbf',
'/u01/app/tts/users01.dbf'
TO PLATFORM="Linux x86 64-bit"
FROM PLATFORM="Linux x86 64-bit"
DB_FILE_NAME_CONVERT='/u01/app/tts/', '/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/'
PARALLELISM=4;

3.3.2、開始導入

-- 創建目錄
create or replace directory tts_dump as '/u01/app/tts/';
grant all on directory tts_dump to public;
select DIRECTORY_PATH from dba_directories where DIRECTORY_NAME='TTS_DUMP';


-- 導入
impdp system/lhr@localhost/LHRPDB1 dumpfile=expdp_lhr_20210408.dmp directory=tts_dump \
transport_datafiles='/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/example01.dbf',  \
'/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/ts_lhr01.dbf',  \
'/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/users01.dbf'  \
 logfile=import_lhr.log

3.3.3、檢查狀態

sqlplus  system/lhr@localhost/LHRPDB1
col TABLESPACE_NAME format a20
col FILE_NAME format a100
select tablespace_name,file_name from dba_data_files;
select tablespace_name,status from dba_tablespaces;

執行過程:

SYSTEM@localhost/LHRPDB1> col TABLESPACE_NAME format a20
SYSTEM@localhost/LHRPDB1> col FILE_NAME format a100
SYSTEM@localhost/LHRPDB1> select tablespace_name,file_name from dba_data_files;

TABLESPACE_NAME      FILE_NAME
-------------------- ----------------------------------------------------------------------------------------------------
SYSTEM               /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/system01.dbf
SYSAUX               /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/sysaux01.dbf
USERS                /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/users01.dbf
EXAMPLE              /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/example01.dbf
TS_LHR               /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/ts_lhr01.dbf

SYSTEM@localhost/LHRPDB1> select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME      STATUS
-------------------- ------------------
SYSTEM               ONLINE
SYSAUX               ONLINE
TEMP                 ONLINE
USERS                ONLINE
EXAMPLE              ONLINE
TS_LHR               ONLINE

6 rows selected.

SYSTEM@localhost/LHRPDB1> select count(*) from  lhr.test;

  COUNT(*)
----------
      2835

四、總結

1、完全可傳輸導出導入(Full Transportable Export & Import)可以認爲是TTS的一個升級版,步驟基本和TTS一致

2、完全可傳輸導出導入的停機時間主要花費在將源庫的數據文件拷貝到目標庫的過程,所以,正式遷移時可以考慮臨時增大帶寬

3、字節序的轉換建議在目標端執行

4、生產庫完成遷移後,建議在目標庫對整庫收集統計信息

5、導入到PDB的時候,需要注意連接串的寫法,確保連接到的是PDB

About Me


● 本文作者:小麥苗,部分內容整理自網絡,若有侵權請聯繫小麥苗刪除
● 本文原始發表於個人微 信公衆號(DB寶)上
● QQ羣號: 230161599 、618766405,微信羣私聊
● 個人QQ號(646634621),微 信號(db_bao),註明添加緣由
● 版權所有,歡迎分享本文,轉載請保留出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章