2010-03-24 38 views
10

Thỉnh thoảng tôi thỉnh thoảng nhận được ORA-02049 cho một số giao dịch dài và/hoặc chuyên sâu. Có vẻ như không có mô hình này, nhưng nó xảy ra trên một INSERT đơn giản.Cách khắc phục sự cố ORA-02049 và khóa sự cố nói chung với Oracle

Tôi không biết làm cách nào để có được bất kỳ loại thông tin nào hoặc Oracle, nhưng phải có cách nào? Một bản ghi trên khóa hoặc atleast một cách để xem ổ khóa hiện tại?

+0

Metalink có rất nhiều thông tin về tất cả các mã ORA mà bạn nên xem. Cuối cùng, nếu bạn gặp lỗi này trên môi trường sản xuất, bạn nên mở một yêu cầu hỗ trợ với Oracle. –

+1

Tôi không đăng câu trả lời này vì đây là câu trả lời nhiều hơn, nhưng bạn có thấy các lỗi ORA-600 trong nhật ký cảnh báo cho cơ sở dữ liệu từ xa không? Nếu vậy, bạn có thể đang chạy vào ITL (danh sách giao dịch quan tâm) deadlocks. Tôi chỉ nghi ngờ điều này vì bạn đề cập đến hoạt động giao dịch chuyên sâu. Điều này có thể là do các giá trị INITRANS thấp được sử dụng khi tạo các bảng và các chỉ mục. – dpbradley

Trả lời

8

Một cách có thể là tăng thông số INIT.ORA cho distributed_lock_timeout thành giá trị lớn hơn. Điều này sau đó sẽ cung cấp cho bạn một thời gian dài hơn để quan sát bảng v$lock vì các khóa sẽ kéo dài lâu hơn.

Để đạt được tự động hóa điều này, bạn có thể

  • Chạy một công việc SQL mỗi 5-10 giây mà các bản ghi các giá trị của v$lock hoặc truy vấn mà Sandos đã đưa ra ở trên vào một bảng và sau đó phân tích nó để xem phiên nào đã gây ra khóa.

  • Chạy báo cáo STATSPACK hoặc AWR. Các phiên bị khóa sẽ hiển thị với thời gian trôi qua cao và do đó có thể được xác định.

v$session có thêm 3 cột blocking_instance, blocking_session, blocking_session_status có thể được bổ sung vào các truy vấn trên để đưa ra một bức tranh về những gì đang bị khóa.

+0

_seems_ này đã giúp, chỉ cần tăng giá trị của distribution_lock_timeout lên 300 giây. Tôi đoán tôi đang quá tải các máy tôi đang thử nghiệm này trên. – sandos

2

Thử tăng giá trị SHARED_POOL_SIZE trong init.ora.
Nếu không thành công, hãy thử ALTER SYSTEM FLUSH SHARED_POOL

Xem thêm this.

6

Sử dụng truy vấn này để xác định có thể khóa chặn:

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

Điều này cung cấp thông tin tốt, nhưng vì một số lý do khóa của tôi không bao giờ hiển thị ở đây. Họ dường như không xuất hiện rất thường xuyên trong một "lựa chọn * đơn giản từ v $ khóa;" hoặc là, đó có thể là vấn đề. – sandos

1

Nó có thể là một chỉ số bitmap gây ra lỗi như mô tả here?

+0

Không, theo như tôi thấy, chúng tôi không sử dụng bất kỳ chỉ mục bitmap nào. – sandos

Các vấn đề liên quan