一.说明


先看一下endianness格式问题:

SQL> SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_NAME;


PLATFORM_ID PLATFORM_NAME                            ENDIAN_FORMAT

--------------------------------------------------- --------------

         6 AIX-Based Systems (64-bit)               Big

        16 Apple Mac OS                             Big

        21 Apple Mac OS (x86-64)                    Little

        19 HP IA Open VMS                           Little

        15 HP Open VMS                              Little

         5 HP Tru64 UNIX                            Little

         3 HP-UX (64-bit)                           Big

         4 HP-UX IA (64-bit)                        Big

        18 IBM Power Based Linux                    Big

         9 IBM zSeries Based Linux                  Big

        10 Linux IA (32-bit)                        Little


PLATFORM_ID PLATFORM_NAME                            ENDIAN_FORMAT

--------------------------------------------------- --------------

        11 Linux IA (64-bit)                        Little

        13 Linux x86 64-bit                         Little

         7 Microsoft Windows IA (32-bit)            Little

         8 Microsoft Windows IA (64-bit)            Little

        12 Microsoft Windows x86 64-bit             Little

        17 Solaris Operating System (x86)           Little

        20 Solaris Operating System (x86-64)        Little

         1 Solaris[tm] OE (32-bit)                  Big

         2 Solaris[tm] OE (64-bit)                  Big


20 rows selected.


从以上的结果显示,endian 格式是big的系统是AIX,HP-UNIX,Solaris等UNIX系统,而这些系统与硬件相关,所以不能模拟,所以这里直接引用MOS 上的一个示例:

10g : Transportable Tablespaces AcrossDifferent Platforms [ID 243304.1]


二. 示例


2.1. Check for restrictions

--检查TTS 使用限制

Review the"Limitations on Transportable Tablespace Use" section in ​​Note371556.1​​.

Among otherthings, objects that reside in the SYSTEM tablespace and objects owned by SYSwill not be transported. This includes but is not limited to users, privileges,PL/SQL stored procedures, and views.


If you usespatial indexes, apply the solution in ​​Note579136.1​​ "IMPDP TRANSPORTABLE TABLESPACE FAILS for SPATIALINDEX)" before continuing.


2.2. Prepare the database

--使用TTS 之前的准备工作


2.2.1 Check that thetablespace will be self-contained

SQL>execute sys.dbms_tts.transport_set_check('TBS1,TBS2', true);

SQL> select * from sys.transport_set_violations;

==>These violations must be resolved before the tablespaces can betransported。

--检查表空间的自包含,这一步必须验证通过才可以进行TTS 操作


2.2.2 Set the tablespaceto READ ONLY

SQL> alter tablespace REPOSIT read only;

Tablespace altered.

--将要迁移的表空间设置为只读。


2.3. Export metadata

--在source 端(HP-UNIX)上导数表空间的meatdata

<HP-UX>


--使用exp

exp userid=\'/ as sysdba\'transport_tablespace=y 

tablespaces=reposit 

file=tts.dmp log=exp_tts.log 

statistics=none


Export: Release 10.2.0.4.0 - Mon Nov 26 11:49:49 2007

...


Note: table data (rows) will not be exported

About to export transportable tablespace metadata...

For tablespace REPOSIT ...

. exporting cluster definitions

. exporting table definitions

. . exporting table MTG_COL_DEP_CHG

. . exporting table MTG_DATABASES 

....

. . exporting table SYBASE11_SYSUSERS

. exporting referential integrity constraints

. exporting triggers

. end transportable tablespace metadata export

Export terminated successfully without warnings.

Review the exportlog for warnings and errors and resolve issues before continuing. Failure to doso can result in data loss.


--也可以使用expdp:

Datapump can be used for that purpose too:


expdp \'/ as sysdba\' directory=tts_dumpdumpfile=tts1_dp.dmp logfile=tts_dump_log:tts.log

transport_tablespaces=tts_1,tts_2 transport_full_check=y


Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_02":system/******** directory=tts_datafile dumpfile=tts1.dmplogfile=tts_dump_log:tts.log transport

_tablespaces=tts_1,tts_2 transport_full_check=y

Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK

Processing object type TRANSPORTABLE_EXPORT/TABLE

Processing object type TRANSPORTABLE_EXPORT/INDEX

Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS

Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS

Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK

Master table "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_02" successfullyloaded/unloaded

***********************************************************************Dumpfile set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_02 is:

+DATA/tts1.dmp

Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_02" successfullycompleted at 14:00:34

Movement of data and Enabling TTS 



2.4. Check the endianness of the target database and convert,if necessary

--检查endianness 格式,如果需要则进行转换


2.4.1 Case 1: SameEndianness (Big->Big or Little->Little)

--endianness 格式相同

The source platform is Sun SPARC Solaris:endianness Big

The target platform is HP-UX (64-bit): endianness Big


SQL> select PLATFORM_ID , PLATFORM_NAMEfrom v$database;


          PLATFORM_IDPLATFORM_NAME

          -----------------------------------------

                   3 HP-UX (64-bit)

No conversion is needed for files that (1) do NOT contain UNDO/Rollback  segmentsand (2) have a source and target OS with the same endianness. 

Refer to ​​Note.415884.1​​ "CrossPlatform Database Conversion  with same Endian" to determine whichfiles contain UNDO/Rollback segments.


