问题描述
我们最近将数据库从11.2.0.4升级到12.1.0.2。通过升级,我们注意到,在通过dbms_job提交作业之后,该过程可能需要5-30秒的时间才能在提交后真正开始执行。重现该问题的示例脚本如下:
这导致输出文件看起来像这样:
我知道job_queue_processes参数足够大,因为这是在数据库中运行的唯一作业,我在隐藏参数 _ job_queue_interval上找到了一些文档,但我不认为这是相关的,因为这个参数的值是5。
在12cR1中是否有任何更改会导致dbms_job队列的轮询长度增加?
create or replace procedure write_to_log(p_dir in varchar2,p_file_name IN VARCHAR2, p_msg IN VARCHAR2)
IS
l_file_handle UTL_FILE.FILE_TYPE;
l_log_file_path VARCHAR2(255);
l_file_name VARCHAR2(50) := p_file_name;
l_msg VARCHAR2(4000);
BEGIN
l_log_file_path := p_dir;
BEGIN
l_file_handle := UTL_FILE.FOPEN(l_log_file_path,l_file_name,'A');
EXCEPTION
WHEN UTL_FILE.INVALID_OPERATION
THEN
l_file_handle := UTL_FILE.FOPEN(l_log_file_path,l_file_name,'W');
END;
UTL_FILE.PUT_LINE(l_file_handle,'****** LOGGED: ' || to_char(sysdate,'mm/dd/yyyy hh24:mi:ss') || ' ********************');
UTL_FILE.FFLUSH(l_file_handle);
l_msg := SUBSTR(LTRIM(RTRIM(p_msg)),1,4000);
UTL_FILE.PUT_LINE(l_file_handle,l_msg);
UTL_FILE.FFLUSH(l_file_handle);
-- UTL_FILE.PUT_LINE(l_file_handle,'***************************************************************************');
-- UTL`_FILE.FFLUSH(l_file_handle);
UTL_FILE.FCLOSE(l_file_handle);
EXCEPTION
WHEN OTHERS THEN
UTL_FILE.FCLOSE(l_file_handle);
END;
/
create or replace procedure print_time
is
begin
write_to_log('UTL_FILE_DIR','AARON_DBMS_JOB.log',to_char(sysdate, 'DS TS') || ' - IN PRINT TIME BEFORE SLEEP');
dbms_lock.sleep(5);
write_to_log('UTL_FILE_DIR','AARON_DBMS_JOB.log',to_char(sysdate, 'DS TS') || ' - IN PRINT TIME AFTER SLEEP');
end;
/
declare
l_job number;
begin
dbms_job.submit(l_job, 'print_time;');
write_to_log('UTL_FILE_DIR','AARON_DBMS_JOB.log',to_char(sysdate, 'DS TS') || ' - SUBMITTED');
commit;
write_to_log('UTL_FILE_DIR','AARON_DBMS_JOB.log',to_char(sysdate, 'DS TS') || ' - COMMITTED');
end;
/
这导致输出文件看起来像这样:
****** LOGGED: 06/20/2017 17:49:36 ******************** 6/20/2017 5:49:36 PM - SUBMITTED ****** LOGGED: 06/20/2017 17:49:36 ******************** 6/20/2017 5:49:36 PM - COMMITTED ****** LOGGED: 06/20/2017 17:50:04 ******************** 6/20/2017 5:50:04 PM - IN PRINT TIME BEFORE SLEEP ****** LOGGED: 06/20/2017 17:50:09 ******************** 6/20/2017 5:50:09 PM - IN PRINT TIME AFTER SLEEP
我知道job_queue_processes参数足够大,因为这是在数据库中运行的唯一作业,我在隐藏参数 _ job_queue_interval上找到了一些文档,但我不认为这是相关的,因为这个参数的值是5。
在12cR1中是否有任何更改会导致dbms_job队列的轮询长度增加?
专家解答
我不知道,但是在各种版本的Oracle CJQ0进程 (唤醒并关注作业队列的进程) 中存在一些错误。
我会看看:
a) 跟踪CJQ0一段时间,以确保它不会挂起或旋转
b) 查看新的CJQ0是否解决了该问题,即
更改系统设置job_queue_process = 0;
从操作系统中杀死cjq0进程
alter system set job_queue_process = [previoor val];
应该启动一个新的CJQ0
如果这不起作用,是时候联系支持人员了
我会看看:
a) 跟踪CJQ0一段时间,以确保它不会挂起或旋转
b) 查看新的CJQ0是否解决了该问题,即
更改系统设置job_queue_process = 0;
从操作系统中杀死cjq0进程
alter system set job_queue_process = [previoor val];
应该启动一个新的CJQ0
如果这不起作用,是时候联系支持人员了
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




