2010-03-24 48 views
10

Obtengo ORA-02049 de vez en cuando para algunas transacciones de larga ejecución y/o intensivas. Aparentemente no hay un patrón para esto, pero sucede en un simple INSERTAR.Cómo solucionar problemas de ORA-02049 y problemas de bloqueo en general con Oracle

No tengo ni idea de cómo obtener ningún tipo de información o Oracle, pero tiene que haber una manera? ¿Un registro sobre bloqueo o al menos una forma de ver bloqueos actuales?

+0

Metalink tiene mucha información acerca de todos los códigos ORA, que debería tener en cuenta. En última instancia, si obtiene este error en un entorno de producción, debe abrir una solicitud de soporte con Oracle. –

+1

No publico esto como respuesta porque es más una suposición, pero ¿ves errores ORA-600 en el registro de alertas para la base de datos remota? Si es así, es posible que se esté ejecutando en interbloqueos de ITL (lista de transacciones interesadas). Solo sospecho esto porque mencionas actividad intensiva de transacciones. Esto podría deberse a los bajos valores de INITRANS utilizados al crear las tablas y los índices. – dpbradley

Respuesta

8

Una posible forma podría ser aumentar el parámetro INIT.ORA para distributed_lock_timeout a un valor mayor. Esto le daría más tiempo para observar la tabla v$lock, ya que los bloqueos durarían más tiempo.

para lograr la automatización de este, puede

  • Ejecutar un trabajo de SQL cada 5-10 segundos que registra los valores de v$lock o la consulta que Sandos ha dado anteriormente en una mesa y luego analizarla para ver qué sesión estaba causando el bloqueo.

  • Ejecute un STATSPACK o un informe AWR. Las sesiones que se bloquearon deberían aparecer con un tiempo transcurrido alto y, por lo tanto, pueden identificarse.

v$session tiene 3 columnas más blocking_instance, blocking_session, blocking_session_status que se pueden agregar a la consulta anterior para dar una imagen de lo que está siendo bloqueado.

+0

Esto _ parece_ haber ayudado, simplemente aumentando el valor de distributed_lock_timeout a 300 segundos. Supongo que estoy sobrecargando las máquinas en las que estoy probando esto. – sandos

2

Intente aumentar el valor de SHARED_POOL_SIZE en init.ora.
Si eso falla intente ALTER SYSTEM FLUSH SHARED_POOL

Vea también this.

6

Utilice esta consulta para determinar posibles cierres de bloqueo:

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 
+0

Esto da buena información, pero por alguna razón mis bloqueos nunca aparecen aquí. No parecen aparecer muy a menudo en un simple "select * from v $ lock;" cualquiera, entonces ese es probablemente el problema. – sandos

1

Podría ser un índice de mapa de bits que causa el error como se describe here?

+0

No, por lo que puedo ver, no estamos usando ningún índice de mapa de bits. – sandos

Cuestiones relacionadas