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

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

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


person sandos    schedule 24.03.2010    source источник
comment
В Metalink есть много информации обо всех ORA-кодах, на которую вам следует обратить внимание. В конечном счете, если вы получаете эту ошибку в производственной среде, вам следует отправить запрос в службу поддержки Oracle.   -  person a'r    schedule 24.03.2010
comment
Я не публикую это как ответ, потому что это скорее предположение, но видите ли вы ошибки ORA-600 в журнале предупреждений для удаленной базы данных? Если это так, вы можете столкнуться с взаимоблокировками ITL (списка заинтересованных транзакций). Я подозреваю это только потому, что вы упоминаете интенсивную транзакционную активность. Это может быть связано с низкими значениями INITRANS, используемыми при создании таблиц и индексов.   -  person dpbradley    schedule 24.03.2010


Ответы (5)


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

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

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

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

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

person VikrantY    schedule 24.03.2010
comment
Это похоже помогло, просто увеличив значение Distributed_lock_timeout до 300 секунд. Думаю, я перегружаю машины, на которых тестирую это. - person sandos; 30.03.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
person diederikh    schedule 24.03.2010
comment
Это дает хорошую информацию, но по какой-то причине мои замки здесь никогда не отображаются. Кажется, они не очень часто появляются в простом select * from v$lock ; либо, так что это, вероятно, проблема. - person sandos; 24.03.2010

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

См. также это.

person Padmarag    schedule 24.03.2010

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

person Tony Andrews    schedule 24.03.2010
comment
Нет, насколько я вижу, мы не используем растровые индексы. - person sandos; 24.03.2010

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

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

person BurnsBA    schedule 12.12.2018