Как устранить неполадки ORA-02049 и заблокировать проблемы в целом с Oracle - PullRequest
13 голосов
/ 24 марта 2010

Иногда я получаю ORA-02049 для некоторых длительных и / или интенсивных транзакций. По-видимому, в этом нет никакой закономерности, но это происходит на простом ВСТАВКЕ.

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

Ответы [ 5 ]

10 голосов
/ 24 марта 2010

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

Чтобы автоматизировать это, вы можете либо

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

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

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

6 голосов
/ 24 марта 2010

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

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
2 голосов
/ 24 марта 2010

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

Также см. это .

1 голос
/ 24 марта 2010

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

0 голосов
/ 12 декабря 2018

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

Мы используем 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. Сотрудник указал, что я должен убить все эти множественные соединения во время отладки .... и это сработало. Поэтому в моем случае решение состояло в том, чтобы не подключаться к базе данных несколько раз с одним и тем же логином.

...