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 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
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自动监控数据库的主要内容,如果未能解决你的问题,请参考以下文章