今天又一同事让我帮忙说现在服务器的主板换了,说想把oracle的数据迁移到别人服务器上,让我帮忙,使用imp/exp或者是impdp/expdp这种效率有点低,所以研究下传输表空间做数据的迁移,先将研究过程记录如下:
一、实现原理:
1、使用export或者是Pump export数据泵将需要操作的表空间中的对象的元数据导出(Metadata);
2、将表空间对应的数据文件和刚刚导出的文件复制到目标服务器上;
3、再将表空间的对象元数据imp/impdp导入到目标数据库上;
注:我自己觉得,没查找资料,元数据应该是类似对象的一些定义,那么我们做数据迁移,不关要做数据对象的迁移,还有数据,那么数据是存放到数据文件中的,定义是存放在system下的,所以,我们导出元数据是导出数据对象,导出数据是复制数据文件,因为元数据只还有对象的定义,所以应该很小,所以导出很快,这样tts的速度上可以提升不少;
二、使用条件:
1、跨系统的要求;
从oracle10g版本以后,传输表空间可以跨系统,可以同过v$transportable_platform视图查询,例如:
其中endian_format是自己顺序,及处理和存储的顺序,要想传输表空间,要两个系统的endian_format相同,否则要转化endian_format;
2、在传输表空间前,要被传输的表空间必须处于read only的状态,如果是生产库可以使用RMAN,这里不研究;alter tabespace *** read only;
3、源库和目标库的本地字符集和国家字符集必须相同;
4、被传输的表空间如果还有XMLTypes,在导出元数据的时候必须使用exp,不能使用expdp,且constraints和triggers参数必须设置成Y;
可以使用
select distinct p.tablespace_name from dba_tablespaces p,dba_xml_tables x,dba_users u,
all_all_tables t where t.table_name=x.table_name and
t.tablespace_name=p.tablespace_name and x.owner=u.username;查询哪些表空间中还有XMLTypes
5、不能传输system和sys拥有的默认表空间;
6、表空间为自包含表空间;
三、实战操作:
1、确定平台是否支持,及endian format,我们可以使用
select d.name,i.version,d.platform_name,endian_format from
v$transportable_platform tp,v$database d,v$instance i
where tp.platform_name=d.platform_name and d.name=upper(i.instance_name);
--怎么转化字节顺序
2、选择自包含表空间集
如何判断表空间是否是自包含的呢,我们可以使用DBMS_TTS包来验证,使用DBMS_TTS必须拥有execute_catalog_role或者是DBA的权限;
表空间的自包含有两种检验方式:
1、非严格方式:检查待传输表空间中对象,是否引用了其他未被传输的表空间中的对象;
2、严格方式:在非严格的基础上,还要检查是否被其他未传输的表空间的对象引用,
使用DBMS_TTS的默认情况下是非严格方式, 执行完之后可以使用transport_set_violations视图查看是否有引用的对象,例如:
SQL> exec dbms_tts.transport_set_check('oacms_space',true);
PL/SQL 过程已成功完成。
SQL> select * from transport_set_violations;
未选定行
3、生成可传输表空间
1、将表空间至于read only状态下:alter tablespace oacms_space read only;
2、导出表空间元数据,可以使用exp/expdp 根据本人习惯使用exp
这里不详细些了 因为本人的测试服务器连接不上了,注意,一定要用sys/system身份;
3、将表空间的数据文件传输到目标数据库中,将导出的dmp文件也传输到目标文件中,使用imp把元数据导入到目标数据库,成了,完成;
写到最后细节不愿意写了,哪天在做的时候截图出来,见谅!