TTS实现数据库迁移,具有速度快、支持跨平台和跨版本等优点。本文记录了用TTS从10g single迁移到11g RAC的过程。

Source数据库版本和字符集设置:

SQL> select * from v$version;


BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

PL/SQL Release 10.2.0.4.0 - Production

CORE 10.2.0.4.0 Production

TNS for Linux: Version 10.2.0.4.0 - Production

NLSRTL Version 10.2.0.4.0 - Production


SQL> select * from nls_database_parameters where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');


PARAMETER VALUE

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

NLS_CHARACTERSET UTF8

NLS_NCHAR_CHARACTERSET AL16UTF16

Target数据库版本和字符集设置:


SQL> select * from v$version;


BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

PL/SQL Release 11.2.0.3.0 - Production

CORE 11.2.0.3.0 Production

TNS for Linux: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 - Production


SQL> select * from nls_database_parameters where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');


PARAMETER VALUE

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

NLS_CHARACTERSET AL32UTF8

NLS_NCHAR_CHARACTERSET AL16UTF16

1、检测平台差异


source:


SQL> SELECT d.PLATFORM_NAME, ENDIAN_FORMAT

2 FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d

3 WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;


PLATFORM_NAME ENDIAN_FORMAT

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

Linux x86 64-bit Little

target:


SQL> SELECT d.PLATFORM_NAME, ENDIAN_FORMAT

2 FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d

3 WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;


PLATFORM_NAME ENDIAN_FORMAT

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

Linux x86 64-bit Little

两者并无差异,无需进行平台格式转换。



2、Tablespace Self-Contained 检测


进行TTS的表空间必须满足自包含条件,如果不满足,则需要进行调整直至满足才可以进行TTS。


source:


SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('tbs_postmall_data,tbs_postmall_idx', TRUE);

PL/SQL procedure successfully completed.

SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;

no rows selected


出现0行,说明满足自包含条件。



3、Generate a Transportable Tablespace Set


生成TTS set之前,需要设置相关的表空间为read only模式。


SQL> alter tablespace tbs_postmall_data read only;


Tablespace altered.


SQL> alter tablespace tbs_postmall_idx read only;


Tablespace altered.

生成相关表空间的metadata dumpfile


oracle@wls112:/data/oracle/dump> expdp system dumpfile=postmall_metadata.dmp directory=dump 

transport_tablespaces=tbs_postmall_data,tbs_postmall_idx logfile=tts_export.log;


Export: Release 10.2.0.4.0 - 64bit Production on Thursday, 14 March, 2013 10:57:34


Copyright (c) 2003, 2007, Oracle. All rights reserved.

