Oracle 12c Multi-Process Multi-Threaded: Sessions via OS killen

4. Dezember 2014 Aus Von Markus Flechtner

Auf der DOAG-Konferenz Mitte November habe ich einen Vortrag über das „Oracle 12c Multithreaded Process Model gehalten“. Es war der undankbare letzte Slot am Donnerstag – Herzlichen Dank allen Konferenzteilnehmern, die nach den vielen Vorträgen an den Tagen zuvor solange durchgehalten haben und meinen Vortrag besucht haben.

Ein Kritikpunkt an „Threaded Execution“ ist, dass man eine wildgewordene Datenbanksession nicht mit einem „kill -9“ des Server-Prozesses beenden kann. Ich habe mir das ganze auf meinem Linux-Server mal genauer angeschaut und muss zugeben – ganz so stimmt das nicht 🙁

Wenn wir über „top“ einen dieser „Sammel-Prozesse „ora_u00x_“ ausgemacht haben, der einen wildgewordene DB-Session als Thread enthält (oder wir die Information über einen zu killenden Thread über V$SESSION (Spalte SPID bzw. STID) bekommen haben), können wir mit pidstat einen Blick auf den Prozess und seine Threads werfen:

oracle@training:~/ [TVD12] pidstat -t -p 4043
Linux 3.8.13-35.3.2.el6uek.x86_64 (demo.markusdba.local) 12/03/2014 _x86_64_ (2 CPU)

10:44:27 PM TGID TID %usr %system %guest %CPU CPU Command
10:44:27 PM 4043 – 2.52 0.52 0.00 3.04 1 ora_scmn_tvd12
10:44:27 PM – 4043 0.00 0.00 0.00 0.01 1 |__ora_scmn_tvd12
10:44:27 PM – 4044 0.00 0.00 0.00 0.00 1 |__oracle
10:44:27 PM – 4045 0.01 0.00 0.00 0.02 1 |__ora_diag_tvd12
10:44:27 PM – 4047 0.02 0.72 0.00 0.74 1 |__ora_vkrm_tvd12
10:44:27 PM – 4048 0.05 0.00 0.00 0.05 0 |__ora_dia0_tvd12
10:44:27 PM – 4056 0.00 0.00 0.00 0.00 0 |__ora_reco_tvd12
..
..
10:44:27 PM – 4805 0.01 0.00 0.00 0.01 0 |__oracle_4805_tvd

 

In diesem Fall enthält der Prozess einige Hintergrundprozesse und z.B. auch eine Datenbank-Session (Thread 4805). Diese wollen wir mittels „kill“ beenden.

Wir sehen auch, dass wir mittels pidstat rausfinden können, welcher Thread die meisten CPU-Resourcen benötigt.

pidstat “ zeigt auch ähnlich wie sar die CPU-Last alle I Sekunden an.

Der nächste Schritt ist es, diesen Thread zu killen. Signal 9 (SIGKILL) ist dabei sicher keine gute Idee, denn wenn der zugehörige Prozess auch Hintergrundprozesse (bzw. -threads) enthält, die nicht automatisch neu gestartet werden (können), dann verabschiedet sich die komplette Instanz. Zumindest aber würden auch alle anderen Client-Sessions, die an dem Prozess hängen, unsanft beendet.

Ein „kill -6″ (SIGABRT)“ ist da etwas freundlicher zu den anderen Threads.

Und „kill -6 4805“ ergibt (im oigen Beispiel) in der zugehörigen SQL*Plus-Sitzung

SQL> select * from dual;
select * from dual
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 4043 Thread ID: 4805
Session ID: 4 Serial number: 9329

.. und alle anderen Threads laufen weiter.

Ein Killen einer einzelnen Datenbank-Session ist somit auch bei „Threaded Execution“ möglich.


Werbung (Amazon-Partner-Link)