Der DataPump Export läuft nur sehr langsam und benötigt ein Vielfaches der erwarteten Zeit. Generell beobachtet man Phänomene, wie in diesem Artikel beschrieben.
Zuerst überprüft und setzt man die üblichen Verdächtigen wie
- Statistiken für
- Dictionary
exec dbms_stats.gather_dictionary_stats;
- Fixed Objects
exec dbms_stats.gather_fixed_object_stats;
- System
exec dbms_stats.gather_system_stats;
- Parametern
- aq_tm_processes > 0 setzen (1 oder 2 sollte reichen)
- pga_aggregate_target ausreichend groß setzen
- streams_pool_size explizit setzen
um zu sehen, ob das die DataPump Performance verbessert.
Leider führt das nicht immer zur erwünschten Verbesserung.
Die Analyse
Mit dem expdp Parameter log_time=all (Verfügbar ab 12.1) sieht man, dass sogar leere Tabellen lange brauchen und in den Wait Events der DataPump Session sieht man das übliche Event "Streams AQ: enqueue blocked on low memory".
Wenn man AMM oder ASMM verwendet (sga_target oder memory_target sind gesetzt), aber vor allem wenn der Parameter streams_pool_size nicht explizit gesetzt wird, läuft die Datenbank manchmal in Probleme beim Shrinken des Streams Pools.
Details dazu finden sich in der Oracle Note Datapump Expdp Or Impdp Slowdown Due To Frequent Waits On ”Streams AQ: Enqueue Blocked On Low Memory" (Doc ID 2386566.1)
Führt man diese Abfrage
SQL> select shrink_phase_knlasg from X$KNLASG;
SHRINK_PHASE_KNLASG
-------------------
1
mehrmals während dem Export durch und sie liefert konsistent das Ergebnis "1" statt "0", dürfte Oracle eben in der Shrink-Phase des Streams Pool hängen bleiben.
Dieses Problem mit dem Auto Tuning des Streams Pool wird auch in der Oracle Note EXPDP And IMPDP Slow Performance In 11gR2 and 12cR1 And Waits On Streams AQ: Enqueue Blocked On Low Memory (Doc ID 1596645.1) beschrieben. Hier wird auch auf den Workaround verwiesen, dieses Auto Tuning mit einem Underscore Parameter zu deaktivieren:
SQL> alter system set "_disable_streams_pool_auto_tuning"=TRUE;
Die Lösung
Hat man das Problem mit der Shrink-Phase des Streams Pools identifiziert, kann man Oracle manuell nachhelfen und das Ende des Shrinks erziwngen:
SQL> alter system set events 'immediate trace name mman_create_def_request level 6';
Danach läuft der Export mit der erwarteten Geschwindigkeit weiter.