当前位置: 首页 > 工具软件 > Mail2Bug > 使用案例 >

Oracle 12.1.0.2 expdp导出分区表数据bug慢的原因和解决方法

阴高刚
2023-12-01

 

 

Oracle 12.1.0.2 expdp导出分区表数据bug慢的原因和解决方法

 

简述:Oracle版本12.1.0.2在expdp时导出分区表数据慢,遇到Bug 20236523 : DATAPUMP EXPORT SLOW USING CONTENT=METADATA_ONLY。

解决方法:第1种:升级至12.2.0.1;第2种:exp代替expdp。本文我们主要讲第2种方法:exp代替expdp。

环境

os:redhat 7.3

db:12.1.0.2

 

1.原理通透

1.1 原理1

DATAPUMP EXPORT SLOW USING CONTENT=METADATA_ONLY慢的原因:

Oracle在有很多分区的对象中错误的使用了TABLE ACCESS BY INDEX ROWID

Rows (1st) Row Source Operation

---------- ---------------------------------------------------         1  FILT

         1   TABLE ACCESS BY INDEX ROWID EXPDP_FCT_FR_FUND_ACTUAL_TXN (cr=4487

me=286592 us)

e=103328 us

)(object id 4703807)

 

The tkprof show that the new index is used, but that it is not selective

enough for objects with many partitions.

bde bug screening complete.

#Bug 20236523 - Datapump export is slow using CONTENT=metadata_only(Doc ID 20236523.8)

1.2 原理2

exp direct=y 优化原理:

使用直接路径导出,数据直接从磁盘读取到导出session的PGA中,从而跳过了SQL命令处理层

#Parameter DIRECT: Conventional Path Export Versus Direct Path Export (Doc ID 155477.1)

 

2.解决办法两种

2.1 升级版本

#效果

db:12.1.0.2 expdp 04:26:22

db:12.2.0.1 expdp 01:37:16

 

2.2 同版本,exp代替expdp

#效果

expdp 04:26:22

exp   00:12:00

实现方法

expdp 04:26:22

expdp \'sys/bhlbmc32 AS SYSDBA\' directory=dump dumpfile=expdp_bhl_schemas_${date}_%U.dmp schemas=BMCDB1,BMCDB2 METRICS=Y TRACE=480300  parallel=12 cluster=no logfile=expdp_bhl_schemas_${date}.log

exp   00:12:00

exp userid=\"sys/bhlbmc32@bmcCO1 as sysdba\" owner=BMCDB1,BMCDB2  direct=y  recordlength=65535 buffer=1048576000 file=/oracle/app/oracle/dump/BMCDB1.20200411.dmp log=/oracle/app/oracle/dump/BMCDB1.20200411.log

 

##想明白为什么,可以继续读

3.场景重新

3.1 原因分析:expdp为什么那么慢呢?

expdp \'sys/bhlbmc32 AS SYSDBA\' directory=dump dumpfile=expdp_bhl_schemas_${date}_%U.dmp schemas=BMCDB1,BMCDB2 METRICS=Y TRACE=480300  parallel=12 cluster=no logfile=expdp_bhl_schemas_${date}.log

#expdp使用METRICS=Y参数查看每个object使用的时间,少于600秒也就是10分钟的省略。大家可以看到涉及table一些统计是很慢的,这是一个值得研究的问题。

Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT

     Completed 365130 OBJECT_GRANT objects in 7705 seconds

Processing object type SCHEMA_EXPORT/TABLE/COMMENT

     Completed 35606 COMMENT objects in 1098 seconds

Processing object type SCHEMA_EXPORT/PACKAGE/GRANT/OWNER_GRANT/OBJECT_GRANT

     Completed 25413 OBJECT_GRANT objects in 593 seconds

Processing object type SCHEMA_EXPORT/FUNCTION/GRANT/OWNER_GRANT/OBJECT_GRANT

     Completed 100435 OBJECT_GRANT objects in 2923 seconds

 

3.2 论据:官方MOS参考     

