Blog 
Oracle 12c – wo sind meine Prozesse geblieben?

Multi-Process Multi-Threaded Oracle

Wenn man Oracle Datenbanken unter Unix und Linux betreibt, dann weiß man, dass jede Datenbank zig Prozesse hat. Wenn man die Datenbank jedoch unter Microsoft Windows betreibt, hat man einen einzigen Prozess „Oracle“ und alle weiteren Aktionen gliedern sich in Tasks ein. Mit Oracle 12c ist es jetzt möglich, auch unter Unix und Linux die Oracle Instanz mit wenigen Prozessen und darin eingegliederten Tasks zu betreiben. Das Stichwort hierfür heißt „Multi-Threaded Oracle„.

Wie geht das und was passiert?

Zunächst einmal muss der Parameter threaded_execution auf „TRUE“ gesetzt werden. Nach dem Restart der Instanz sind anschließend nur noch wenige Prozesse zu sehen (u.A. der pmon). Die Benutzerprozesse bleiben hiervon allerdings zunächst ausgenommen. Erst durch den Listener-Parameter DEDICATED_THROUGH_BROKER_LISTENER=ON wird erreicht, dass die Benutzerprozesse ebenfalls als Threads ausgeführt werden und man sieht anschließend mit dem Befehl ps keinerlei weitere Prozesse mehr auf dem Datenbank Server.

Allerdings gibt es nach dieser Umstellung eine kleine aber feine Einschränkung: Wenn die Instanz im Multi-Threaded Modus betrieben wird, ist kein Connect mehr mit Betriebssystem Authentifizierung mehr möglich – also auch kein sqlplus / as sysdba. Statt dessen muss immer der Benutzer und dass Passwort angegeben werden.

Beispiel

Hier die Prozessliste einer „normalen“ Oracle 12c Datenbank:

% ps -ef|grep WAGNER1
oracle    8994     1  0 12:36 ?        00:00:00 ora_pmon_WAGNER1
oracle    8996     1  0 12:36 ?        00:00:00 ora_psp0_WAGNER1
oracle    8998     1  1 12:36 ?        00:00:51 ora_vktm_WAGNER1
oracle    9002     1  0 12:36 ?        00:00:00 ora_gen0_WAGNER1
oracle    9004     1  0 12:36 ?        00:00:00 ora_mman_WAGNER1
oracle    9008     1  0 12:36 ?        00:00:00 ora_diag_WAGNER1
oracle    9010     1  0 12:36 ?        00:00:00 ora_dbrm_WAGNER1
oracle    9012     1  0 12:36 ?        00:00:02 ora_dia0_WAGNER1
oracle    9014     1  0 12:36 ?        00:00:00 ora_dbw0_WAGNER1
oracle    9016     1  0 12:36 ?        00:00:00 ora_lgwr_WAGNER1
oracle    9018     1  0 12:36 ?        00:00:00 ora_ckpt_WAGNER1
oracle    9020     1  0 12:36 ?        00:00:00 ora_smon_WAGNER1
oracle    9022     1  0 12:36 ?        00:00:00 ora_reco_WAGNER1
oracle    9024     1  0 12:36 ?        00:00:00 ora_lreg_WAGNER1
oracle    9026     1  0 12:36 ?        00:00:03 ora_mmon_WAGNER1
oracle    9028     1  0 12:36 ?        00:00:02 ora_mmnl_WAGNER1
oracle    9030     1  0 12:36 ?        00:00:00 ora_d000_WAGNER1
oracle    9032     1  0 12:36 ?        00:00:00 ora_s000_WAGNER1
oracle    9044     1  0 12:37 ?        00:00:00 ora_tmon_WAGNER1
oracle    9046     1  0 12:37 ?        00:00:00 ora_tt00_WAGNER1
oracle    9048     1  0 12:37 ?        00:00:00 ora_smco_WAGNER1
oracle    9050     1  0 12:37 ?        00:00:00 ora_fbda_WAGNER1
oracle    9052     1  0 12:37 ?        00:00:00 ora_w000_WAGNER1
oracle    9054     1  0 12:37 ?        00:00:00 ora_aqpc_WAGNER1
oracle    9056     1  0 12:37 ?        00:00:01 ora_cjq0_WAGNER1
oracle    9060     1  0 12:37 ?        00:00:00 ora_p000_WAGNER1
oracle    9062     1  0 12:37 ?        00:00:00 ora_p001_WAGNER1
oracle    9064     1  0 12:37 ?        00:00:00 ora_p002_WAGNER1
oracle    9066     1  0 12:37 ?        00:00:00 ora_p003_WAGNER1
oracle    9098     1  0 12:37 ?        00:00:00 ora_qm02_WAGNER1
oracle    9102     1  0 12:37 ?        00:00:00 ora_q002_WAGNER1
oracle    9104     1  0 12:37 ?        00:00:00 ora_q003_WAGNER1
oracle    9283     1  0 12:47 ?        00:00:00 ora_w001_WAGNER1
oracle    9520     1  0 13:07 ?        00:00:00 ora_w002_WAGNER1
...

Jetzt wird der Instanz Parameter threaded_execution auf „TRUE“ gesetzt und die Instanz neu gestartet:

SQL> ALTER SYSETM SET threaded_execution=TRUE scope=spfile;
System altered.
SQL> shutdown immediate
...
SQL> startup
ORA-01017: invalid username/password; logon denied

Wie man sieht, funktioniert die OS-Authentication nicht, sondern man muss sich mit Benutzername und Passwort anmelden.

% sqlplus sys/manager as sysdba

Jetzt sieht die Prozessliste so aus:

% ps -ef|grep WAGNER
oracle   19286     1  0 10:39 ?        00:00:00 ora_pmon_WAGNER1
oracle   19288     1  0 10:39 ?        00:00:00 ora_psp0_WAGNER1
oracle   19290     1  1 10:39 ?        00:00:02 ora_vktm_WAGNER1
oracle   19294     1  0 10:39 ?        00:00:00 ora_u004_WAGNER1
oracle   19300     1  3 10:39 ?        00:00:05 ora_u005_WAGNER1
oracle   19306     1  0 10:39 ?        00:00:00 ora_dbw0_WAGNER1
oracle   19369     1  0 10:41 ?        00:00:00 oracleWAGNER1 (LOCAL=NO)
oracle   19373     1  0 10:42 ?        00:00:00 oracleWAGNER1 (LOCAL=NO)
oracle   19376     1  0 10:42 ?        00:00:00 oracleWAGNER1 (LOCAL=NO)

Die Instanz verwendet nur noch 6 Hintergrundprozesse, die Benutzerprozesse sind aber weiterhin dediziert. Mit dem Listener-Eintrag kann auch dies geändert werden:

% cat listener.ora
DEDICATED_THROUGH_BROKER_LISTENER=ON
...
% lsnrctl stop
% lsnrctl start
% ps -ef |grep WAGNER
oracle   19286     1  0 10:39 ?        00:00:00 ora_pmon_WAGNER1
oracle   19288     1  0 10:39 ?        00:00:00 ora_psp0_WAGNER1
oracle   19290     1  1 10:39 ?        00:00:12 ora_vktm_WAGNER1
oracle   19294     1  0 10:39 ?        00:00:00 ora_u004_WAGNER1
oracle   19300     1  1 10:39 ?        00:00:09 ora_u005_WAGNER1
oracle   19306     1  0 10:39 ?        00:00:00 ora_dbw0_WAGNER1

Jetzt sind die Benutzerprozesse nicht mehr sichtbar bzw. laufen jetzt als Threds unter dem Prozess 19300 (ora_u005_WAGNER1). Das kann man über die View v$processes feststellen.

SQL> SELECT spid, stid, pname, execution_type, program  
           FROM v$process
          ORDER BY execution_type, stid;
SPID    STID     PNAME EXECUTION_ PROGRAM
------- -------- ----- ---------- --------------------------------------
                       NONE       PSEUDO
19300   19510    W001  THREAD     oracle@wagner.carajandb.intern (W001)
19300   19515          THREAD     oracle@wagner.carajandb.intern
19300   19516          THREAD     oracle@wagner.carajandb.intern

Fazit

Benchmarks zu den Unterschieden zwischen dem Multi-Threaded und Multi-Process Datenbank Betrieb stehen noch aus, aber man kann sicherlich davon ausgehen, dass sich, ähnlich wie bei den Pluggable Databases, durch die Einsparung von Prozessen Vorteile für den Betrieb von mehreren Datenbanken auf einem Server ergeben werden. Allerdings gibt es aufgrund der Einschränkung, dass keine Betriebssystem Authentifizierung mehr möglich ist, das Problem, dass viele Skripte nicht mehr funktionieren.

Über Kommentare und Erfahrungen würde ich mich sehr freuen.

Keine Kommentare zu “Oracle 12c – wo sind meine Prozesse geblieben?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Was kann CarajanDB für Sie tun?