webentwicklung-frage-antwort-db.com.de

So behandeln Sie den ORA-02049 und sperren Probleme allgemein mit Oracle

Ich bekomme gelegentlich ORA-02049 für einige lang andauernde und/oder intensive Transaktionen. Es gibt scheinbar kein Muster dazu, aber es passiert bei einem einfachen INSERT.

Ich habe keine Ahnung, wie ich Informationen oder Oracle herausholen kann, aber es muss einen Weg geben? Ein Protokoll über Sperren oder zumindest eine Möglichkeit, aktuelle Sperren zu sehen?

13
sandos

Ein möglicher Weg könnte darin bestehen, den INIT.ORA-Parameter für distributed_lock_timeout auf einen größeren Wert zu erhöhen. Dies würde dann eine längere Zeit für die Beobachtung der v$lock-Tabelle bedeuten, da die Sperren länger dauern würden.

Um dies zu automatisieren, können Sie entweder

  • Führen Sie alle 5-10 Sekunden einen SQL-Auftrag aus, der die Werte von v$lock oder der von sandos angegebenen Abfrage in einer Tabelle protokolliert, und analysieren Sie dann, um festzustellen, welche Sitzung die Sperre verursacht hat.

  • Führen Sie einen STATSPACK- oder einen AWR-Bericht aus. Die gesperrten Sitzungen sollten mit hoher verstrichener Zeit angezeigt werden und können daher identifiziert werden.

v$session hat 3 weitere Spalten blocking_instance, blocking_session, blocking_session_status, die der obigen Abfrage hinzugefügt werden können, um ein Bild von dem zu erhalten, was gesperrt wird.

9
VikrantY

Verwenden Sie diese Abfrage, um mögliche Sperrsperren zu ermitteln:

