在实验前我们需要明白一些明白一些概念
TRANSPORT_TABLESPACE 导出可传输表空间元数据,通过这个选项对一组自包含,只读的表空间只导出元数据,然后在操作系统层将这些表空间的文件拷贝到目标平台,并将元数据导入数据字典 这个过程称为插入 plugging 即完成了迁移
表空间传输是:一个数据库移动到另一个数据库,提供 在数据库之间有效移动大数据的一种简易方法
1、可移植表空间的应用场景 :
把数据从源数据库移动到数据仓库
把数据从升级数据库移动到数据集市
把数据从数据仓库移动到数据集市
执行表空间时间点恢复 (PITR)
归档历史数据
2、传输表空间的简要操作步骤
1) 确定平台的 Endian 格式
2) 检测
2) 确保表空间为自包含并使其只读
3) 用 exp、expdp等实用程序导出元数据
4) 转换数据文件以匹配 Endian 格式 ( 若一致可跳过)
5) 拷贝文件到目标系统
6) 使用 imp导入实用程序导入元数据
源端数据库: linux 32位 oracle10g
目标数据库: window 32 oracle11g
3、创建测试表空间
create tablespace test datafile ' /u01/oracle/oradata/ora10g/test01.dbf ' size 10m autoextend on maxsize 100m;
create user test identified by test default tablespace test;
grant connect,resource to test;
conn test/test;
create table t1(a int) tablespace test;
insert into t1 values(1000);
insert into t1 values(2000);
commit;
create index ind_t1 on t1(a) tablespace test;
(1) 确定平台的 Endian 格式
SQL> select * from v$transportable_platform order by platform_id;
P LATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- ----------------------------------------------------------------------------------------------------- --------------
1 Solaris[tm] OE (32-bit) Big
2 Solaris[tm] OE (64-bit) Big
3 HP-UX (64-bit) Big
4 HP-UX IA (64-bit) Big
5 HP Tru64 UNIX Little
6 AIX-Based Systems (64-bit) Big
7 Microsoft Windows IA (32-bit) Little
8 Microsoft Windows IA (64-bit) Little
9 IBM zSeries Based Linux Big
10 Linux IA (32-bit) Little
11 Linux IA (64-bit) Little
PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- ----------------------------------------------------------------------------------------------------- --------------
12 Microsoft Windows 64-bit for AMD Little
13 Linux 64-bit for AMD Little
15 HP Open VMS Little
16 Apple Mac OS Big
17 Solaris Operating System (x86) Little
18 IBM Power Based Linux Big
17 rows selected.
源端平台:
SQL> SELECT d.platform_name, endian_format FROM v$transportable_platform tp, v$database d WHERE tp.platform_name = d.platform_name;
PLATFORM_NAME ENDIAN_FORMAT
----------------------------------------------------------------------------------------------------- --------------
Linux IA (32-bit) Little
目标端平台:
SQL> SELECT d.platform_name, endian_format FROM v$transportable_platform tp, v$database d WHERE tp.platform_name = d.platform_name;
PLATFORM_NAME ENDIAN_FORMAT
----------------------------------------------------------------------------------------------------- --------------
Microsoft Windows IA (32-bit) Little
数据文件所以不能跨平台,主要是由于不同平台的字节顺序不同, 目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian, 我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。 一些操作系统(包括Windows)在低位内存地址中存放二进制数据的最低有效字节,因此这种系统被称为Little Endian;一些操作系统(包括Solaris)将最高有效字节存储在低位内存地址中,因此这种系统被称为Big Endian。
举一个简单点的例子,假如1122这样一个数据要存入不同系统,对于Little Endian的系统,存储的顺序就是2211,小头在前;而对于Big Endian的系统来说,存储顺序就是1122,大头在前,显然Big Endian更符合我们通常的语言习惯
从上面的查询我们可以看到 linux 32位 为 Little , window 32 为 window 32 ,所以他们之间可以进行表空间传输
2)检测自包含
自包含: 表示用于传输的内部表空间集没有引用指向外部的表空间集
自包含又分为两种:一种自包含表空间集 第二为:完全(严格)自包含表空间集
SQL> desc dbms_tts
PROCEDURE TRANSPORT_SET_CHECK
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
TS_LIST CLOB IN
INCL_CONSTRAINTS BOOLEAN IN DEFAULT
FULL_CHECK BOOLEAN IN DEFAULT
部分输出
常见的以下情况是违反自包含原则的
1,索引在内部表空间集,而表在外部表空间集违反了自保护(相反的,如果表在内部表空间集,而索引在外部表空间集,则不违反自包含原则)
2,分区表一部分区在内部表空间集,一部份在外部表空间集(对于分区表,要么全部包含在内部表空间集中,要么全不包含)
3,如果在传输表空间同时传输约束,则对于用完整性约束,约束指向的表在外部表空间集,则违反自包含约束,如果不传输约束,则与约束指向无关。
4,表在内部表空间集,而lob列在外部表空间集,则违反自包含约束。
通常可以通过系统包DBMS_TTS来检查表空间是否自包含,验证可以两种方式执行;非严格方式和严格方式。
非严格自包含检查,下面的检查时通过的
conn /as sysdba
EXEC dbms_tts.transport_set_check('TEST',TRUE)
PL/SQL procedure successfully completed.
EXEC dbms_tts.transport_set_check('表空间',TRUE)
严格验证自包含
严格自包含检查,但是严格检查时不通过的,因为索引不再同一个表空间
SQL> exec DBMS_TTS.TRANSPORT_SET_CHECK('test',true,true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected
也可以多个表空间一起检测
SQL>execute dbms_tts.transport_set_check('TEST,USERS',true,true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected
例如表在A表空间,索引在B表空间,如果只传输A的话,就会违反自包含约束条件,表上的索引就会失效,传输不完整,解决方法:同时传输A和B两个表空间。在此我们只传输test表空间,索引在后面重建
3) 确保表空间为自包含并使其只读
conn /as sysdba
SQL> alter tablespace test read only;
Tablespace altered.
SQL> select name,enabled from v$datafile;
NAME ENABLED
-------------------------------------------------- ----------
/u01/oracle/oradata/ora10g/system01.dbf READ WRITE
/u01/oracle/oradata/ora10g/undotbs1.dbf READ WRITE
/u01/oracle/oradata/ora10g/sysaux01.dbf READ WRITE
/u01/oracle/oradata/ora10g/users01.dbf READ WRITE
/u01/oracle/oradata/ora10g/test01.dbf READ ONLY
4) 用 exp、expdp等实用程序导出元数据
利用rman创建只读表空间备份,这里必须有相应表空间的备份才能成功执行
RMAN>transport tablespace test tablespace destination '/export/home/oracle/oradata/users' auxiliary destination '/export/home/oracle/oradata/ test_5 ';
使用exp或expdp的transport_tablespace=y参数导出表空间的元数据 即结构信息Exp方式:
exp userid=\'/ as sysdba\' transport_tablespace=y tablespaces=test file=/home/oracle/test.dmp
使用SYS用户只导出tsport表空间的元数据(结构信息),而不是真实数据,因此容量比较小
expdp方式:
create directory dir_dump as '/home/oracle';
grant read,write on directory dir_dump to public;
expdp system/oracle directory=dir_dump dumpfile=test.dmp transport_tablespaces=test transport_full_check=y
transport_full_check=y 是完全(严格)自包含表空间集检测
transport_tablspace 是非严格自包含表空间检测
[oracle@dba ~]$ expdp system/oracle directory=dir_dump dumpfile=test.dmp transport_tablespaces=test transport_full_check=y
Export: Release 10.2.0.1.0 - Production on Wednesday, 14 May, 2014 21:17:43
Copyright (c) 2003, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/******** directory=dir_dump dumpfile=test.dmp transport_tablespaces=test 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_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
/home/oracle/test.dmp
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at 21:18:02
5) 转换数据文件以匹配 Endian 格式 ( 若一致可跳过)
如果源端和目标端的Endian格式不一致,那么就需要下面的操作,这里平台字节序是一致的不需要转换,如需转换则可以使用如下命令
$ rman target /
RMAN> convert tablespace trans to platform 'Microsoft Windows IA (32-bit)' format '/tmp/%N_%f';
导出来的文件名为 /tmp/test_5
6) 拷贝文件到目标系统
大概意思是
把 /u01/oracle/oradata/ora10g/test01.dbf, /home/oracle/ test.dmp 文件拷贝到 window D:\app\Administrator\oradata\ora11g\
使用 imp导入实用程序导入元数据
如果Endian格式不一致 ,将第4步/tmp/test_5 文件进行恢复,
convert datafile '/u01/oracle/oradata/ora10g/TRANS_5'
2> db_file_name_convert
3> '/u01/oracle/oradata/ora10g/TRANS_5','/u01/oracle/oradata/ora10g/test01.dbf ';
Imp方式:
convert datafile 'D:\oradata\EYGLE\DATAFILE\TRANS_5'
2> db_file_name_convert
3> 'D:\oradata\EYGLE\DATAFILE\TRANS_5','D:\oradata\EYGLE\DATAFILE\TRANS01.DBF';
使用imp导入方式 默认以追加方式插入表空间元数据+数据文件
imp userid=\'/ as sysdba\' file=/home/oracle/exp_tsport.dmp fromuser=tsport touser=tsport transport_tablespace=y tablespaces=tsport datafiles=/u01/app/oracle/oradata/LEO2/tsport01.dbf
impdp方式:
create directory dir_dump as 'D:\app\Administrator\oradata\ora11g\';
grant read,write on directory dir_dump to public;
impdp system/oracle directory=DIR_DUMP dumpfile=test.dmp transport_datafiles='D:\APP\ADMINISTRATOR\ORADATA\ORA11G\TEST01.DBF
C:\Users\Administrator>impdp system/oracle directory=DIR_DUMP dumpfile=test.dmp transport_datafiles='D:\APP\ADMINISTRATOR\ORADATA\ORA11G\TEST01.DBF'
Import: Release 11.2.0.1.0 - Production on Mon May 19 20:30:10 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
UDI-28002: operation generated ORACLE error 28002
ORA-28002: the password will expire within 2 days
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, 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/******** directory=DIR_DUMP dumpfile=test.dmp transport_datafiles='D:\APP\ADMINISTRATOR\ORADATA\ORA11G\TEST01.DBF'
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
ORA-39123: Data Pump transportable tablespace job aborted
ORA-29345: cannot plug a tablespace into a database using an incompatible character set
Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" stopped due to fatal error at 20:30:12
源端:
SQL> select * FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET%';
PARAMETER VALUE
------------------------- ----------------------------------------------------------------
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
目标端:
SQL> select * FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET%';
PARAMETER VALUE
---------------------------------------------------------------- -----------
NLS_CHARACTERSET ZHS16GBK
NLS_NCHAR_CHARACTERSET AL16UTF16
导入成功后
select tablspace_name,status from dba_tablespace;
alter tablespace test read write;
解决办法:修改目标数据库的字符集
由于源和目标数据库的字符集不一致或者不是子集的关系,所以造成的不能导入表空间字符集
通过
修改字符集 http://www.xifenfei.com/2237.html
安装csscan相关数据字典
SQL> @?/rdbms/admin/csminst.sql
csscan userid="'"sys/oracle as sysdba"'" full=y fromchar=ZHS16GBK tochar=AL32UTF8 log=/tmp/check.log capture=y array=1000000 process=4
通过查看/tmp/check.log.txt 因为检测结果没有Truncation(截断数据)
/Lossy
(丢失数据)都不存在记录,所以不用查看错误日志,
如果发现不为0,需要检查err日志,然后先处理丢这些记录,然后再转换
startup mount
alter system enable restricted session;
alter system set job_queue_processes=0 scope=memory;
alter system set aq_tm_processes=0 scope=memory;
alter database open;
alter database character set internal_use ZHS16GBK;
shutdown immediate;
startup;
select value$ from props$ where name='NLS_CHARACTERSET';
SQL> select * FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET%'
2 ;
PARAMETER VALUE
------------------------- ----------------------------------------------------------------
NLS_CHARACTERSET ZHS16GBK
NLS_NCHAR_CHARACTERSET AL16UTF16
字符集转换后,目标端和源端的字符集一样
[oracle@dba ~]$ expdp system/oracle directory=dir_dump dumpfile=test.dmp transport_tablespaces=test transport_full_check=y
C:\Users\Administrator>impdp system/oracle directory=DIR_DUMP dumpfile=test.dmp transport_datafiles='D:\APP\ADMINISTRATOR\ORADATA\ORA11G\TEST01.DBF'
Import: Release 11.2.0.1.0 - Production on Tue May 20 08:18:48 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
UDI-28002: operation generated ORACLE error 28002
ORA-28002: the password will expire within 1 days
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, 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/******** directory=DIR_DUMP dumpfile=test.dmp transport_datafiles='D:\APP\ADMINISTRATOR\ORADATA\ORA11G\TEST01.DBF'
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
Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at 08:18:56
目标端:
SQL> select name,enabled from v$datafile;
NAME ENABLED
-------------------------------------------------- ----------
D:\APP\ADMINISTRATOR\ORADATA\ORA11G\SYSTEM01.DBF READ WRITE
D:\APP\ADMINISTRATOR\ORADATA\ORA11G\SYSAUX01.DBF READ WRITE
D:\APP\ADMINISTRATOR\ORADATA\ORA11G\UNDOTBS01.DBF READ WRITE
D:\APP\ADMINISTRATOR\ORADATA\ORA11G\USERS01.DBF READ WRITE
D:\APP\ADMINISTRATOR\ORADATA\ORA11G\COMPRESS01.DBF READ WRITE
D:\APP\ADMINISTRATOR\ORADATA\ORA11G\COMPRESS02.DBF READ WRITE
D:\APP\ADMINISTRATOR\ORADATA\ORA11G\TEST01.DBF READ ONLY
已选择7行。
SQL> alter tablespace test read write;
Tablespace altered.
总结:
注意:
1源端和目标的的字符集必须一致或者是子集和超级的关系
2、在导入前目标全的用户必须存在
3、到出前必须将传输的表空间设置为read only
4、需要以sysdba权限来完成迁移工作
5 源端和目标端block 大小要一致
6 TTS 要求source 和 Target 数据库版本一致,否则就出出现Time zone 的问题,导致impdp 无法成功进行。
报错如下:
Oracle TTS ORA-39322: Cannot use transportable tablespace with different timezone version 说明
javascript:void(0)
7表空间需要“自包含”,不符合“自包含”的情况如下
(1)【索引】表空间里的表上存在索引,但是这个索引的基表在另外一个表空间上(后面的实验将会演示违反这种约束的情况);
(2)【LOB】 表空间里存在lob列,但是表上的LOB字段存储在其他表空间上;
(3)【约束】表空间中的表上有约束,但是其他的约束在另外的表空间上;
(4)【分区表】表空间上存在一些分区,但是其他的其他的分区在另外的表空间上;
小结:
(1)源和目标数据库的COMPATIBLE初始化参数必须>=8.1,且必须是企业版
(2)如果被传输的表空间的block size和目标库的标准块size不一样,那么目标库的COMPATIBLE必须>=9.0
(3)从Oracle 8i开始,TTS就可以向后跨版本(比如8i-->9i)
(4)从Oracle 10g开始,TTS可以跨平台,如果源和目标的平台字节序(endianness)相同就不需要额外的步骤,否则还需要进行字节序转换
(5)源和目标数据库必须具有相同的character set andnational character set.
(6)TTS支持RAW device file system.
(7)10g前如果目标库存在同名的表空间,则不能TTS,从10g(COMPATIBLE>=10.0.0)开始,借助tablespace rename特性可以解决这一问题
(8)TTS不能处理system表空间及system表空间里的Objects
(9)自包含检查
SQL> EXEC sys.DBMS_TTS.TRANSPORT_SET_CHECK('data, indx',TRUE);
SQL> SELECT * from sys.transport_set_violations;
(10)cannot transport objects owned bythe user SYS.
SQL> SELECT segment_type, owner||'.'||segment_name"OWNER.SEGMENT_NAME",partition_name
FROM dba_segments
WHERE owner = 'SYS' AND tablespace_name IN ('DATA', 'INDX')
ORDER BY owner, segment_type, segment_name;
(11)Database entities
在Oracle 10g版本前,TTS不支持
– Materialized views/replication
– Function-based indexes
– Scoped REFs
– 8.0-compatible advanced queues with multiple recipients
(12)source 和 target 的time zone version 要一致,否则在import时会报ORA-39322 的错误。
http://czmmiao.iteye.com/blog/1260792
http://www.eygle.com/rss/20070806.html