ORACLE迁移索引并行未生效处理方式
案例是 本地服务器 oracle12c->19c实施过程中遇到的问题及解决方法如下:
为提高oracle数据导入效率,尽可能减少数据迁移时间,现总结如下:
使用网络泵进行数据库迁移命令:
impdp system/******** directory=LOG_DIR parallel=8 network_link=sourcedb schemas=CCFMP transform=disable_archive_logging:y logtime=all logfile=LOG_DIR:impdp_bdi20201211.log exclude=statistic
虽然impdp设置了并行参数parallel=8,但是在迁移索引时是不使用并行的,parallel并行参数不起作用,查看数据泵日志,impdp已迁移索引数据*00G,耗时*小时,每小时迁移索引数据量*G左右,为提升索引创建效率,采用如下方式手工生成索引创建脚本,同时使用并行度参数,每小时迁移索引数据量**0G左右,较数据泵方式迁移效率提升2.6倍。
在源库上执行:
su - oracle
sqlplus / as sysdba
set pagesize 0
set long 900000
set feedback off
set echo off
set linesize 255
spool "/tmp/create_index.sql";
select dbms_metadata.get_ddl('INDEX',u.index_name,u.owner) ||'parallel'|| ';' from dba_indexes u where u.owner in ('CCFMP');
spool off;
注:CCFMP为待迁移的数据库schema用户,需要根据实际迁移情况修改。
将索引创建脚本ftp上传到目标数据库,执行索引创建脚本:
su - oracle
sqlplus / as sysdba
SQL>@create_index.sql
这样impdp语句在遇到已创建的索引时会提示索引已创建并跳过,从而提升迁移速度。
为避免开启索引并发度引起性能争用,索引数据迁移完成后,关闭并行度。
在源库上执行:
su - oracle
sqlplus / as sysdba
SQL>set pagesize 0
set long 900000
set feedback off
set echo off
set linesize 255
SQL>alter_index.sql
SQL>select ’alter index ’ || u.index_name || ' noparallel;' from dba_indexes u where u.owner in ('CCFMP');
SQL>spool off;
将索引修改脚本ftp上传到目标数据库,执行索引修改脚本:
su - oracle
sqlplus / as sysdba