设计Oracle数据库上的作业监视
我有几个Oracle数据库,我的内部应用程序正在运行.这些应用程序同时使用dba_jobs和dba_scheduler_jobs.
我想编写监控功能:check_my_jobs,Nagios会定期调用它来检查我的工作是否一切正常. (它们正在运行吗?它是否已损坏?next_run_date是否已延迟?依此类推) 解决方案:由于我必须监视不同数据库上的作业,因此有两种实现解决方案的方法: >仅在一个数据库上创建监视功能和配置表,该数据库将使用数据库链接检查每个数据库上的作业. 优点:集中功能,易于维护. 专业人士:我不必使用数据库链接 哪种解决方案更好? 解决方法我选择#1选项 – 使用数据库链接的集中功能.数据库链接的名声不好.其中一个主要原因是有太多人使用公共数据库链接,任何连接到数据库的人都可以使用该链接.这显然是一个安全噩梦,但它不是默认设置,很容易避免陷阱. 数据库链接的一些其他问题: >对于数百万行的大型插入,它们表现不佳.另一方面,他们在许多小型SELECT或INSERT中表现出色.在10年历史的硬件上,我经常有数百个链接同时打开和获取数据,而且效果很好. declare v_result varchar2(4000); begin --Loop through a configuration table of links. for links in ( select database_name,db_link from dbs_to_monitor left join user_db_links on dbs_to_monitor.database_name = user_db_links.db_link order by database_name ) loop --Run the query if the link exists. if links.db_link is not null then begin --Note the user of REPLACE and the alternative quoting mechanism,q'[...]'; --This looks a bit silly with this small example,but in a real-life query --it avoids concatenation hell and makes the query much easier to read. execute immediate replace(q'[ select dummy from dual@#DB_LINK# ]','#DB_LINK#',links.db_link) into v_result; dbms_output.put_line('Result: '||v_result); --Catch errors if the links are broken or some other error happens. exception when others then dbms_output.put_line('Error with '||links.db_link||': '||sqlerrm); end; --Error if the link was not created. --You will have to run: --create database link LINK_NAME connect to USERNAME identified by "PASSWORD" using 'TNS_STRING'; else dbms_output.put_line('ERROR - '||links.db_link||' does not exist!'); end if; end loop; end; / 尽管如此,数据库链接非常棒,因为您可以在一个数据库中完成PL / SQL中的所有操作.使用单一语言,您可以创建无代理监控解决方案,而无需担心安装和修复代理. 作为一个例子,我构建了开源程序Method5来使用数据库链接完成所有事情.安装该程序后,您可以从数百个数据库中收集结果,就像从表中运行select *(m5(‘select * from dba_jobs’));.该程序可能对您的方案有些过分,但它表明数据库链接是完整监控解决方案所需的全部内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |