Skip to Main Content

Breadcrumb

Startup Open von PDBs dauert lange

Zumindest mit den Oracle 19c Releases 19.10 und 19.11 tritt das Problem auf, dass das Öffnen von PDBs mitunter viele Minuten dauern kann - möglicherweise sind auch ältere Versionen betroffen. Das Starten der Instanz (STARTUP MOUNT) dauert wie üblich, auch die CDB und PDB$SEED werden beim OPEN sehr schnell geöffnet, bei einer oder mehreren PDBs dauert es aber viel länger bis diese geöffnet werden (ALTER PLUGGABLE DATABASE PDBx OPEN;). Es scheint, als ob die Instanz/die Session hängt.

Analyse

Um dem Problem auf die Spur zu kommen:

  • Zuerst STARTUP MOUNT.
  • Dann den Trace 10046 mit Level 12 für die Session setzen
  • ALTER DATABASE OPEN
  • Warten, bis die Datenbank / die PDBs offen sind
  • das/die Tracefile(s) von der Session des Startups mit tkprof sort=exeela lesbar machen.
startup mount;
alter session set events '10046 trace name context forever,level 12';
alter database open;
alter pluggable database all open;

Jetzt das entsprechende Tracefile suchen und mit tkprof lesbarer machen - beispielsweise:

tkprof db19ee_ora_18634.trc db19ee_ora_18634.txt sort=exeela,fchela 

Dort findet man ein SELECT auf SYS.REG$, das sehr lange dauert. Die SYS.REG$ wird für verschiedene Benachrichtigungsmechanismen (notification) von Oracle genutzt. Unter anderem von:

  • FAN - Fast Application Notification - Registrierung von ODP.net, OCI Clients und PLSQL Callbacks
  • Advanced Queuing Client Registrations (dazu gehören auch Streams Registrations)
  • Client Side Result Cache (nicht zu verwechseln mit dem Server Side Result Cache)

Als nächstes muss  in der betroffenen PDB festgestellt werden, wo die meisten Registierungen sind:

connect / as sysdba
alter session set container = PDB1;
set pages 100 lines 200 tab off
col SUBSCRIPTION_NAME for a60
col LOCATION_NAME for a60

select SUBSCRIPTION_NAME, LOCATION_NAME, count(*) as cnt 
  from sys.reg$ 
 group by SUBSCRIPTION_NAME, LOCATION_NAME 
 order by 3;

In der Regel sind die Mengen (CNT) an Registrierungen überschaubar, allerdings gibt es zumindest in Oracle 19.11, 19.12 und 19.13 ein Problem, wenn  Client Side Result Cache genutzt wird und die Datenbank Instanz oder die Clients (App Server) regelmäßig neu gestartet werden. Obwohl beim Restart der Instanz nichts im Result Cache stehen kann, bleiben die entsprechenden Registrierungen bestehen. Diese werde mit der Zeit immer mehr und das führt zu den langen Zeiten zwischen MOUNT und OPEN.

Workaround

Wenn die Registrierungen ganz sicher nicht mehr benötigt werden, können  sie auch glöscht werden. Natürlich sollte man dazu die entsprechenden Methoden wählen, wenn Oracle dies vorsieht. Bei verschiedene Registrierungen wie z.B. Result Cache kann diese nicht so leicht gelöscht werden.

Wenn  die entsprechenden Registierungen nicht anders gelöscht werden können, hilft die nachstehende Anleitung, wobei die WHERE CLAUSE an die jeweiligen Registrierungen angepasst werden muss:

connect / as sysdba
alter session set container = PDB1;

delete from sys.reg$ where location_name = 'net8://?PR=0';
commit;

Zusätzlich können auch in der CDB folgende undokumentierten Parameter gesetzt werden, um in Zukunft zumindest einen Teil dieser Registrierung gleichen automatisch zu entfernen, sowie die Timeouts für fehlgeschlagene Registrierung zu reduzieren.

connect / as sysdba
alter system set "_emon_send_timeout"=10000;
alter system set "_client_enable_auto_unregister"=TRUE;

Nach dem Upgrade auf Oracle 19.14 ist nach unserem Wissen das Problem nicht wieder aufgetreten, allerdings ist dies keine offizielle verifizierte Aussage, da wir nicht alle möglichen Registrierungen ausprobiert haben. Es besteht die Vermutung, dass es etwas mit dem Bug 32936961 zu tun hat, einen Patch gibt es aber nur für die Version 19.10. Der Patch für diesen Bug ist in 19.12 enthalten - wir haben aber direkt auf 19.14 aktualisiert

Weitere Suchbegriffen:

STARTUP, OPEN, ALTER PLUGGABLE DATABASE OPEN, PLUGGABLE, HUNG, TIMEOUT, LANGSAM, HÄNGT, DAUERT LANGE