我有几个Oracle数据库,我的内部应用程序正在运行。这些应用程序同时使用dba_jobs
和dba_scheduler_jobs
。
我想编写监视功能: 解决方案:由于我必须在不同数据库上监视作业,因此有两种实现解决方案的方法: 仅在一个数据库上创建一个监视功能和配置表,该数据库将使用数据库链接在每个数据库上查看作业。 优点:集中功能,易于维护。 在我想查看作业的每个数据库上创建一个监视功能和配置表。 PROS:我不必使用DB链接 哪种解决方案更好?check_my_jobs
,nagios会定期调用它,以检查我的工作是否还可以。(它们正在运行吗?它打破了吗?next_run_date被延迟了吗?
缺点:我必须使用数据库链接进行检查。
缺点:每个数据库上的重复监视代码
我将使用选项#1-使用数据库链接的集中式功能。
数据库链接具有不当的不良声誉。主要原因之一是,太多的人使用 public 数据库链接,与数据库连接的任何人都可以使用该链接。这显然是一场安全噩梦,但这不是默认设置,很容易避免陷阱。
数据库链接的其他一些问题:
- 他们在数百万行的大量插入物中表现不佳。另一方面,它们在许多小选择或插入物上都很棒。我经常在10年历史的硬件上同时开放和获取数据,而且效果很好。
- 他们使执行计划更难进行故障排除。
- 并非所有数据类型都受到本地支持。这在12.2中更好,但是在早期版本中,您需要使用插入物将数据类型(例如Clob(移至表格中,然后从这些表中读取。
- 对于DDL,您需要使用
DBMS_UTILITY.EXEC_DDL_STATEMENT@LINK_NAME('create ...');
确保仅在其中使用DDL。其他类型的命令将默默失败。 - 链接可能会在几种罕见情况下无限期地悬挂,例如数据库具有档案器错误或保证的还原点已满。(这确实是伪装的祝福 - 许多诸如Oracle Enterprise Manager之类的工具不会遇到这些问题。您可能需要进行背景工作检查数据库链接查询,该查询的运行时间超过X分钟。(
-
链接不应刻苦编码,否则它们可能使包裹无效。但这可能无关紧要 - 您可能需要循环浏览数据库列表,并使用动态SQL。而且,如果不存在链接,则很容易创建一个新的链接。这是一个例子:
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中的所有操作。用一种语言,您可以创建一个无代理监视解决方案,而不必担心安装和修复代理。
为例,我构建了开源程序方法5,以使用数据库链接来完成所有操作。安装了该程序后,您可以像运行select * from table(m5('select * from dba_jobs'));
一样从数百个数据库中收集结果。对于您的方案,该程序可能过于杀伤,但它表明数据库链接是完整监视解决方案所需的全部。