Oracle 表空间传输

oracle 表空间传输

转:http://blog.itpub.net/29515435/viewspace-1123714/
并整理修改部分错误

一、传输表空间概述
首先来认识一下什么是传输表空间,传输表空间技术始于oracle9i,不论是数据字典管理的表空间还是本地管理的表空间,都可以使用传输表空间技术;传输表空间不需要在源数据库和目标数据库之间具有同样的DB_BLOCK_SIZE块大小;使用传输表空间迁移数据比使用数据导入导出工具迁移数据的速度要快,这是因为传输表空间只是复制包含实际数据的数据文件到目标数据库的指定位置,而使用数据导入导出工具则是传输表空间对象的元数据到目标数据库。

二、传输表空间的方法
1、使用SQL*PLUS,RMAN,Data Pump工具实现手动的传输表空间。
2、使用EM工具中的传输表空间向导实现传输表空间。

三、跨平台传输表空间
从oracle 10g开始,oracle实现了跨平台的表空间传输,跨平台的意味着数据库可以从一种类型的平台迁移到另一中类型的平台上,大多数(但不是全部)的平台都支持传输表空间。首先必须通过查看v$transportable_platform视图查看oracle支持的平台,并确定每种平台的字节存储次序,注意:这一点非常重要。以下查询为oracle支持的各种平台及字节存储次序(版本为10.2.0.4),在跨平台表空间传输时,需要通过查询该视图进行平台和字节存储次序的比对。
SQL> select * from v$transportable_platform s order by s.ENDIAN_FORMAT;
 
PLATFORM_ID PLATFORM_NAME                        ENDIAN_FORMAT
----------- ------------------------------------ --------------
          6 AIX-Based Systems (64-bit)              Big
         18 IBM Power Based Linux                   Big
          2 Solaris[tm] OE (64-bit)                 Big
          4 HP-UX IA (64-bit)                       Big
         16 Apple Mac OS                            Big
          1 Solaris[tm] OE (32-bit)                 Big
          9 IBM zSeries Based Linux                 Big
          3 HP-UX (64-bit)                          Big
         17 Solaris Operating System (x86)          Little
         20 Solaris Operating System (x86-64)       Little
         12 Microsoft Windows x86 64-bit            Little
         13 Linux x86 64-bit                        Little
          8 Microsoft Windows IA (64-bit)           Little
         19 HP IA Open VMS                          Little
         11 Linux IA (64-bit)                       Little
          5 HP Tru64 UNIX                           Little
         10 Linux IA (32-bit)                       Little
          7 Microsoft Windows IA (32-bit)           Little
         15 HP Open VMS                             Little
 
19 rows selected


四、两个数据库之间进行传输表空间的过程
1、如果是跨平台的表空间传输,需要检查两个平台支持的字节存储顺序,检查方法见如上文所述,如果可以确定源数据库和目标数据库属于同一平台,可以省略此步骤;
2、选择自包含的(self-contained)表空间,这里的限制相对于使用数据泵来说比较变态,实验中将会有一些粗略的介绍。
3、将源数据库上的选定表空间修改为read-only状态,使用expde工具生成传输表空间(集)。      //在这一步,如果两个平台间的字节存储次序不同,还需完成字节存储次序的转换
4、传输表空间及与表空间对应数据文件 (使用操作系统命令、ftp命令等方式)到目标数据库。    //字节存储次序的转换也可以在这一步完成
5、将源数据库的表空间恢复为read-write状态(可选)
6、在目标数据库,使用impdp工具导入表空间(集)

五、本次实验记录
选择了两个Linux平台数据库(10.2.0.4和11.2.0.1)之间的表空间传输。


1、实验前准备。创建测试用表空间、用户、表、插入两条数据(用于最后验证表传输成功,数据都可以正常访问)
create tablespace test datafile '/u01/app/oracle/oradata/stdb/test01.dbf' size 10m;                                                  --------------创建测试用表空间,表空间名为test

create user tester identified by tester default tablespace test account unlock;                      //创建测试用户,用户名为tester,默认表空间为test
grant connect,resource to tester;

conn tester/tester;
create table t1 (id number,name varchar(10),sex char(1),age int,class varchar(3));              //创建测试验证用表,表名为t1

insert into t1 values (2001,'alex','M',18,'10');
insert into t1 values (2002,'bob','M',18,'20');


 select * from t1;
        ID NAME       S        AGE CLA
---------- ---------- - ---------- ---
      2001 alex       M         18 10
      2002 bob        M         18 20
SQL> commit;
Commit complete.

