设为首页 加入收藏

TOP

传输表空间技术及字节序对跨平台迁移的影响(一)
2014-11-24 00:40:46 来源: 作者: 【 】 浏览:32
Tags:传输 空间 技术 字节 跨平台 迁移 影响
传输表空间技术是数据迁移中非常重要的技术之一。它的作用是将一组自包含(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.
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇修改fileheader(测) 下一篇【翻译自mos文章】注意:ASMBproc..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: