Oracle: Datenbank Tuning
Es gibt viele Bereiche für das Tuning einer Oracle-Datenbank.
Lock-Erkennung und -Behebung
[Bearbeiten]Locks auf der Datenbank ermitteln
[Bearbeiten]Ausgeben aller Sessions, die gerade von anderen Sessions blockiert werden.
select * from v$session where blocking_session is not null
Locks auf allen Objekten in der Datenbank anzeigen
SELECT a.session_id, a.oracle_username, a.os_user_name, b.object_name FROM v$locked_object a, sys.all_objects b WHERE b.object_id = a.object_id ORDER BY 2, 3;
Locks nur für die Objekte des aktuellen Benutzers in der Datenbank anzeigen
SELECT a.session_id, a.oracle_username, a.os_user_name, b.object_name FROM v$locked_object a, sys.user_objects b WHERE b.object_id = a.object_id ORDER BY 2, 3;
SQL-Statement-Cache der aktuellen Sessions anzeigen
SELECT se.username, se.osuser, sq.sql_text FROM v$sql sq, v$session se WHERE se.sql_address = sq.address ORDER BY 1, 2;
Skript catblock.sql zur Anzeigen von Sperrungen
[Bearbeiten]In $ORACLE_HOME\RDBMS\ADMIN\catblock.sql befindet sich ein Script zum Erstellen einiger System-Views, mit denen Locks angezeigt werden können. Folgende Views werden erstellt:
- DBA_KGLLOCK
- DBA_LOCKS
- DBA_LOCK
- DBA_LOCK_INTERNAL
- DBA_DML_LOCKS
- DBA_DDL_LOCKS
- DBA_WAITERS
- DBA_BLOCKERS
Blockiert jemand eine andere Transaktion?
SQL> select * from dba_waiters ; WAITING_SESSION HOLDING_SESSION --------------- --------------- 13 19
Wer wird blockiert?
SQL> select * from dba_waiters ; WAITING_SESSION HOLDING_SESSION --------------- --------------- 13 19
Wie lange wartet die Session 13 schon?
SQL> select session_id, LAST_CONVERT Sekunden, LAST_CONVERT/60 Minuten from dba_locks where Session_id in (13, 19) ; SESSION_ID SEKUNDEN MINUTEN ---------- ---------- ---------- 13 2011 33,5166667 13 2011 33,5166667 13 2011 33,5166667 19 2057 34,2833333 19 2057 34,2833333 19 2061 34,35
Welche User arbeitet als Session 13 bzw. 19?
SQL> select sid, serial#, username from v$session where sid in (13,19) ; SID SERIAL# USERNAME ---------- ---------- ------------------------------ 13 71 SCOTT 19 35 SCOTT
Skript utllockt.sql zur Anzeige von wartenden Transaktionen
[Bearbeiten]In $ORACLE_HOME\RDBMS\ADMIN\utllockt.sql findet man ein Script zur Anzeige von wartenden Transaktionen.
In diesem Script wird
- eine Tabelle erstellt,
- mit Daten gefüllt,
- angezeigt
- und dann wird die Tabelle wieder entfernt.
Beispiel für eine Anzeige von Sperren:
- Die Session 9 wartet auf die Session 8.
- Session 7 wartet auf Session 9
- Session 10 wartet ebenfalls auf Session 9
WAITING_SESSION TYPE MODE REQUESTED MODE HELD LOCK ID1 LOCK ID2 ----------------- ---- ----------------- ----------------- -------- -------- 8 NONE None None 0 0 9 TX Share (S) Exclusive (X) 65547 16 7 RW Exclusive (X) S/Row-X (SSX) 33554440 2 10 RW Exclusive (X) S/Row-X (SSX) 33554440 2
Kill Session
[Bearbeiten]Die Session 19 blockiert die Session 13 schon seit 34 Minuten. Sie soll beendet werden. Bei kill session muss man immer die Session-Id und die Serial-Nummer in Anführungszeichen angeben.
SQL> alter system kill session '19, 35' ; System wurde geändert.
Die Session 19 erhält zunächst keine Fehlermeldung. Erst wenn der nächste Befehl eingegeben wird, stellt SQL-PLUS fest, dass die Verbindung zur Server-Session nicht mehr existiert:
SQL> select * from intab; select * from intab * FEHLER in Zeile 1: ORA-00028: Ihre Sitzung wurde abgebrochen