Oracle 12.1.0.2 expdp匯出分割槽表資料遇到BUG慢的原因和解決方法
Oracle expdp匯出分割槽表資料慢的原因和解決方法
簡述: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
本文連結: http://blog.itpub.net/26442936/viewspace-2685693/
#######################################################################################
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26442936/viewspace-2685693/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- Oracle 12.1.0.2 impdp匯入慢診斷Oracle
- Oracle資料泵匯出匯入(expdp/impdp)Oracle
- Oracle expdp資料泵遠端匯出Oracle
- oracle10g expdp資料泵的bug,按schema匯出,匯入impdp時無jobOracle
- oracle按照表條件expdp匯出資料Oracle
- 測試分割槽表部分匯出
- oracle分割槽表和分割槽表exchangeOracle
- ORACLE刪除-表分割槽和資料Oracle
- Oracle使用資料泵expdp,impdp進行資料匯出匯入Oracle
- oracle分割槽表和非分割槽表exchangeOracle
- Oracle 12c expdp和impdp匯出匯入表Oracle
- oracle 更改分割槽表資料 ora-14402Oracle
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- 分割槽表truncate慢處理
- Oracle查詢Interval partition分割槽表內資料Oracle
- 【資料泵】EXPDP匯出表結構(真實案例)
- Oracle 11g 透過expdp按日期匯出表Oracle
- oracle12c還原資料庫遇到的問題-將一個11.2.0.1的資料泵匯出檔案匯入12.1.0.2版本報錯Oracle資料庫
- ORACLE分割槽表梳理系列Oracle
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- 對oracle分割槽表的理解整理Oracle
- ORACLE匯入遇到ORACLE錯誤959解決方法Oracle
- 硬碟資料丟失原因和解決方案/資料恢復方法硬碟資料恢復
- oracle將表配置為分割槽表Oracle
- oracle 普通表-分割槽表改造流程Oracle
- 調整分割槽後分割槽不見的資料找到方法
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- Oracle分割槽表基礎運維-09刪除分割槽Oracle運維
- Oracle分割槽表基礎運維-05組合分割槽Oracle運維
- Oracle分割槽表基礎運維-02範圍分割槽Oracle運維
- Oracle分割槽表基礎運維-03HASH分割槽Oracle運維
- Oracle分割槽表基礎運維-07增加分割槽(1範圍分割槽)Oracle運維
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- MySQL資料表分割槽手記MySql
- Oracle SQL調優之分割槽表OracleSQL