Sql 如何使用Oracle对ORA-02049进行故障排除并锁定一般问题

Sql 如何使用Oracle对ORA-02049进行故障排除并锁定一般问题,sql,oracle,deadlock,ora-02049,Sql,Oracle,Deadlock,Ora 02049,我偶尔会收到一些长期运行和/或密集事务的ORA-02049。这似乎没有模式,但它发生在一个简单的插入上 我不知道如何从甲骨文或甲骨文中获取任何信息,但一定有办法吗?日志覆盖锁定或至少查看当前锁定的方法?尝试增加init.ora中的共享池大小值如果失败,请尝试更改系统刷新共享池 另请参见。使用此查询确定可能的阻塞锁: SELECT se.username, NULL, se.sid, DECODE( se.command, 0

我偶尔会收到一些长期运行和/或密集事务的ORA-02049。这似乎没有模式,但它发生在一个简单的插入上


我不知道如何从甲骨文或甲骨文中获取任何信息,但一定有办法吗?日志覆盖锁定或至少查看当前锁定的方法?

尝试增加init.ora中的共享池大小值
如果失败,请尝试更改系统刷新共享池


另请参见。

使用此查询确定可能的阻塞锁:

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

是否是位图索引导致了上述错误?

一种可能的方法是将
分布式锁定超时的
INIT.ORA
参数增加到更大的值。这将使您有更长的时间观察
v$lock
表,因为锁会持续更长时间

要实现自动化,您可以

  • 每隔5-10秒运行一次SQL作业,将
    v$lock
    的值或sandos在上面给出的查询记录到一个表中,然后对其进行分析,以查看是哪个会话导致了锁

  • 运行
    STATSPACK
    AWR
    报告。锁定的会话应该显示为经过很长时间,因此可以识别


v$session
还有3列
blocking\u instance、blocking\u session、blocking\u session\u status
,可以将这些列添加到上面的查询中,以给出锁定内容的图片。

好的,这是一个愚蠢的问题

我们使用的是EntityFramework 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上使用了相同的登录名。一位同事指出,我应该在调试时关闭所有这些多个连接。。。。它成功了。因此,在我的案例中,解决方案是不使用同一登录名多次连接到数据库。

Metalink有很多关于所有ORA代码的信息,您应该查看这些信息。最后,如果您在生产环境中遇到此错误,您应该向Oracle打开一个支持请求。我不会将此作为答案发布,因为这更像是猜测,但您是否在远程数据库的警报日志中看到ORA-600错误?如果是这样,您可能会遇到ITL(感兴趣的事务列表)死锁。我之所以怀疑这一点,是因为你提到了密集的交易活动。这可能是因为在创建表和索引时使用了较低的INITRANS值。这提供了很好的信息,但由于某些原因,我的锁从未出现在这里。它们似乎也不经常出现在简单的“select*from v$lock”中,所以这可能是问题所在。
ORA-00942:表或视图不存在。
no,据我所知,我们没有使用任何位图索引。这似乎有帮助,只是将分布式锁定超时的值增加到300秒。我想我正在测试的机器超载了。