C# 监控字段_shell自动监控数据库

1.方案概述

crontab调用shell脚本对多个oracle数据库进行sql查询,每个sql落地一个csv文件,内容保存一个月,自动生成下一个csv文件,查询结果中对不同的数据库使用唯一名称(TNS连接串)进行区分,并且有日期列(精确到秒)进行时间区分。

csv文件作为外部表的数据源,使用监控用户针对每个监控项建立相应的数据表,将查询结果导入到相应的数据表中,用sql查询语句方便快捷的做有针对性的检查,监控,算法,统计,报表等工作。

可以保留历史信息,方便进行对比和趋势分析,例如一月内活动会话数报表以及表空间一月内的增长趋势等。

监控数据可以给webapp调用,既然有了底层数据库数据,展现就很方便了,小到excel的线图饼图,大到H5 webapp,直观性展现都不再是问题。

2.脚本概述

本方案利用了oracle 12c版本以后sqlplus可以直接输出到csv文件的新特性,此新特性兼容10g、11g版本,即,只要做查询终端机器安装的oracle  database client是12c及以上版本,便适用本方案。

   shell脚本基于linux/unix平台,方案共涉及以下4项:

  • shell可执行程序:只有一个shell脚本,简单明了,便于修改派生演化版本。

  • 数据库连接信息:使用tns连接,既是sql连接串又作为数据库唯一标识符。

  • sql脚本:用于监控数据库各项指标的sql脚本,需要添加’数据库唯一标识符’和’检查日期’这两个功能字段。

  • 结果目录:存放查询结果的目录,查询结果以’脚本名’+’日期’加以区分。

3.脚本详情

3.1.多库单sql

##############################################################
#author:           zhangyu
#version:          V1.0
#MAIL:             zy4316@126.com
#certified:        on 10g 11g 12c 19c
#prerequest:       version of running client is 12c or later
#reference:        CSV report was supported from version 12

##############################################################

#!/bin/bash

#LOAD ENVIRMENTS FOR RUNNING
source ~/.bash_profile
dbc_dir=/app/oracle/db/dbmonitor/dbs
sql_dir=/app/oracle/db/dbmonitor/sqls
res_dir=/app/oracle/db/dbmonitor/res/res
chk_date=`date +%Y%m`
#LOAD SECRIPTS AND DATABASE CONNECTS
echo "WE HAVE QUERY SCRIPTS FOLLOWING :"
ls -l $sql_dir| awk '{print $9}'
echo
echo -n "PLEASE SELECT WHICH SQL_SCRIPT YOU WANT:"
read sql
echo
#STARTING FOR DATABASE QUERY
for i in `cat $dbc_dir/db_con_103`
do
dn=`echo $i|awk -F [@] '{print $2}'`
echo ...NOW QUERYING ON: $dn
sqlplus -S $i<SET LINESIZE 300
SET PAGESIZE 0
SET VERIFY OFF
SET TERMOUT OFF
SET ECHO OFF
SET FEEDBACK OFF
SET MARKUP CSV ON QUOTE OFF
SET HEADING OFF
alter session set nls_date_language = english;
alter session set nls_date_format = 'YYYYMMDD_HH24MISS';
define dn=$dn
SPOOL $res_dir/$sql.$chk_date.csv APPEND
@$sql_dir/$sql dn
exit;
EOF
done
echo
echo "QUERY WAS SUCCESSFULLY COMPLETED !"
exit

3.2.dbs目录

该目录存放数据库连接信息。

建议为监控用户设置专用的数据库账户,例如DBSNMP。

可以设置多个列表以适应不同数据库监控范围。

示例:

[oracle@vm1 dbs]$ ls
db_con_103  dbs_con1
[oracle@vm1 dbs]$ cat db_con_103
dbsnmp/dbsnmp@192.168.56.101:1521/ora19
dbsnmp/dbsnmp@192.168.56.101:1521/ora19a
dbsnmp/dbsnmp@192.168.56.101:1521/ora19b

3.3.sqls目录

该目录存放sql脚本

因为查询结果要包含数据库识别信息以及检查日期信息,平时常用的查询脚本要添加两个字段。

shell脚本运行时,可以调用指定的sql语句,例如做某一专项检查,例如DBA_USERS的检查;也可以同时调用多个sql语句,做全面的数据库巡检检查,例如全部调用日常巡检的所有脚本。

sql示例:

3.3.1.instance.sql

select
      '&dn' db_name
      ,sysdate chk_date
      ,instance_name
      ,instance_number
      ,version
      ,parallel
      ,host_name
      ,startup_time
      ,ROUND(TO_CHAR(SYSDATE-startup_time), 2) uptime
      ,status
from  v$instance
/

3.3.2.users.sql

SELECT
   '&dn' db_name
  , sysdate chk_date
  , username
  , account_status
  , created
  , expiry_date
  , default_tablespace
  , temporary_tablespace
  , profile                          
FROM
    dba_users
/

3.4.res目录

该目录存放查询结果,以脚本名+日期表示的csv文件。

同时该目录也作为外部表装载目录,需要在资料库里建立该路径的directory,同时赋权给监控用户。

3.4.1.instal.sql.csv

becfbee5ad1a753185d37412d23e2084.png

3.4.2.users.sql.csv

608cc3fdca71ec8cb49ed066d55c7e9c.png

4.用外部表

shell脚本生成的每个sql语句的日志是csv格式的,可以用年月前缀区分,比如202008,每一个月生成一个新的文件。

在oracle数据库建立外部表,直接装载csv文件进行查询,也可以ctas装进库里操作。

4.1.建立目录

SQL> create directory ext_data_dir as '/app/oracle/db/dbmonitor/res/res';
Directory created.
SQL> create directory ext_bad_dir as '/app/oracle/db/dbmonitor/res/bad';     
Directory created.
SQL> create directory ext_log_dir as '/app/oracle/db/dbmonitor/res/log';
Directory created.
SQL> grant read on directory ext_data_dir to zhyu;
Grant succeeded.
SQL> grant read on directory ext_bad_dir to zhyu;
Grant succeeded.
SQL> grant read on directory ext_log_dir to zhyu;
Grant succeeded.

4.2.建立外部表

4.2.1.ext_m_users

CREATE TABLE ext_m_users
   (   "DB_NAME" varchar2(35),
   "CHK_DATE" varchar2(35),
   "USERNAME" VARCHAR2(128),
   "ACCOUNT_STATUS" VARCHAR2(32),
   "CREATED" varchar2(35),
   "EXPIRY_DATE" varchar2(35),
   "DEFAULT_TABLESPACE" VARCHAR2(30),
   "TEMPORARY_TABLESPACE" VARCHAR2(30),
   "PROFILE" VARCHAR2(128)
   )
   ORGANIZATION EXTERNA
     (
       TYPE ORACLE_LOADER
       DEFAULT DIRECTORY ext_data_dir
       ACCESS PARAMETERS
       (
         records delimited by newline
      badfile ext_bad_dir:'empxt%a_%p.bad'
         logfile ext_log_dir:'empxt%a_%p.log'
         fields terminated by ','
         missing field values are null
         (DB_NAME,CHK_DATE,USERNAME,ACCOUNT_STATUS,CREATED,EXPIRY_DATE,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE,
         PROFILE)
       )
       LOCATION ('users.sql.202008.csv')
     )
     PARALLEL
     REJECT LIMIT UNLIMITED;

4.2.2.ext_m_instance

  CREATE TABLE ext_m_instance
   (    "DB_NAME" VARCHAR2(35 BYTE),
    "CHK_DATE" varchar2(35),
    "INSTANCE_NAME" VARCHAR2(16 BYTE),
    "INSTANCE_NUMBER" NUMBER,
    "VERSION" VARCHAR2(17 BYTE),
    "PARALLEL" VARCHAR2(3 BYTE),
    "HOST_NAME" VARCHAR2(64 BYTE),
    "STARTUP_TIME" varchar2(35),
    "UPTIME" NUMBER,
    "STATUS" VARCHAR2(12 BYTE)
   ) ORGANIZATION EXTERNAL
     (
       TYPE ORACLE_LOADER
       DEFAULT DIRECTORY ext_data_dir
       ACCESS PARAMETERS
       (
         records delimited by newline
         badfile ext_bad_dir:'empxt%a_%p.bad'
         logfile ext_log_dir:'empxt%a_%p.log'
         fields terminated by ','
         missing field values are null
         (DB_NAME,CHK_DATE,INSTANCE_NAME,INSTANCE_NUMBER,VERSION,PARALLEL,HOST_NAME,STARTUP_TIME,UPTIME,STATUS)
       )
       LOCATION ('instance.sql.202008.csv')
     )
     PARALLEL
     REJECT LIMIT UNLIMITED;

4.3.直接查询外部表

SQL> select * from ext_m_users;

5.方案优势

  • 可以利用分区表,历史表等保存每个数据库的历史监控信息。

  • 可以利用综合查询,生成每个数据库的配置信息。

  • 可以做专项数据库排查,例如查询所有数据库的scn headroom。

  • 可以做全库全项目巡检,例如调用常规巡检脚本中的几十项查询。

  • 如果有能力,可以做web展现,便于分析和报表输出。

6.shell演变

6.1.多库多sql

此shell循环读进数据库连接串,在每次一连接到数据库后,循环执行预定义的sql脚本,每个脚本生成一个csv文件,sql执行完后进入下一个数据库连接,同样循环执行sql脚本,查询结果追加到上面的csv文件。

############################################################################
#author:           zhangyu
#version:          V1.0
#MAIL:             zy4316@126.com
#certified:        on 10g 11g 12c 19c
#prerequest:       version of running client is 12c or later
#reference:        CSV report was supported from version 12
############################################################################
#!/bin/bash
#LOAD ENVIRMENTS FOR RUNNING
#please configure $ORACLE_HOME with 12 or 19 version
source ~/.bash_profile
dbc_dir=/app/oracle/db/dbmonitor/dbs
sql_dir=/app/oracle/db/dbmonitor/sqls
res_dir=/app/oracle/db/dbmonitor/res/res
chk_date=`date +%Y%m`
#STARTING FOR DATABASE QUERY
for i in `cat $dbc_dir/db_con_103`
do
dn=`echo $i|awk -F [@] '{print $2}'`
echo ...NOW QUERYING ON: $dn
sqlplus -S $i<SET LINESIZE 300
SET PAGESIZE 0
SET VERIFY OFF
SET TERMOUT OFF
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET MARKUP CSV ON QUOTE OFF
alter session set nls_date_language = english;
alter session set nls_date_format = 'YYYYMMDD_HH24MISS';
define dn=$dn
prompt --querying instance                 ...OK
SPOOL $res_dir/instance.sql.$chk_date.csv APPEND
@$sql_dir/instance.sql dn
SPOOL OFF
prompt --querying users                    ...OK
SPOOL $res_dir/users.sql.$chk_date.csv APPEND
@$sql_dir/users.sql dn
SPOOL OFF
prompt --querying tablesapce               ...OK
SPOOL $res_dir/tablespace.sql.$chk_date.csv APPEND
@$sql_dir/tablespace.sql dn
SPOOL OFF
exit;
EOF
done

7.流程图044d7ffc35a4c273529b71d605514a63.png

8.   查询结果

5d3cbe8d220a211a7c25713960a0879a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值