SELECT se.username,
       NULL,
       se.sid,
       DECODE( se.command,
               0, 'No command',
               1, 'CREATE TABLE',
               2, 'INSERT',
               3, 'SELECT',
               4, 'CREATE CLUSTER',
               5, 'ALTER CLUSTER',
               6, 'UPDATE',
               7, 'DELETE',
               8, 'DROP CLUSTER',
               9, 'CREATE INDEX',
               10, 'DROP INDEX',
               11, 'ALTER INDEX',
               12, 'DROP TABLE',
               13, 'CREATE SEQUENCE',
               14, 'ALTER SEQUENCE',
               15, 'ALTER TABLE',
               16, 'DROP SEQUENCE',
               17, 'GRANT',
               18, 'REVOKE',
               19, 'CREATE SYNONYM',
               20, 'DROP SYNONYM',
               21, 'CREATE VIEW',
               22, 'DROP VIEW',
               23, 'VALIDATE INDEX',
               24, 'CREATE PROCEDURE',
               25, 'ALTER PROCEDURE',
               26, 'LOCK TABLE',
               27, 'NO OPERATION',
               28, 'RENAME',
               29, 'COMMENT',
               30, 'AUDIT',
               31, 'NOAUDIT',
               32, 'CREATE DATABASE LINK',
               33, 'DROP DATABASE LINK',
               34, 'CREATE DATABASE',
               35, 'ALTER DATABASE',
               36, 'CREATE ROLLBACK SEGMENT',
               37, 'ALTER ROLLBACK SEGMENT',
               38, 'DROP ROLLBACK SEGMENT',
               39, 'CREATE TABLESPACE',
               40, 'ALTER TABLESPACE',
               41, 'DROP TABLESPACE',
               42, 'ALTER SESSION',
               43, 'ALTER USER',
               44, 'COMMIT',
               45, 'ROLLBACK',
               46, 'SAVEPOINT',
               47, 'PL/SQL EXECUTE',
               48, 'SET TRANSACTION', 
               49, 'ALTER SYSTEM SWITCH LOG',
               50, 'EXPLAIN',
               51, 'CREATE USER',
               52, 'CREATE ROLE',
               53, 'DROP USER',
               54, 'DROP ROLE',
               55, 'SET ROLE',
               56, 'CREATE SCHEMA',
               57, 'CREATE CONTROL FILE',
               58, 'ALTER TRACING',
               59, 'CREATE TRIGGER',
               60, 'ALTER TRIGGER',
               61, 'DROP TRIGGER',
               62, 'ANALYZE TABLE',
               63, 'ANALYZE INDEX',
               64, 'ANALYZE CLUSTER',
               65, 'CREATE PROFILE',
               67, 'DROP PROFILE',
               68, 'ALTER PROFILE',
               69, 'DROP PROCEDURE',
               70, 'ALTER RESOURCE COST',
               71, 'CREATE SNAPSHOT LOG',
               72, 'ALTER SNAPSHOT LOG',
               73, 'DROP SNAPSHOT LOG',
               74, 'CREATE SNAPSHOT',
               75, 'ALTER SNAPSHOT',
               76, 'DROP SNAPSHOT',
               79, 'ALTER ROLE',
               85, 'TRUNCATE TABLE',
               86, 'TRUNCATE CLUSTER',
               88, 'ALTER VIEW',
               91, 'CREATE FUNCTION',
               92, 'ALTER FUNCTION',
               93, 'DROP FUNCTION',
               94, 'CREATE PACKAGE',
               95, 'ALTER PACKAGE',
               96, 'DROP PACKAGE',
               97, 'CREATE PACKAGE BODY',
               98, 'ALTER PACKAGE BODY',
               99, 'DROP PACKAGE BODY',
         TO_CHAR(se.command) ) command,
       DECODE(lo.type,
         'MR', 'Media Recovery',
         'RT', 'Redo Thread',
         'UN', 'User Name',
         'TX', 'Transaction',
         'TM', 'DML',
         'UL', 'PL/SQL User Lock',
         'DX', 'Distributed Xaction',
         'CF', 'Control File',
         'IS', 'Instance State',
         'FS', 'File Set',
         'IR', 'Instance Recovery',
         'ST', 'Disk Space Transaction',
         'TS', 'Temp Segment',
         'IV', 'Library Cache Invalidation',
         'LS', 'Log Start or Switch',
         'RW', 'Row Wait',
         'SQ', 'Sequence Number',
         'TE', 'Extend Table',
         'TT', 'Temp Table',
         'JQ', 'Job Queue',
         lo.type) ltype,
       DECODE( lo.lmode, 
         0, 'NONE',           /* Mon Lock equivalent */
         1, 'Null Mode',      /* N */
         2, 'Row-S (SS)',     /* L */
         3, 'Row-X (SX)',     /* R */
         4, 'Share (S)',      /* S */
         5, 'S/Row-X (SSX)',  /* C */
         6, 'Excl (X)',       /* X */
         lo.lmode) lmode,
       DECODE( lo.request, 
         0, 'NONE',           /* Mon Lock equivalent */
         1, 'Null',           /* N */
         2, 'Row-S (SS)',     /* L */
         3, 'Row-X (SX)',     /* R */
         4, 'Share (S)',      /* S */
         5, 'S/Row-X (SSX)',  /* C */
         6, 'Excl (X)',       /* X */
         TO_CHAR(lo.request)) request,
       lo.ctime ctime,
       DECODE(lo.block,
         0, 'No Block',
         1, 'Blocking',
         2, 'Global',
         TO_CHAR(lo.block)) blkothr,
       'SYS' owner,
       ro.name image
  FROM v$lock lo,
       v$session se,
       v$transaction tr,
       v$rollname ro
 WHERE se.sid = lo.sid
   AND se.taddr = tr.addr(+)
   AND tr.xidusn = ro.usn(+)
 ORDER BY sid
6
diederikh

Erhöhen Sie den SHARED_POOL_SIZE-Wert in init.ora. 
Wenn dies fehlschlägt, versuchen Sie ALTER SYSTEM FLUSH SHARED_POOL 

Siehe auch this .

2
Padmarag

Könnte es ein Bitmap-Index sein, der den Fehler verursacht, wie beschrieben hier ?

1
Tony Andrews

Ok, das war ein dummes Problem. 

Wir verwenden Entity Framework 6.0 (aktualisiert auf 6.2, aber keine Änderung), Oracle.ManagedDataAccess + EntityFramework 12.2.1100, .NET 4.5.

Ich erhielt ORA-02049: timeout: distributed transaction waiting for lock mit der folgenden Abfrage: 

update "schemaname"."tablename"
set "DUE_DATE" = :p0
where ("ID" = :p1) 

(über das EF context.Database.Log-Ereignis). Eine wirklich einfache Abfrage sollte keine Probleme haben. 

Nun, ich habe dasselbe Login auf dem Remote-Server, in meinem lokalen Debugger und in Oracle SQL Developer verwendet. Ein Mitarbeiter wies darauf hin, dass ich beim Debuggen all diese mehrfachen Verbindungen beenden sollte ... und es hat funktioniert. Daher bestand die Lösung in meinem Fall darin, nicht mehrmals mit demselben Login eine Verbindung zur Datenbank herzustellen.

0
BurnsBA