Fork me on GitHub

oracle-expdp/impdp


TTS
表空间的迁移
如果某个表空间有多个用户,那么我们在迁移的时候如果按用户导出导入的话,那将是一个麻烦费事的活,这个时候我们可以通过transport_tablespace参数进行表空间迁移,达到一次性迁移整个表空间的目的。下面通过一个实验来讲解整个实施过程及相关注意事项。

源库上要做的
create tablespace tbs_1;
create user test11 identified by 123456 default tablespace tbs_1;
grant connect,resource to test11;
conn test11
create table aa (i number);
begin
  for i in 1..1000
    loop
    insert into aa values(i);
    end loop;
  commit;
end;
/
execute sys.dbms_tts.transport_set_check('tbs_1',true)
alter tablespace tbs_1 read only;
expdp system dumpfile=aa.dmp transport_tablespaces=tbs_1 logfile=aa.log
scp /u01/app/oracle/admin/my/dpdump/aa.dmp  192.168.3.202:/home/oracle/
scp /file/MY/datafile/o1_mf_tbs_1_drto8110_.dbf 192.168.3.202:/home/oracle/

目标库上要做的
mv aa.dmp /u01/app/oracle/admin/kyc/dpdump/
mv o1_mf_tbs_1_drto8110_.dbf /u01/app/oracle/oradata/KYC/datafile/
create user test11 identified by 123456;
grant connect,resource to test11;
impdp system dumpfile=aa.dmp transport_datafiles=/u01/app/oracle/oradata/KYC/datafile/o1_mf_tbs_1_drto8110_.dbf remap_schema=zy:zouy
conn test11
select * from v$tablespace;
select * from v$datafile;
alter user test default tablespace tbs_1;
alter tablespace tbs_1 read write;
select * from aa;

注意事项:
(1)、expdp需要使用system用户;
(2)、注意源库与目标库字符集完全一致,dbblock_size要一致,show parameter db_block_size
(3)、目标库用户需要事先创建,包含原库在该表空间下的所有用户;
(4)、如果该表空间只有一个用户,并且需要导入到其他用户下,impdp导入时需要使用remap_schema进行映射;
(5)、导出的dmp转储文件和ora数据文件均需要拷贝至目标库;
(6)、tablespace要进行read only和read write的状态修改;
(7)、导出导入的数据好像是没有包含过程、触发器、视图等对象,只有表数据;
(8)、导入完成之后,需要修改用户的默认表空间。


======================================


expdp/impdp在进行数据迁移时速度极快,通过一定的优化方法,我们让expdp和impdp跑得更加快

1、parallel,在很多oracle的程序中都离不开并行操作,通过利用多core cpu的处理能力,速度增加相当明显
show parameter cpu;查看cpu数,一般parallel 参数值等于CPU 的个数。而且要小于dump文件的个数


time expdp frank/frank directory=abc dumpfile=abc.dmp
time expdp frank/frank directory=abc dumpfile=abc.dmp parallel=4
time expdp frank/frank directory=abc dumpfile=abc%U.dmp parallel=4

那么expdp将为parallel 创建4个文件: ABC_01.DMP,ABC_02.DMP,ABC_03.DMP,ABC_04.DMP。
每个进程一个文件。这样的话,每个文件的大小会因进程而不同。可以某个文件很大,某个文件却很小。
要解决这个问题,就是设置filesize 参数。来指定每个文件的最大值。这样当一个文件达到最大值的之后,就会创建一个新的文件。
expdp frank/frank directory=abc dumpfile=abc%U.dmp parallel=4 filesize=1024M

2、transport_tablespace方法,直接复制表空间文件的方式
3、network_link模式,当数据文件比较大的时候,这时候在目标库上直接通过network_link模式在目标库上进行导入,而不需要在源库上进行expdp操作,处理方式和正常的expdp/impdmp过程类似。这样做的好处主要是可以避免了在源库上写大文件,然后还需要移动到目标库上.

grant datapump_exp_full_database to frank;
create database link frank connect to frank identified by frank using 'frank';
impdp \'/ as sysdba\' network_link=frank schemas=frank
4、对于index不会并行,对大表有索引的情况下,考虑索引以后单独使用parallel,nologging重建。事实上在expdp的导出过程中对索引不会像表数据那样需要导出,索引只导出了ddl语句.
5、exclude=table_statistics,index_statistics
6、利用强大的过滤功能,主要的选项有tables,include,exclude和query。tables定义只导出某些需要的表,include表示只导出某些对像,exclude表示排除某些对像.query可以对表中数据进行过滤,只导出我们需要的那部分数据.

 

posted on 2017-08-11 16:04  阳光-源泉  阅读(273)  评论(0编辑  收藏  举报

导航