shell自动监控数据库

Posted godba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<<EOF
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




3.4.2.users.sql.csv


shell自动监控数据库

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<<EOF
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.流程图

8.   查询结果


以上是关于shell自动监控数据库的主要内容,如果未能解决你的问题,请参考以下文章

shell监控网站是否自动运行并自动重启原创

Linux下shell脚本监控Tomcat的状态并实现自动启动

99.Shell脚本自启程序并监控(实现全自动监控服务)

自动监控主从MySQL同步的SHELL脚本

shell:监控进程运行状态并自动重启进程

Linux基础之-利用shell脚本实现自动监控系统服务