表空间传输

来源:互联网 发布:关于网络信息收集 编辑:程序博客网 时间:2024/05/29 09:30
在实验前我们需要明白一些明白一些概念

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;
PLATFORM_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的话,就会违反自包含约束条件,表上的索引就会失效,传输不完整,解决方法:同时传输AB两个表空间。在此我们只传输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 '; 

使用expexpdptransport_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 大小要一致

TTS 要求source 和 Target 数据库版本一致,否则就出出现Time zone 的问题,导致impdp 无法成功进行。

  报错如下:

    Oracle TTS ORA-39322: Cannot use transportable tablespace with different timezone version 说明

  http://blog.csdn.net/tianlesoftware/article/details/7298547

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://blog.csdn.net/tianlesoftware/article/details/7267582

http://czmmiao.iteye.com/blog/1260792
http://www.eygle.com/rss/20070806.html
0 0
原创粉丝点击