Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle 19c Open_cursor vượt quá sự cố

Tôi không thể cho bạn biết điều gì đang gây ra sự cố con trỏ mở tối đa của bạn, nhưng tôi cho bạn biết cách tìm nguyên nhân bằng cách xác định các phiên liên quan và câu lệnh SQL bằng cách sử dụng GV$OPEN_CURSOR .

Nếu may mắn, bạn có thể tìm ra vấn đề ngay lập tức với một truy vấn đơn giản đếm số con trỏ đang mở trên mỗi phiên. Có rất nhiều cột trong truy vấn dưới đây, hãy sử dụng IDE để bạn có thể dễ dàng duyệt qua tất cả dữ liệu. Theo kinh nghiệm của tôi, chỉ cần nhìn lướt qua các cột như USER_NAME và SQL_TEXT là đủ để xác định thủ phạm.

select count(*) over (partition by inst_id, sid) cursors_per_session, gv$open_cursor.*
from gv$open_cursor
order by cursors_per_session desc, inst_id, sid;

Hãy nhớ rằng sẽ có nhiều truy vấn kỳ lạ trong chế độ xem đó có thể làm cho số lượng lớn hơn bạn dự đoán. Với tất cả các truy vấn đệ quy và lưu trong bộ nhớ cache, không có gì lạ khi có một phiên "nhàm chán" sử dụng 50 con trỏ. Bạn đang tìm kiếm các phiên có hàng trăm con trỏ đang mở. (Trừ khi ai đó dại dột hạ thấp giá trị tham số xuống dưới giá trị mặc định.)

Rất tiếc, GV$OPEN_CURSOR không chứa dữ liệu lịch sử và những sự cố này có thể bắt đầu và dừng lại nhanh chóng nếu có một ngoại lệ bên trong một vòng lặp chặt chẽ mở nhanh nhiều con trỏ. Khối PL / SQL bên dưới chạy cho đến khi nó tìm thấy một phiên có số lượng lớn con trỏ đang mở, lưu trữ dữ liệu và thoát. Khối PL / SQL này đắt tiền và sẽ sử dụng hết cả một phiên xử lý để chờ thời điểm thích hợp, vì vậy chỉ sử dụng nó một lần để tìm ra sự cố.

--Create table to hold the results.
create table too_many_cursors as
select 1 cursors_per_session, gv$open_cursor.*
from gv$open_cursor
where 1 = 0;


--Write the open cursor data when a session gets more than N open cursors.
declare
    v_open_cursor_threshold number := 50;
    v_count number;
begin
    --Loop forever until the problem is found.
    loop
        --Count the largest numbe of open cursors.
        select max(the_count)
        into v_count
        from
        (
            select count(*) the_count
            from gv$open_cursor
            group by inst_id, sid
        );

        --If the threshold is reached, write the data, commit it, and quit the program.
        if v_count >= v_open_cursor_threshold then

            insert into too_many_cursors
            select *
            from
            (
                select count(*) over (partition by inst_id, sid) cursors_per_session, gv$open_cursor.*
                from gv$open_cursor
            )
            where cursors_per_session >= v_open_cursor_threshold;
            
            commit;
            
            exit;
        end if;
        
    end loop;
end;
/


--Your problem should now be in this table:
select * from too_many_cursors;

Nếu bạn muốn kiểm tra việc giám sát, bạn có thể sử dụng khối PL / SQL bên dưới để mở một số lượng lớn con trỏ.

--Open a large number of cursors in and wait for 20 seconds.
--(Done by creating a dynamic PL/SQL block with many "open" commands with a "sleep" at the end.
declare
    v_number_of_open_cursors number := 200;
    v_declarations clob;
    v_opens clob;
    v_sql clob;
begin
    for i in 1 .. v_number_of_open_cursors loop
        v_declarations := v_declarations || 'v_cursor'|| i ||' sys_refcursor;' || chr(10);
        v_opens := v_opens || 'open v_cursor' || i || ' for select * from dual;';
    end loop;

    v_sql :=
        'declare '||chr(10)||v_declarations||chr(10)||
        'begin'||chr(10)||v_opens||chr(10)||
        'dbms_lock.sleep(20);'||chr(10)||'end;';

    --Print for debugging.
    --dbms_output.put_line(v_sql);

    execute immediate v_sql;
end;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mặt nạ số &nls_parameter

  2. SQL - Trả về các hàng có hầu hết các kết quả phù hợp với cột

  3. Ẩn mật khẩu văn bản thuần túy với dòng lệnh sqlplus

  4. Làm thế nào để chuyển đổi múi giờ trong oracle?

  5. Oracle - Chuyển đổi các hàng thành cột