2、表空间自包含(独立性)检查
根据文件介绍,传输表空间由诸多限制,如下:
An index inside the set of tablespaces is for a table outside of the set of tablespaces.
A partitioned table is partially contained in the set of tablespaces.
A referential integrity constraint points to a table across a set boundary.
A table inside the set of tablespaces contains a LOB column that points to LOBs outside the set of tablespaces.
等等。

conn /as sysdba
execute dbms_tts.transport_set_check('test',true);
select * from transport_set_violations;
//查询无返回结果说明检查通过,否则需要根据violation字段的说明解决各类参照完整性问题,比如说主键、外键约束、分区等问题

3、在源数据库将表空间设为只读状态
alter tablespace test read only;

4、使用expdp工具生成表空间(集)Transportable Tablespace Set
    Transportable Tablespace Set有两部分:
        1.expdp 导出的表空间的metadata
        2.还有就是表空间对应的数据文件


创建备份目录
mkdir -p /data/dump
create directory dump_dir as '/data/dump';
expdp system/oracle dumpfile=expdat.dmp directory=dump_dir transport_tablespaces=test logfile=export.log transport_full_check=y


5、使用ftp或scp工具分别拷贝表空间(集)和与表空间对应数据文件到相应的目录。
   将Transportable Tablespace set 传送到Target端
    1)将表空间test 对应的数据文件copy到Target 对应的ORADATA目录下。
    2)将expdp 导出的表空间metadta 数据copy 到Target 端的backup 目录下


在目标端创建备份目录
mkdir -p /data/dump
create directory dump_dir as '/data/dump';

查看源端和目标端的数据文件位置;
select * from dba_data_files f;

 scp -r /data/dump/exp* 10.98.156.149:/data/dump
 scp /data/oradata/oral/data01.dbf 10.98.156.149:/oracle/app/oradata/oral/


6、将源数据库表空间设为read-write状态。
将数据文件传到目标库后才能将源库表空间启动为读写状态,否则在目标库导入时报版本错误。
alter tablespace test read write;

7、在目标数据库使用impdp工具将表空间(集)导入目标数据库,根据需要决定是否需要创建与源数据库相同的用户,或者在使用impdp是可以使用remap_schema参数。

创建同名用户。
create user tester identified by tester;         
--创建测试用户,用户名为tester,
grant connect,resource to tester;

impdp system/oracle dumpfile=expdat.dmp directory=dump_dir transport_datafiles=/oracle/app/oradata/oral/data01.dbf logfile=import.log


导入到不同名用户下
impdp directory=backup dumpfile=test01.dmp transport_datafiles=/u01/app/oracle/oradata/normal/test01.dbf remap_schema=source_test:target_test logfile


8、验证结果
select ts#,name from v$tablespace;
conn tester/tester;
select * from t1;
        ID NAME       S        AGE CLA
---------- ---------- - ---------- ---
      2001 alex       M         18 10
      2002 bob        M         18 20

insert into t1 values (2003,'bob','M',18,'20');


六、附录
由于没能进行字节存储次序转换测试,特地从文档上拷贝两个示例,待有条件时再进行测试。
示例一:在源数据库端完成字节存储次序转换

RMAN> CONVERT TABLESPACE sales_1,sales_2
2> TO PLATFORM 'Microsoft Windows IA (32-bit)'
3> FORMAT '/tmp/%U';

Starting conversion at source at 30-SEP-08
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile conversion
input datafile file number=00007 name=/u01/app/oracle/oradata/salesdb/sales_101.dbf converted datafile=/tmp/data_D-SALESDB_I-1192614013_TS-SALES_1_FNO-7_03jru08s channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:45
channel ORA_DISK_1: starting datafile conversion
input datafile file number=00008 name=/u01/app/oracle/oradata/salesdb/sales_201.dbf converted datafile=/tmp/data_D-SALESDB_I-1192614013_TS-SALES_2_FNO-8_04jru0aa channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:25
Finished conversion at source at 30-SEP-08

示例二:在目标数据库端完成字节存储次序转换

C:\>RMAN TARGET /
Recovery Manager: Release 11.2.0.0.1
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
connected to target database: ORAWIN (DBID=3462152886)

RMAN> CONVERT DATAFILE
2>'C:\Temp\sales_101.dbf',
3>'C:\Temp\sales_201.dbf'
4>TO PLATFORM="Microsoft Windows IA (32-bit)"
5>FROM PLATFORM="Solaris[tm] OE (32-bit)"
6>DB_FILE_NAME_CONVERT=
7>'C:\Temp\', 'C:\app\orauser\oradata\orawin\'
8> PARALLELISM=4;
请使用浏览器的分享功能分享到微信等