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

一、簡介

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

官網:

//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),註明添加緣由
● 版權所有,歡迎分享本文,轉載請保留出處