【问题标题】:How to troubleshoot ORA-02049 and lock problems in general with Oracle如何解决 ORA-02049 和 Oracle 的一般锁定问题
【发布时间】:2011-01-31 04:11:44
【问题描述】:

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

我不知道如何获取任何类型的信息或 Oracle,但必须有办法吗?日志过度锁定或至少有一种查看当前锁定的方法?

【问题讨论】:

  • Metalink 有很多关于所有 ORA 代码的信息,你应该看看。最后,如果您在生产环境中遇到此错误,您应该向 Oracle 提出支持请求。
  • 我不会将此作为答案发布,因为这更像是一种猜测,但您是否在远程数据库的警报日志中看到 ORA-600 错误?如果是这样,您可能会遇到 ITL(感兴趣的事务列表)死锁。我只是怀疑这一点,因为您提到了密集的交易活动。这可能是由于创建表和索引时使用的 INITRANS 值较低。

标签: sql oracle deadlock ora-02049


【解决方案1】:

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

我们正在使用 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 上使用相同的登录名。一位同事指出我应该在调试时终止所有这些多个连接....并且它起作用了。所以我的解决方案是不要使用同一个登录名多次连接到数据库。

【讨论】:

    【解决方案2】:

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

    要实现这一点的自动化,您可以

    • 每 5-10 秒运行一次 SQL 作业,将 v$lock 的值或 sandos 上面给出的查询记录到表中,然后分析它以查看导致锁定的会话。

    • 运行STATSPACKAWR 报告。被锁定的会话应该以较长的经过时间显示,因此可以被识别。

    v$session 有另外 3 个列 blocking_instance, blocking_session, blocking_session_status 可以添加到上面的查询中,以显示锁定的内容。

    【讨论】:

    • 似乎有帮助,只是将 Distributed_lock_timeout 的值增加到 300 秒。我想我正在使我正在测试它的机器超载。
    【解决方案3】:

    可能是位图索引导致here 描述的错误?

    【讨论】:

    • 不,据我所知,我们没有使用任何位图索引。
    【解决方案4】:

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

    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
    

    【讨论】:

    • 这提供了很好的信息,但由于某种原因,我的锁从未出现在这里。它们似乎并不经常出现在简单的“select * from v$lock ;”中要么,所以这可能是问题所在。
    • ORA-00942: table or view does not exist
    【解决方案5】:

    尝试增加 init.ora 中的 SHARED_POOL_SIZE 值。
    如果失败,请尝试ALTER SYSTEM FLUSH SHARED_POOL

    另见this

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 2012-04-05
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2020-06-12
      • 2018-11-10
      相关资源
      最近更新 更多