One of the really cool and helpful features in Oracle Database 12c is called Full Transportable Export/Import.
It utilizes the technique of Transportable Tablesspaces - cross-platform, cross- Endianness, cross-version - but lets Oracle Data Pump do all the "dirty" work of rebuilding everything kept in your SYSTEM and SYSAUX tablespace including views, synonyms, public objects, grants, sequences etc etc etc.
You can even combine it with RMAN Incremental Backups - of course cross-platform and cross-Endianness as well - in order to decrease the downtime for large databases.
This will work with an Oracle Database 11.2.0.3/4 to Oracle Database 12c - so you don't have to be on Oracle Database 12c in order to leverage from that cool new feature.
在Oracle 8i中引入了可传输表空间(TTS)特性
在Oracle 10g引入了跨平台可传输表空间(XTTS)特性,存放在非用户表空间(SYSTEM和SYSAUX表空间)相关的用户对象需要手动操作
在Oracle 10g引入了数据泵(DataPump)的特性
管理表空间:是指SYSTEM, SYSAUX, TEMP, UNDO,这些表空间包含核心Oracle数据库功能的过程、包和种子数据,以及Oracle提供的Oracle space、Oracle Text、OLAP、JAVAVM和XML数据库等数据库组件。
用户表空间:是我们创建的保存应用程序数据的表空间。
数据泵:需要在数据库打开的情况下,通过读取数据库抽取数据,支持跨平台导出导入,很方便灵活。但在数据库很大的情况下,在宕机时间很短的情况下,就不方便了。
传输表空间:涉及相对应的表空间的数据文件的副本在操作系统级别的副本(或者转换),因此在数据库很大的情况下,用这种方式做迁移或升级很不错。但是存在一个问题,就是只能迁移用户表空间,就是除了SYSTEM, SYSAUX, TEMP, UNDO这些。如果一个用户的的对象存放在管理表空间比如SYSTEM、SYSAUX表空间,那么这个对象就不能迁移过去,它们将被忽略,这个就会有问题。
在Oracle 11g(11.2.0.3以上)引入了Full Transportable Export/Import的特性,通过这种方法(和原来跨平台传输表空间的方式基本上一样,只是增加了对存放在system、sysaux等表空间的用户对象做了增强,相当于是全部的迁移),即使你的对象存放在SYSTEM/SYSAUX表空间,也可以正常的迁移,这就比之前的跨平台传输表空间更完善了一步,也支持跨平台。我们也可以称之为FXTTS,也可以使用Oracle开发的xtts工具。所以,如果你的源端数据库版本是11.2.0.3以上的数据库版本,建议使用Full Transportable的方式,很方便。
在使用Full Transportable Export/Import之前,需注意以下事项:
源端数据库必须是11.2.0.3以上版本的数据库
授权要执行迁移的用户DATAPUMP_IMP_FULL_DATABASE角色
设置表空间为只读
在源端用数据泵导出时必须使用FULL=Y TRANSPORTABLE=ALWAYS
如果源端的compatible参数值小于12.0,在导出时必须加参数VERSION=12
目标库必须是Oracle数据库12c以上的的数据库(可以是NON-CDB或者是PDB)
注意:
1.如果源平台和目标平台都具有相同的endian格式,那么数据文件就可以像在同一平台上一样进行传输。如果源平台和目标平台具有不同的endianness。必须做转化,有两种方式
A.使用RMAN CONVERT命令
B.使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE过程将传输的数据文件转换为目标平台格式
2.要将加密的表空间传输到具有相同endianness的平台,请在导出期间使用expdp ENCRYPTION_PASSWORD参数。在导入期间,为impdp ENCRYPTION_PASSWORD参数指定相同的值。
特别注意:加密的表空间,不能跨endianness,就是比如原平台是AIX,目标端如果是Linux,Full Transportable的迁移方式是不支持的。
在本例中,我们使用FULL transportable将Oracle数据库11g Release 2(11.2.0.3)数据库从Oracle Solaris x86服务器迁移到运行在Oracle Linux上的CDB中的Oracle数据库12c PDB。
本例使用staging,需要从源数据库导出完整的可传输文件,然后在目标数据库导入完整的可传输文件。源数据库有两个用户表空间:hr_1和hr_2。
Tablespace Name | Encrypted | Datafile Name |
HR_1 | YES | /u01/app/oracle/oradata/hr_db/hr_101.dbf |
HR_2 | NO | /u01/app/oracle/oradata/hr_db/hr_201.dbf |
对于本例,我们假设目标数据库的Oracle SID是HR_PDB,目标PDB的数据文件存储在目标服务器上的 /u01/app/oracle/oradata/hr_pdb/目录中。
注意本例中的一个表空间是加密的。用于建立和管理透明数据加密(TDE)的命令在Oracle Database 11g Release 2和Oracle Database 12c之间发生了变化。
有关为数据库实现TDE的更多信息,请参阅Oracle Database Advanced Security Guide。
STEP 1: Check the endianness of both platforms
SQL> SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d WHERE tp.PLATFORM_ID = d.PLATFORM_ID;
STEP 2: Verify that the set of tablespaces to be transported is self-contained
SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('hr_1,hr_2', TRUE);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
STEP 3: Create a directory object in the source database
SQL> CREATE DIRECTORY dp_dir AS ’/u01/app/datafiles’;
STEP 4: Place the hr_1 and hr_2 tablespaces in read-only mode
SQL> ALTER TABLESPACE hr_1 READ ONLY;
SQL> ALTER TABLESPACE hr_2 READ ONLY;
STEP 5: Invoke full transportable export on the source database
$ expdp system/manager full=y transportable=always version=12 directory=dp_dir dumpfile=full_tts.dmp metrics=y exclude=statistics encryption_password=secret123word456 logfile=full_tts_export.log
STEP 6: Transport the tablespace data files and the export dump file from source to target
$ cd /u01/app/oracle/oradata/hr_pdb/
$ cp /net/<source-server>/u01/app/oracle/oradata/hr_db/hr_101.dbf .
$ cp /net/<source-server>/u01/app/oracle/oradata/hr_db/hr_201.dbf .
$ cp /net/<source-server>/u01/app/datafiles/full_tts.dmp .
STEP 7: Create a directory object on the destination database
SQL> CREATE DIRECTORY dp_dir AS '/u01/app/oracle/oradata/hr_pdb';
STEP 8: Invoke full transportable import on the destination database
$ impdp system/manager@hr_pdb directory=dp_dir dumpfile=full_tts.dmp logfile=full_tts_imp.log metrics=y encryption_password=secret123word456 transport_datafiles='/u01/app/oracle/oradata/hr_pdb/hr_101.dbf','/u01/app/oracle/oradata/hr_pdb/hr_201.dbf'
STEP 9: (Optional) Restore user tablespaces to read-write mode on the source database
SQL> ALTER TABLESPACE hr_101 READ WRITE;
SQL> ALTER TABLESPACE hr_201 READ WRITE;
Reference
https://docs.oracle.com/en/database/oracle/oracle-database/18/spucd/transporting-databases.html
https://mikedietrichde.com/hands-on-lab/hol-18c-migrate-ftex/
https://blogs.oracle.com/upgrade/full-transportable-exportimport-white-paper
https://blogs.oracle.com/upgrade/full-transportable-exportimport-migrating-an-11204-database-to-oracle-database-12c-into-the-oracle-cloud
https://www.oracle.com/technetwork/community/developer-vm/vts-hol-2415742.html
https://apex.oracle.com/pls/apex/f?p=202202:2::APPLICATION_PROCESS=downloadFile:::F20225_ID:2081
https://www.oracle.com/technetwork/database/enterprise-edition/full-transportable-wp-18c-4394831.pdf
https://www.oracle.com/technetwork/database/enterprise-edition/full-transportable-wp-12c-1973971.pdf