上文介绍了在不同平台(字节顺序不同)数据库之间传输表空间时,采用在源库平台执行convert tablespace来转换字节顺序的方式,本文介绍另一种方法:在目标库平台上通过convert datafile方式实现转换。
1、概述
需要将一台linux主机上10g数据库表空间ts_bill迁移到另一台solaris主机数据库中,为加快速度,准备采用传输表空间方式。
1、平台环境
1) 源库:
版本:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
平台:
SQL> select t.platform_name,t.endian_format from v$transportable_platform. t,v$database d
where t.platform_name=d.platform_name;
PLATFORM_NAME ENDIAN_FORMAT
------------------------- --------------
Linux IA (32-bit) Little
2) 目标库
版本:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0
平台:
SQL> select t.platform_name,t.endian_format from v$transportable_platform. t,v$database d
where t.platform_name=d.platform_name;
PLATFORM_NAME ENDIAN_FORMAT
------------------------- --------------
Solaris[tm] OE (64-bit) Big
结论:两台数据库平台endian(字节顺序)不一样,传输表空间方式,需要做转换。
2、源库上做数据导出
1) 检查表空间自包含情况
如要传输的表空间存在以下情况,将不能进行传输:
a、表的索引在传输表空间上,而表在其他表空间上;
b、表在传输表空间上,而其LOB列在其他表空间;
c、分区表一些分区在传输表空间,另一些在其他表空间;
可以通过dbms_tts包来检查传输表空间上,是否存在违反规则的情况:
检查规则:
sql> exec dbms_tts.transport_check_set('TS_BILL',true);
查看结果:
sql> select * from transport_set_violations;
根据结果进行对象的删除或调整。
2) 通过数据泵导出传输表空间元数据
注:传输表空间的原则是只从数据库导出表空间元数据,然后将元数据导出文件和表空间数据文件传输到目标数据库上进行导入。
设置表空间只读:
sql> alter tablespace ts_bill read only;
导出元数据:
expdp \'/ as sysdba\' directory=dir dumpfile=ts_bill.dmp transport_tablespaces=ts_bill
3、目标库上导入数据
1) 文件传输
将源库平台上生成的表空间元数据导出文件ts_bill.dmp和表空间数据文件ts_bill.dbf复制到目标库平台。
2) 转换字节顺序
由于目标库上该表空间还未创建,所以不能使用convert tabespace,可以利用rman用如下方式转换数据文件字节顺序:
命令格式:
rman> convert datafile '传输来的数据文件' to platform. '目标库平台型号' from platform. '源库平台型号'
db_file_name_convert='源库表空间数据文件目录','目标库表空间数据文件目录';
执行转换:
rman > convert datafile 'ts_bill.dbf' to platform='Solaris[tm] OE (64-bit)' from platform='Linux IA (32-bit)'
db_file_name_convert='/u01/app/oracle/oradata','/opt/app/oracle/oradata';
如转换后产生的文件为ts_bill_1.dbf
3) 导入数据
通过数据泵以transport_datafiles方式,将传输表空间导入目标数据库。
$ impdp \' / as sysdba\' directory=dir dumpfile=ts_bill.dmp transport_datafiles=ts_bill_1.dbf
表空间成功导入。
4) 表空间置为读写
表空间导入后仍为只读状态,置为读写。
sql> alter tablespace ts_bill read write
至此,整个传输表空间工作完成。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25438353/viewspace-688274/ ,如需转载,请注明出处,否则将追究法律责任。