通过mos查询我们得知其中Bug 20236523 : DATAPUMP EXPORT SLOW USING CONTENT=METADATA_ONLY和我们的问题很相近

Bug 20236523 : DATAPUMP EXPORT SLOW USING CONTENT=METADATA_ONLY

MOS描述这个是一个错误的分区扫描引起的。

 

Rows (1st) Row Source Operation

---------- ---------------------------------------------------         1  FILT

         1   TABLE ACCESS BY INDEX ROWID EXPDP_FCT_FR_FUND_ACTUAL_TXN (cr=4487

me=286592 us)

e=103328 us

)(object id 4703807)

 

The tkprof show that the new index is used, but that it is not selective

enough for objects with many partitions.

bde bug screening complete.

#可想而知一个大型分区表如果没有选择性,直接走TABLE ACCESS BY INDEX ROWID是很可怕的。分区本应该有选择性的走分区,可现在确TABLE ACCESS BY INDEX ROWID(已索引单块读的方式,通过rowid去查询所需的数据),当数据量越大性能消耗越大。

 

3.3 论点:exp代替expdp绕过这个BUG。我们知道了BUG的原理,生产业务不能立刻升级。我们只能用我们手中的工具来绕过这个BUG。

怎么优化这个问题呢?expdp又不能hint执行计划。其实全表扫描也是比TABLE ACCESS BY INDEX ROWID快的。进而想到了exp  direct=y,这个不走SQL命令处理的方式。

#Direct path Export,直接导出模式,数据直接从磁盘读取到导出session的PGA中,从而跳过了SQL命令处理层

 

3.4 论证:生产库中确实有很多分区,符合MOS中BUG的描述。

反推如果数据库中真的有很多分区,所以才导致BUG出现?经查生产库中确实用了很多分区,所以导致Bug 20236523 : DATAPUMP EXPORT SLOW USING CONTENT=METADATA_ONLY的出现。

#统计分区表个数,这里只统计了业务用户

col OWNER for a40

select OWNER,count(*) from DBA_PART_TABLES  group by OWNER;

OWNER                                      COUNT(*)

---------------------------------------- ----------

BMCDB1                                         51

BMCDB3                                         64

#统计分区表分区个数,这里只统计了业务用户

col TABLE_OWNER for a40

select  TABLE_OWNER,count(*) from DBA_TAB_PARTITIONS  group by TABLE_OWNER;

TABLE_OWNER                                COUNT(*)

---------------------------------------- ----------

BMCDB1                                        881

BMCDB3                                       4048

 

3.5 论证:解决方案与效果

exp代替expdp,时间指标来看性能提升了22.5倍。也是当前各方人员都愿意接受的方式。

expdp  04:26:22

exp    00:12:00

实现方法记录

expdp 04:26:22

expdp \'sys/bhlbmc32 AS SYSDBA\' directory=dump dumpfile=expdp_bhl_schemas_${date}_%U.dmp schemas=BMCDB1,BMCDB2 METRICS=Y TRACE=480300  parallel=12 cluster=no logfile=expdp_bhl_schemas_${date}.log

exp 00:12:00

exp userid=\"sys/bhlbmc32@bmcCO1 as sysdba\" owner=BMCDB1,BMCDB2  direct=y  recordlength=65535 buffer=1048576000 file=/oracle/app/oracle/dump/BMCDB1.20200411.dmp log=/oracle/app/oracle/dump/BMCDB1.20200411.log

 

总结:

遇到Oracle BUG 也不要害怕。明白BUG不能处理的原理或者逻辑。我们来用我所学的知识来绕过这BUG也是可以达到解决问题的效果的。

本文解决的思路:用exp代替expdp。把sql命令处理方式绕过。其实类似于用TABLE ACCESS FULL来代替TABLE ACCESS BY INDEX ROWID解决思路。

 

 

########################################################################################

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!【QQ交流群:53993419】

QQ:14040928 E-mail:dbadoudou@163.com

本文链接: https://blog.csdn.net/lovehewenyu/article/details/109478203

#######################################################################################


 

 类似资料: