最近有个监控项目需要采集数据库信息,原来方案是写个sql脚本,每个脚本放一个查询语句然后通过操作系统层su到oracle用户通过sqlpus执行这个.sql,然后加到crontab定时执行。但是这个问题有个弊端,就是建立的连接太多,假如每5分钟采集一次数据那意味着5分钟通过sqlplus登陆数据库再退出。后来想着怎么在数据库层每5分钟执行下查询而不是操作系统频繁的通过sqlplus登陆,具体思路写个存储过程通过存储过程把查询结果输出到指定的日志文件。再通过job定时调度。
1、建立dir授予相应权限
SQL> create or replace directory monitor as '/oracle/monitor';
SQL> grant read,write on directory monitor to system;
Grant succeeded.
SQL> grant read,write on directory monitor to sys;   
Grant succeeded.
2、创建procedure
SQL> create or replace procedure pro_inst_status as
  2    v_tmp         varchar2(60);
  3    v_out_file    utl_file.file_type;
  4    v_file_name   varchar2(30);
  5  begin
  6    v_file_name := 'inst_status.log';
  7    v_out_file := utl_file.fopen('MONITOR',v_file_name,'w');
  8    if (utl_file.is_open(v_out_file)) then  
  9       select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||',  '||instance_name||',  '||status
 10       into v_tmp from v$instance;
 11       utl_file.put_line(v_out_file, v_tmp);
 12    else
 13       raise_application_error(-20001,'Inst file Open Failure!');
 14    end if;
 15    utl_file.fclose(v_out_file);
 16  end pro_inst_status;
 17    /

Procedure created.
3、执行procedure
SQL> exec pro_inst_status;
BEGIN pro_inst_status; END;

*
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at "SYS.PRO_INST_STATUS", line 7
ORA-06512: at line 1
报错因为没有给dir建目录。开建。。
[root@recover ~]# cd /oracle/
[root@recover oracle]# mkdir monitor
[root@recover oracle]# chown -R oracle:oinstall monitor/

SQL> exec pro_inst_status;

PL/SQL procedure successfully completed.

SQL> exec pro_inst_status;

PL/SQL procedure successfully completed.
4、查看生成日志
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@recover oracle]$ cd monitor/
[oracle@recover monitor]$ ls -ltr
total 4
-rw-r--r-- 1 oracle oinstall 33 Aug 31 13:26 inst_status.log
[oracle@recover monitor]$ cat inst_status.log
2016-08-31 13:26:04,  idb,  OPEN
[oracle@recover monitor]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Wed Aug 31 13:27:17 2016
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> exec pro_inst_status;
PL/SQL procedure successfully completed.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@recover monitor]$ cat inst_status.txt
2016-08-31 13:27:21,  idb,  OPEN
[oracle@recover monitor]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Wed Aug 31 13:36:53 2016
Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
5、建job做定时作业
SQL> variable monitor_job number;
SQL> begin
  2  dbms_job.submit(:monitor_job,'pro_inst_status;',sysdate,'sysdate+1/288');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> desc dba_jobs
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 JOB                                       NOT NULL NUMBER
 LOG_USER                                  NOT NULL VARCHAR2(30)
 PRIV_USER                                 NOT NULL VARCHAR2(30)
 SCHEMA_USER                               NOT NULL VARCHAR2(30)
 LAST_DATE                                          DATE
 LAST_SEC                                           VARCHAR2(8)
 THIS_DATE                                          DATE
 THIS_SEC                                           VARCHAR2(8)
 NEXT_DATE                                 NOT NULL DATE
 NEXT_SEC                                           VARCHAR2(8)
 TOTAL_TIME                                         NUMBER
 BROKEN                                             VARCHAR2(1)
 INTERVAL                                  NOT NULL VARCHAR2(200)
 FAILURES                                           NUMBER
 WHAT                                               VARCHAR2(4000)
 NLS_ENV                                            VARCHAR2(4000)
 MISC_ENV                                           RAW(32)
 INSTANCE                                           NUMBER

SQL> select job, what from dba_jobs;

JOB WHAT
---------- ----------------------------------------------------------------------------------------------------
      4001 wwv_flow_cache.purge_sessions(p_purge_sess_older_then_hrs => 24);
      4002 wwv_flow_mail.push_queue(wwv_flow_platform.get_preference('SMTP_HOST_ADDRESS'),wwv_flow_platform.get
           _preference('SMTP_HOST_PORT'));

7 pro_inst_status;
         6 dbms_refresh.refresh('"I6000_SYS"."SYS_V_USERROLEORGRS"');

6、运行job
SQL> begin
  2  dbms_job.run(7);
  3  end;
  4   /

PL/SQL procedure successfully completed.

