传输表空间技术是数据迁移中非常重要的技术之一。它的作用是将一组自包含(Self-Contained),只读的表空间只导出元数据,然后在操作系统层面将表空间的数据文件直接复制到目标平台,再将元数据导入数据字典,即完迁移。 可以用来快速迁移表空间,也可以用来迁移整个库。
Oracle用exp/imp或expdp/impdp来支持这个技术。
整理了三种情况:
一。 非跨平台的正常迁移流程。
二。不同字节序跨平台的表空间传输
三。相同字节序跨平台的表空间传输(有附上我自己写的更新数据文件头的c程序)
一。 首先来看非跨平台的正常迁移流程。
1. 自包含检查
connect / sysdba
-- 非严格自包含检查,如对一些表索引不在同一表空间的也能通过检查
exec dbms_tts.transport_set_check('DEMO_DATA',TRUE);
-- 严格自包含检查
exec dbms_tts.transport_set_check('DEMO_DATA',TRUE,TRUE);
--显示检查结果
SELECT * FROM transport_set_check('DEMO_DATA',TRUE);
--如果检查没通过也没关系,Oracle可以多个表空间同时传输。
exec dbms_tts.transport_set_check('DEMO_DATA,DEMO_IDX',TRUE,TRUE);
2. 传输步骤
2.1 将表空间设为只读
alter tablespace users read only;
2.2 导出表空间
exp '/ as sysdba' tablepacespaces=demo_data transport_tablespace=y file=exp_users.dmp;
2.3 将表空间对应的数据文件转移到目标服务器上。
2.4 导入表空间
imp '/ as sysdba' tablespaces=demo_data transport_tablespace=y file=exp_demo.dmp datafiles='demo_data.dbf' ;
至此,这个表空间就被包含在了新建的数据库中。
二。不同字节序跨平台的表空间传输
由于不同平台的字节序不同,导入数据文件时,不同的字节序会导致数据不能被正确的读取。在做网络编程时,
需要将传输数据转为网络字节序,再在接收端转回来本地字节序。 而 Oracle的数据文件在跨平台进行表空间传输时,同样也需要处理这个麻烦。
Oracle目前支持一些跨平台的转换,能将文件格式转为目标服务器的字节序格式。
可在下面SQL中查到支持哪些平台转换:
col PLATFORM_NAME for a40
SELECT * FROM v$transportable_platform; 在
数据库中查出当前或目标数据库当前的字节序信息:
col PLATFORM_NAME for a40
SELECT d.platform_name,endian_format
FROM v$transportable_platform tp,v$database d
WHERE tp.platform_name =d.platform_name;
做个测试:
将
Oracle11gR2的一个表空间从Solaris(64bit)上转到Windows(64bit)上.
Solaris 为大端方式(Big Endian)
Windows 为小端方式(Little Endian)
源平台导出部份:
1. 建立一个表空间
create tablespace tbs_trans datafile '/u01/app/oracle/oradata/xcldb/tbs_trans_01.dbf' size 1m;
create user usr_trans identified by 111111 default tablespace tbs_trans;
grant connect,resource to usr_trans;
connect usr_trans/111111;
create table tb_trans as select rownum as seq from dual connect by rownum <= 10 ;
select count(*) from tb_trans;
disconnect;
connect / as sysdba
alter tablespace tbs_trans read only;
exit; 2. 导出表空间
exp \'/ as sysdba\' tablespaces=tbs_trans transport_tablespace=y file=/u01/app/exp_tbs_trans.dmp
3. 通过RMAN将表空间数据文件转换出一个目标平台字节序相同格式的文件出来
rman target / nocatalog
convert tablespace TBS_TRANS to platform 'Microsoft Windows x86 64-bit' format '/u01/app/%N_%f';
exit;
ls -lt /u01/app/TBS_TRANS* 4. 将导出的dmp文件(exp_tbs_trans.dmp)与转换后的数据文件(TBS_TRANS_5)都复制到目标平台上。
目标平台导入部份
5. 把传过来的,之前转换过的数据文件名字变得规范点
set oracle_sid=xcldb
rman target / nocatalog
report schema;
convert datafile 'c:\tmp\TBS_TRANS_5' db_file_name_convert 'c:\tmp\TBS_TRANS_5','C:\ORACLE\ORADATA\XCLDB\TBS_TRANS_01.DBF';
6. 创建相关用户
create user usr_trans identified by 111111 ;
grant connect,resource to usr_trans; 7.导入
imp '/ as sysdba' tablespaces=tbs_trans transport_tablespace=y file=c:\tmp\exp_tbs_trans.dmp datafiles=C:\ORACLE\ORADATA\XCLDB\TBS_TRANS_01.DBF
8.检查
select name from v$datafile where name like '%TBS%' ;
9. 此时两边tbs_trans表空间都为ReadOnly状态,记得将源平台与目标平台tbs_trans的表空间变更为可读写状态
select tablespace_name,status from dba_tablespaces;
alter tablespace tbs_trans read write ;
三。相同字节序跨平台的表空间传输
上面是不同字节序的需要convert tablespace来转换格式,而如果是相同字节序的,是否能直接导出元数据后,再将数据文件复制过去就行了呢。
比如: Windows与
Linux都是小端方式 。
Oracle10g以后,直接复制过去确实是可行的。整库复制过去都可以。
10g以前的版本就要更改下数据文件头,让两边标识一样。否则imp时会识别不了。
处理方法:
1. 把数据文件头与文件内容分开。
2. 把数据文件复制过去,把A平台的数据文件头给抹了,把B平台的数据文件头给取出。
3.