大批量数据导出导入的一些经验总结

时间:2021-04-09 14:54:59

      在2月份,主要做了几次大批量数据的导出导入,总结了一些经验教训,这里记录一下。


1.  一定要确定要求。

     有些导数要求所有导出的数据最后都在同一个时间点,这个时候,如果主库有dataguard, 我们可以先让dataguard停止应用归档,然后从dataguard进行导出; 如果没有,我们可以先将数据rman恢复到一个中间应急环境,然后将应急环境启动到read only状态,然后从这个应急环境进行导出。 也许我们还有其他的想法,如ogg,dsg等第三方工具,这些工具总会有一些时间差,导出的数据最后在同一个时间点这个不容易做到;而且,这些工具配置也比较麻烦,而且收费。


2.  确定好批次和目标库的表空间大小

     由于数据量比较大,想一下子搞定是不可能的,我们必须在主库查询出各个表的大小,然后分批次导出,尽量每个批次的大小一致。

     有的时候,目标库中已经存在相应的表,我们要将原库中的表中数据导入到目标库已经存在的表中,这时候,我们要根据原库中表和其索引的大小相对性的扩目标库中已经存在表和索引的表空间,这个一般是根据最大的几个大表。 注意,不要随意改变目标库中表和索引所在的表空间,要先根据原表进行扩表空间操作,不然会引起投诉的。


3.  确定数据导出导入方案

    由于表数目众多,根据在原库查询出来的各个表的大小,我们要做针对性的处理。

    小表部分: 一般4g以下的可以叫做小表,可以直接进行insert + dblink, 这样比较快,3g、4g左右的表insert时间也有点长,但还在可接受范围内。

    大表部分: 对于4g以上的表,我们要使用expdp +  network_link 进行导出到目标端,这样可以省去原库一大部分空间,导出导入的时候只导数据,导完之后再进行索引的创建。下面是一个例子; 这样只导入表数据的话,180g的表数据导入正常情况下需要1个小时左右,如果存储性能不大好,可能要时间长一些。

     在导出导入的时候,如果目标库和原库相对应的表名不同,要将目标库的表名和原库的表名保持一致,改一下表名;如果两边的表结构不一致,要将目标库的表结构修改,与老库保持一致。

-----  应急环境:
grant select any dictionary to dbadm;
grant exp_full_database to dbadm;
grant select any table to dbadm;


---目标库

drop public database link datamv;
create public database link datamv connect to dbadm identified by "xxxxx" using 'reinyj';


create or replace directory dumpdir as '/reindb_tmp/reindb';
grant read,write on directory dumpdir to public;


---  expdp.pingshi.pici23.sh
export ORACLE_SID=reindb
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
expdp \"/ as sysdba \" directory=dumpdir dumpfile=pingshi_pici2_%U.dump logfile=expdp_pingshi_pici2.log tables=rein.IDSALL_PREREC,rein.IDSINC_PREREC  network_link=datamv exclude=index,grant parallel=5


expdp \"/ as sysdba \" directory=dumpdir dumpfile=pingshi_pici3_%U.dump logfile=expdp_pingshi_pici3.log tables=rein.IDSALL_APP_POS,rein.IDSALL_CHKAMOUNT,rein.IDSALL_MONEYSCH  network_link=datamv exclude=index,grant parallel=5

   ------使用network_link 选项,dump直接导出到目的端,不落地导出,这样对源端没有什么空间要求。这样的导出在目的端执行,对undo要求不高。


nohup sh  impdp.pingshi.pici2.sh  > impdp.pingshi.pici2.log  &
---  impdp.pingshi.pici2.sh


export ORACLE_SID=reindb
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
impdp \"/ as sysdba \" directory=dumpdir dumpfile=pingshi_pici2_%U.dump logfile=impdp_pingshi_pici2.log tables=rein.IDSALL_PREREC,rein.IDSINC_PREREC  parallel=5  REMAP_SCHEMA=rein:rein  remap_tablespace=IDS_DATA:REIN_IDSALL,IDS_INDEX:REIN_IDSALL,REIN_DATA1:REIN_IDSALL TABLE_EXISTS_ACTION=append


4.  创建相关索引

    在表中数据到导入完成之后,我们进行索引的创建,注意使用并行,加快索引创建速度。


5.  修改目标库中的表名和表结构,保持最初的样子。 最后,表中一些字段有默认值,要进行添加补充。


6.  收集相关表的统计信息,这一点一定不能忘记。