2.4.2 Case 2: DifferentEndianness (Big->Little or Little->Big)

--endianness 格式不同,则需要进行转换

The source platform is Microsoft WIndowsNT: endianness Little

The target platform is HP-UX (64-bit): endianness Big


If we move the files and import the tablespace:

--如果我们不转换,直接imp,则会报如下错误信息

. importing SYS's objects into SYS

IMP-00017: following statement failed with ORACLE error 1565:

"BEGINsys.dbms_plugts.beginImpTablespace('TBS_TTS',37,'SYS',1,0,8192,2,57"

"54175,1,2147483645,8,128,8,0,1,0,8,462754339,1,1,5754124,NULL,0,0,NULL,NULL"

"); END;"

IMP-00003: ORACLE error 1565 encountered

ORA-01565: error in identifying file'/database/db101b2/V101B2/datafile/reposit01.dbf'

ORA-27047: unable to read the header block of file

HP-UX Error: 2: No such file or directory

Additional information: 2

ORA-06512: at "SYS.DBMS_PLUGTS", line 1540

ORA-06512: at line 1

IMP-00000: Import terminated unsuccessfully

You have to convertthe files; the files can be converted on source OR on target :

--所以在开始TTS之前,必须先进行转换,这个转换可以在Source 端进行,也可以在target 端进行:

(1)locally on the SOURCE before theimport step so that the files are endian compatible:

--在Source 端进行转换:


<Solaris>

rman target=/


Recovery Manager: Release 10.2.0.4.0 - 64bit 

connected to target database: V101B2 (DBID=3287908659)


RMAN> convert tablespace 'REPOSIT'
2> to platform="Linux IA (32-bit)"
3> db_file_name_convert='/database/db101b2/V101B2/datafile/reposit01.dbf',
4> '/tmp/reposit01.dbf';


Starting backup at 26-NOV-07

using target database controlfile instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=8 devtype=DISK

channel ORA_DISK_1: starting datafile conversion

input datafile fno=00006 name=/database/db101b2/V101B2/datafile/reposit01.dbf

converted datafile=/tmp/reposit01.dbf

channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01

Finished backup at 26-NOV-07

The converted datafile is staged in /tmp directory until it is copied to thetarget server.

--转换之后的datafile存放在/tmp 目录下,我们把/tmp 目录下的datafile 拷贝到Target的对应目录。


(2)remotely on the target server after having copiedthem on the server.

--先将datafile从source 端拷贝到Target ,然后在Target 端进行转换


Conversion ontarget platform is a way forward when the v$transportable_platform of thesource does Not list the target platform. 


When conversionis done on the target platform then CONVERT DATAFILE is used instead of CONVERTTABLESPACE, ie:

RMAN> CONVERT DATAFILE 

'/database/db101b2/V101B2/datafile/reposit01.dbf'

TO PLATFORM="Linux IA (32-bit)"

FROM PLATFORM="HP TRu64 UNIX"

DB_FILE_NAME_CONVERT="/database/db101b2/V101B2/datafile/","/tmp/";

--注意这里的命令与在source 端有出入


2.5. Move datafiles and export dump file

$ftp tts.dmp 

/database/db101b2/V101B2/datafile/reposit01.dbf (no conversion)

or 


/tmp/reposit01.dbf (converted file ifconversion had been required)


2.6. Import metadata

--使用imp

$ imp userid=\'/ as sysdba\'TRANSPORT_TABLESPACE=Y 

datafiles=/database/db101b2/V101B2/datafile/reposit01.dbf 

(or /tmp/reposit01.dbf )

file=tts.dmp log=imp_tts.log 


Import: Release 10.2.0.4.0 - on Mon Nov 26 03:37:20 2007


Export file created by EXPORT:V10.02.00 via conventional path

About to import transportable tablespace(s) metadata...

...

. importing SYS's objects into SYS

. importing OMWB's objects into OMWB

. . importing table "MTG_COL_DEP_CHG"

...

. . importing table "SYBASE11_SYSUSERS"

Import terminated successfully without warnings.

Review the import log for warnings and errors and resolve issues

before continuing. Failure to do so can result in data loss.


--使用expdp:

If we exported with DataPump, import mustbe done with that same tool:


impdp \'/ as sysdba\' directory=tts_dumpdumpfile=tts1_dp.dmp logfile=tts_dump_log:tts.log

transport_datafiles='/database/oradata/tts1_db1.dbf','/database/oradata/tts2_db1.dbf' 

It's not possible to import when tablespace already exists or when targetschema is not created.

If users don't exist, DataPump provides an alternative by using remap_schema(for import utility we can create the schema), ie:

REMAP_SCHEMA=<source_user>:<target_user>

--如果impdp 的用户不存在,可以使用impdp 的remap_schema 参数来进行用户的转换。



If tablespace already exists in target, wecan use remap_tablespace parameter on impdp (there is no option in importbut rename tablespace at source or the existing one at target).

REMAP_TABLESPACE=(<source_tbs1>:<target_tbs1>,<source_tbs2>:<target_tbs2>,...)

--如果表空间在Target上已经存在,那么可以使用remap_tablespace 参数来进行表空间的转换。



2.7. Set the imported tablespace to READ WRITE

--操作完毕后,将表空间设置为读写模式

SQL> alter tablespace reposit readwrite;

Tablespace altered.