Как устранить проблему ORA-02049 и проблемы с блокировкой в ​​целом с Oracle

Я иногда получаю ORA-02049 для некоторых длительных и/или интенсивных транзакций. По-видимому, нет никакого шаблона, но это происходит при простом INSERT.

Я понятия не имею, как получить какую-либо информацию или Oracle, но должен быть способ? Заблокировать блокировку или, по крайней мере, способ увидеть текущие блокировки?

Ответ 1

Одним из возможных способов может быть увеличение параметра INIT.ORA для distributed_lock_timeout до большего значения. Это даст вам больше времени для наблюдения за таблицей v$lock, поскольку блокировки продолжатся дольше.

Чтобы добиться автоматизации, вы можете либо

  • Запуск задания SQL каждые 5-10 секунд, который регистрирует значения v$lock или запрос, который сандоны указали выше, в таблицу, а затем проанализировать его, чтобы увидеть, какой сеанс вызывает блокировку.

  • Запустите отчет STATSPACK или AWR. Заседания, которые были заблокированы, должны отображаться с большим прошедшим временем и, следовательно, могут быть идентифицированы.

v$session имеет еще 3 столбца blocking_instance, blocking_session, blocking_session_status, которые могут быть добавлены в запрос выше, чтобы дать изображение того, что становится заблокированным.

Ответ 2

Используйте этот запрос, чтобы определить возможные блокирующие блокировки:

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

Ответ 3

Попробуйте увеличить значение SHARED_POOL_SIZE в init.ora.
Если это не удается, попробуйте ALTER SYSTEM FLUSH SHARED_POOL

Также см. this.

Ответ 4

Может ли это быть растровым индексом, вызывающим ошибку, как описано здесь?

Ответ 5

Хорошо, это была глупая проблема.

Мы используем Entity Framework 6.0 (обновлена до 6.2, но без изменений), Oracle.ManagedDataAccess +EntityFramework 12.2.1100,.NET 4.5.

Я получил ORA-02049: timeout: distributed transaction waiting for lock со следующим запросом:

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

(через событие EF context.Database.Log). Действительно простой запрос, не должно быть никаких проблем.

Я использовал тот же логин на удаленном сервере, в моем локальном отладчике и в Oracle SQL Developer. Сотрудник указал, что я должен убить все эти множественные соединения во время отладки.... и это сработало. Таким образом, решение в моем случае состояло в том, чтобы не подключаться к базе данных несколько раз с одним и тем же логином.