Password: 


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/******** dumpfile=postmall_metadata.dmp directory=dump transport_tablespaces=tbs_postmall_data,tbs_postmall_idx logfile=tts_export.log 

Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK

Processing object type TRANSPORTABLE_EXPORT/TABLE

Processing object type TRANSPORTABLE_EXPORT/GRANT/OWNER_GRANT/OBJECT_GRANT

Processing object type TRANSPORTABLE_EXPORT/INDEX

Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT

Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS

Processing object type TRANSPORTABLE_EXPORT/COMMENT

Processing object type TRANSPORTABLE_EXPORT/INDEX/FUNCTIONAL_AND_BITMAP/INDEX

Processing object type TRANSPORTABLE_EXPORT/INDEX/STATISTICS/FUNCTIONAL_AND_BITMAP/INDEX_STATISTICS

Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS

Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK

Master table "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded

******************************************************************************

Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:

/data/oracle/dump/postmall_metadata.dmp

Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at 10:57:51


4、Transport the Tablespace Set


把第三步生成的metadata dumpfile和相关表空间的datafile传输到target端。其中dumpfile传输到目标端的一个directory中,datafile则传送到一个临时目录(target为ASM存储)或者目标数据库的datafile目录(target为文件系统存储)。


oracle@wls112:/data/oracle/dump> scp postmall_metadata.dmp 172.24.138.101:/data/oracle/dump/

Password: 

postmall_metadata.dmp 100% 260KB 260.0KB/s 00:00 

oracle@wls112:/data/oracle/dump> cd ../oradata/postmall/

oracle@wls112:/data/oracle/oradata/postmall> scp tbs_postmall_* 172.24.138.101:/data/oracle/dump/

Password: 

tbs_postmall_data01.dbf 100% 5120MB 33.0MB/s 02:35 

tbs_postmall_data02.dbf 100% 5120MB 28.1MB/s 03:02 

tbs_postmall_idx01.dbf 100% 5120MB 25.9MB/s 03:18 


5、在目标端将datafile从文件系统传输至ASM中


不能直接用asm的cp命令来进行简单的复制,而需要用RMAN中的convert datafile功能来传输datafile


oracle@postmallrac1:/data/oracle/dump> ls -l

total 15744801

-rw-r--r-- 1 oracle asmadmin 1216 2013-03-14 09:53 import.log

-rw-r----- 1 oracle oinstall 266240 2013-03-14 11:11 postmall_metadata.dmp

-rw-r----- 1 oracle oinstall 520192 2013-03-13 12:06 postmall_user.dmp

-rw-r----- 1 oracle oinstall 5368717312 2013-03-14 11:14 tbs_postmall_data01.dbf

-rw-r----- 1 oracle oinstall 5368717312 2013-03-14 11:17 tbs_postmall_data02.dbf

-rw-r----- 1 oracle oinstall 5368717312 2013-03-14 11:21 tbs_postmall_idx01.dbf

-rw-r--r-- 1 oracle asmadmin 1582 2013-03-14 09:51 tts_import.log

用RMAN进行convert datafile


oracle@postmallrac1:/data/oracle/dump> rman target /


Recovery Manager: Release 11.2.0.3.0 - Production on Thu Mar 14 11:26:51 2013


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


connected to target database: POSTMALL (DBID=3816065011)


RMAN> convert DATAFILE '/data/oracle/dump/tbs_postmall_data01.dbf'

2> db_file_name_convert="/data/oracle/dump/tbs_postmall_data01.dbf","+DATA";


Starting conversion at target at 2013-03-14 11:27:22

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=1155 instance=postmall1 device type=DISK

channel ORA_DISK_1: starting datafile conversion

input file name=/data/oracle/dump/tbs_postmall_data01.dbf

converted datafile=+DATA/postmall/datafile/tbs_postmall_data.274.810041245

channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:02:25

Finished conversion at target at 2013-03-14 11:29:50


RMAN> convert DATAFILE '/data/oracle/dump/tbs_postmall_data02.dbf'

2> db_file_name_convert="/data/oracle/dump/tbs_postmall_data02.dbf","+DATA";


Starting conversion at target at 2013-03-14 11:30:21

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile conversion

input file name=/data/oracle/dump/tbs_postmall_data02.dbf

converted datafile=+DATA/postmall/datafile/tbs_postmall_data.275.810041421

channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:02:45

Finished conversion at target at 2013-03-14 11:33:06


RMAN> convert DATAFILE '/data/oracle/dump/tbs_postmall_idx01.dbf'

2> db_file_name_convert="/data/oracle/dump/tbs_postmall_idx01.dbf","+DATA";


Starting conversion at target at 2013-03-14 12:19:58

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile conversion

input file name=/data/oracle/dump/tbs_postmall_idx01.dbf

converted datafile=+DATA/postmall/datafile/tbs_postmall_idx.273.810044399

channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:02:35

Finished conversion at target at 2013-03-14 12:22:33

在asmcmd里可以看到添加进去的datafile


ASMCMD> ls -l

Type Redund Striped Time Sys Name

DATAFILE UNPROT COARSE FEB 25 15:00:00 Y EXAMPLE.264.807814653

DATAFILE UNPROT COARSE MAR 13 21:00:00 Y SYSAUX.257.807814555

DATAFILE UNPROT COARSE FEB 25 15:00:00 Y SYSTEM.256.807814555

DATAFILE UNPROT COARSE FEB 25 15:00:00 Y TBS_OGG.272.808070095

DATAFILE UNPROT COARSE MAR 14 11:00:00 Y TBS_POSTMALL_DATA.274.810041245

DATAFILE UNPROT COARSE MAR 14 11:00:00 Y TBS_POSTMALL_DATA.275.810041421

DATAFILE UNPROT COARSE MAR 14 12:00:00 Y TBS_POSTMALL_IDX.273.810044399

DATAFILE UNPROT COARSE FEB 25 15:00:00 Y TBS_ULECARD_DATA.270.807903909

DATAFILE UNPROT COARSE FEB 25 15:00:00 Y TBS_ULECARD_IDX.271.807903973

DATAFILE UNPROT COARSE FEB 25 15:00:00 Y UNDOTBS1.258.807814557

DATAFILE UNPROT COARSE MAR 13 22:00:00 Y UNDOTBS2.265.807814821

DATAFILE UNPROT COARSE FEB 25 15:00:00 Y USERS.259.807814557


6、Import the Tablespace Set


导入表空间之前,先把用户创建好。


SQL> create user postmall_user identified by postmall_pwd account unlock;
SQL> grant connect,resource,dba to postmall_user;
SQL> exit
oracle@postmallrac1:/data/oracle/dump> impdp system dumpfile=postmall_metadata.dmp directory=dump

logfile=tts_import.log;

Import: Release 11.2.0.3.0 - Production on Thu Mar 14 13:23:07 2013

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

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
Master table "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": system/******** dumpfile=postmall_metadata.dmp directory=dump transport_datafiles=+data/postmall/datafile/TBS_POSTMALL_DATA.274.810041245,+data/postmall/datafile/TBS_POSTMALL_DATA.275.810041421,+data/postmall/datafile/TBS_POSTMALL_IDX.273.810044399 logfile=tts_import.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type TRANSPORTABLE_EXPORT/INDEX
Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/COMMENT
Processing object type TRANSPORTABLE_EXPORT/INDEX/FUNCTIONAL_AND_BITMAP/INDEX
Processing object type TRANSPORTABLE_EXPORT/INDEX/STATISTICS/FUNCTIONAL_AND_BITMAP/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at 13:23:43


7、导入用户的其他object


因为system表空无法进行TTS,所以postmall_user在system表空间的object,比如sequences、PL/SQL packages等就没法通过TTS来迁移。所以到了最后,还需要用Data Pump把其他object给迁移过来。


source端:


oracle@wls112:/data/oracle/dump>  expdp system directory=dump schemas=postmall_user  dumpfile=postmall_user.dmp;

Export: Release 10.2.0.4.0 - 64bit Production on Thursday, 14 March, 2013 13:34:16

Copyright (c) 2003, 2007, Oracle. All rights reserved.
Password:

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
FLASHBACK automatically enabled to preserve database integrity.
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01": system/******** directory=dump schemas=postmall_user exclude=table,index dumpfile=postmall_user.dmp
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 0 KB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
/data/oracle/dump/postmall_user.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at 13:34:35

传送到target端,在target端导入:


oracle@postmallrac1:/data/oracle/dump> impdp system dumpfile=postmall_user.dmp directory=dump logfile=user_import.log


Import: Release 11.2.0.3.0 - Production on Thu Mar 14 13:36:46 2013


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

Password: 


Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,

Data Mining and Real Application Testing options

Master table "SYSTEM"."SYS_IMPORT_FULL_01" successfully loaded/unloaded

Starting "SYSTEM"."SYS_IMPORT_FULL_01": system/******** dumpfile=postmall_user.dmp directory=dump logfile=user_import.log 

Processing object type SCHEMA_EXPORT/USER

ORA-31684: Object type USER:"POSTMALL_USER" already exists

Processing object type SCHEMA_EXPORT/SYSTEM_GRANT

Processing object type SCHEMA_EXPORT/ROLE_GRANT

Processing object type SCHEMA_EXPORT/DEFAULT_ROLE

Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA

Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE

Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE

ORA-39082: Object type ALTER_PROCEDURE:"POSTMALL_USER"."UPDATE_0124" created with compilation warnings

Job "SYSTEM"."SYS_IMPORT_FULL_01" completed with 2 error(s) at 13:36:57

导入的时候,出现了两个错误,第一个"ORA-31684"是因为用户已经存在了,无需再导入。第二个错误"ORA-39082"是因为有个procedure编译告警,这个procedure已经废弃,无需理会。


用户postmall_user虽然已经创建,但是还需要手动修改该用户的default tablespace为新导入的TBS_POSTMALL_DATA


SQL> alter user postmall_user default tablespace tbs_postmall_data;
User altered.


8、检验数据


source端


SQL> show user
USER is "POSTMALL_USER"
SQL> select object_name,object_type,status from user_objects;

OBJECT_NAME OBJECT_TYPE STATUS
---------------------------------------- -------------------- -------
ORDER_LOTTERY TABLE VALID
PRIZE_RECORD TABLE VALID
IDX_OL_LOTTERY_TERM_END INDEX VALID
IDX_ORDER_LOTTERY_STATUS INDEX VALID
IDX_OL_LOTTERY_ONLYID_END INDEX VALID
IDX_LOTTERY_NO INDEX VALID
IDX_OL_ESCORDERID INDEX VALID
IDX_OL_USR_PHONE_TYPE INDEX VALID
PK_PRIZE_RECORD INDEX VALID
IDX_PR_MOBILE INDEX VALID
IDX_PR_UCNO INDEX VALID
IDX_PR_CREATE_DESC INDEX VALID
PK_T1 INDEX VALID
T1 TABLE VALID
UPDATE_0124 PROCEDURE INVALID
PK_ORDER_LOTTERY INDEX VALID
EMPLOYEES TABLE VALID
PK_EMPLOYEES INDEX VALID
IDX_EMPLOYEES_EMAIL INDEX VALID
CREATE_INDEX_CCLR PROCEDURE VALID

20 rows selected.

SQL> select count(*) from ORDER_LOTTERY;

COUNT(*)
----------
33330240

SQL> select count(*) from PRIZE_RECORD;

COUNT(*)
----------
111660

SQL> select count(*) from T1;

COUNT(*)
----------
2549760

SQL> select count(*) from employees;

COUNT(*)
----------
123

SQL> select EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL FROM EMPLOYEES WHERE EMPLOYEE_ID<=10;

EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL
----------- -------------------- ------------------------- -------------------------
1 杰森 伯恩 124@gmail.com
2 勒布朗 詹姆斯 124@gmail.com
3 科比 布莱恩特 124@gmail.com
4 沙克 奥尼尔 124@gmail.com
5 蒂姆 邓肯 124@gmail.com
6 迈克尔 乔丹 124@gmail.com
7 摩西 马龙 124@gmail.com
8 乔治 布什 124@gmail.com
9 hello baby 124@gmail.com
10 jay 刘杰 124@gmail.com

10 rows selected.

target端:


SQL> show user

USER is "POSTMALL_USER"

SQL> select object_name,object_type,status from user_objects;


OBJECT_NAME OBJECT_TYPE STATUS

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

UPDATE_0124 PROCEDURE INVALID

CREATE_INDEX_CCLR PROCEDURE VALID

IDX_PR_CREATE_DESC INDEX VALID

PK_T1 INDEX VALID

IDX_EMPLOYEES_EMAIL INDEX VALID

PK_EMPLOYEES INDEX VALID

IDX_PR_UCNO INDEX VALID

IDX_PR_MOBILE INDEX VALID

PK_PRIZE_RECORD INDEX VALID

IDX_OL_USR_PHONE_TYPE INDEX VALID

IDX_OL_ESCORDERID INDEX VALID

IDX_LOTTERY_NO INDEX VALID

IDX_OL_LOTTERY_ONLYID_END INDEX VALID

IDX_ORDER_LOTTERY_STATUS INDEX VALID

IDX_OL_LOTTERY_TERM_END INDEX VALID

PK_ORDER_LOTTERY INDEX VALID

T1 TABLE VALID

EMPLOYEES TABLE VALID

PRIZE_RECORD TABLE VALID

ORDER_LOTTERY TABLE VALID


20 rows selected.


SQL> select count(*) from ORDER_LOTTERY;


COUNT(*)

----------

33330240


SQL> select count(*) from PRIZE_RECORD;


COUNT(*)

----------

111660


SQL> select count(*) from T1;


COUNT(*)

----------

2549760


SQL> select count(*) from employees;


COUNT(*)

----------

123


SQL> select EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL FROM EMPLOYEES WHERE EMPLOYEE_ID<=10;


EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL

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

1 杰森 伯恩 124@gmail.com

2 勒布朗 詹姆斯 124@gmail.com

3 科比 布莱恩特 124@gmail.com

4 沙克 奥尼尔 124@gmail.com

5 蒂姆 邓肯 124@gmail.com

6 迈克尔 乔丹 124@gmail.com

7 摩西 马龙 124@gmail.com

8 乔治 布什 124@gmail.com

9 hello baby 124@gmail.com

10 jay 刘杰 124@gmail.com


10 rows selected.

数据均一致,中文也没有出现乱码。数据库迁移成功。



小结:

一、两边数据库的字符集(包括NLS_CHARACTERSET和NLS_NCHAR_CHARACTERSET)最好完全一样,如果不一样,也要保证source端的字符集是target端的字符集的真子集,还要加上一些限制,具体可以参考官方文档的说明。


二、在source端生成和传送TTS Set之前必须要设置相关表空间为read only模式。


三、如果从filesystem→filesystem,直接把datafile传输到目标数据库的datafile路径即可。如果从filesystem→asm,则需要多一RMAN的convert datafile操作。如果是asm→asm则还没进行测试。