7、查看运行结果
[root@recover monitor]# tail -f inst_status.log
2016-08-31 13:45:45,  idb,  OPEN
tail: inst_status.log: file truncated
2016-08-31 13:50:45,  idb,  OPEN
tail: inst_status.log: file truncated
2016-08-31 13:55:46,  idb,  OPEN
tail: inst_status.log: file truncated
2016-08-31 14:00:46,  idb,  OPEN
tail: inst_status.log: file truncated
2016-08-31 14:05:46,  idb,  OPEN
tail: inst_status.log: file truncated
2016-08-31 14:10:46,  idb,  OPEN

Oracle定时查询结果输出到指定的log文件的更多相关文章

  1. oracle dblink 查询 tns:无法解析指定的连接标识符

    问题情景是这样的:我在数据库服务器(windows server 2008r2 ,64bit)oracle(11gr2,64bit)中通过dblink连接到另外一台服务器(hp-ux)的oracle( ...

  2. oracle 将查询结果输出到txt文件里

    在查询语句里先输入spool filepath 中间是需要查询的语句,最后spool off 就会把中间查询的结果都输入到file文件里 spool E:\log.txt; select id,nam ...

  3. Oracle 定时查询数据插入新表中(job+存储过程)

    create table EGMAS_COUNT_DATA(TIMES       date not null, COUNT NUMBER(30) not null, SYSTEM_NAME VARC ...

  4. 日志输出:控制台和log文件输出日志

    self_log.py 中 import os import logging import time # 如果日志文件夹不存在,则创建 log_dir = "log" # 日志存放 ...

  5. WinForm读取指定的config文件的内容

    config文件的使用 一.缘起 最近做项目开始使用C#,因为以前一直使用的是C++,因此面向对象思想方面的知识还是比较全面的,反而是因没有经过完整.系统的.Net方面知识的系统学习,经常被一些在C# ...

  6. Oracle生成查询包括对应于所有数据表记录语句中指定的字段名

    应用:已知的字段名,表中的所有数据的查询数据库中包含的所有数据表的字段名 操作方法:指定字段名,用户数据库表,它可以执行以下查询 --Oracle生成查询包括对应于所有数据表记录语句中指定的字段名 d ...

  7. Oracle生成查询包含指定字段名对应的所有数据表记录语句

    应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 de ...

  8. python操作oracle数据库-查询

    python操作oracle数据库-查询 参照文档 http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python- ...

  9. (转)Oracle定时执行计划任务

    Oracle定时执行计划任务 在日常工作中,往往有些事情是需要经常重复地做的,例如每天更新业务报表.每天从数据库中提取符合条件的数据.每天将客户关系管理系统中的数据分配给员工做数据库营销……因此我们就 ...

随机推荐

  1. 【转】 TechED2010与我(三) —— 初识云计算

    作者用到的比喻很好. 网址:TechED2010与我(三) -- 初识云计算 初识云计算最近"云计算"被炒的很热,但是由于工作重点主要是做WinForm的控件开发,对云计算的接触比 ...

  2. C#数据类型分类

    C#是强类型语言,所以在定义每一个变量.常量和对象的时候都必须声明该类型. C#数据类型分为值类型.引用类型和指针类型(指针类型很少用): C#数据类型还可以分为内置类型.匿名类型和自定义类型.

  3. yii 初步安装

    第一步: window下点击>开始 >运行CMD命令. 第二步:进入Yiic文件的目录   (例如在D盘里面 D:/yii/framework) 第三步:D:\yii\framework& ...

  4. python练手项目

    文本操作 逆转字符串--输入一个字符串,将其逆转并输出. 拉丁猪文字游戏--这是一个英语语言游戏.基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay(譬如"banan ...

  5. 《C与指针》第十三章练习

    本章例程 13.1类型无关的链表查找 #include <stdio.h> #include "node.h" Node *search_list(Node *node ...

  6. equals与==的区别

    equals与==的区别. 下面是equals的源码 public boolean equals(Object anObject) { if (this == anObject) { //如果两个对象 ...

  7. FZU-2075 Substring(后缀数组)

    Description Given a string, find a substring of it which the original string contains exactly n such ...

  8. 谈事件冒泡(Bubble)和事件捕捉(capture)

    事件的发生顺序 假设在一个元素中又嵌套了另一个元素并且两者都有一个onClick事件处理函数(event handler).如果用户单击元素2,则元素1和元素2的单击事件都会被触发.但是哪一个事件先被 ...

  9. 有关默认相机转VR相机

    呃...15年开篇~ 去年想写一个有关默认相机转VR相机的脚本,当时没写完,今天不小心翻到并写完了,而且思路也和原来完全不一样了,增加了是否删除原相机与是否转换所选相机的选项. 由于国内VR版本比较混 ...

  10. Quartz2D之生成圆形头像、打水印、截图三种方法的封装

    我给UIImage类添加了一个类目,用于封装三个方法,每个方法都没有难度,做这个主要为了练习一下封装: 首先在类目.h文件中声明三个方法:以及创建了一个枚举.用于水印方法中设定水印位置:方法说明和参数 ...