码迷,mamicode.com
首页 > 数据库 > 详细

一次多个数据库tnsping及登录单点登录需求

时间:2018-07-28 21:51:19      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:循环输出   服务器   load   好的   单点登录   xls   inpu   描述   1.2   

【环境介绍】

  系统环境:Linux + Oracle 11.2.0.4.0 + python 2.7.10

 

【背景描述】

需求:因为涉及生产数据库较多,业务夸多个数据库使用。当收到业务有些影响时,数据库侧期间如果BOMC并没有马上收到相关的告警,那么如果要判断哪个数据库有问题时就只能很多数据库都查一遍。显然这样的命中率会很低同时时间也是比较长。对于这个问题有可能是网络问题太慢反映,同时要测试数据库连接是否正常。

 

【监控优化过程及思路】

对于上面描述的问题,还是比较清晰:

1,  数据库当前是否能连接。                                ----连接多个数据库查询数据库状态

2,  数据库连接没有问题,可能是网络问题。       ----使用tnsping进行判断网络

 

基于这两种方法,运用命令实现:

1,  多个数据库连接数据库运行SQL语句。          -----使用Python实现

2,  Tnsping监听判断网络。                                  -----使用Oracle自带Tnsping

 

【测试结果及脚本】

通过测试库测试脚本。然后在监控服务器进程测试,结果如下:

1,Python实现连接多个数据库查询数据库状态信息,最终结果截图如下:

2,Tnsping监听判断网络,最终结果截图如下:

 

 

【通用日志处理】

主要实现功能的脚本如下:

1,Python实现连接多个数据库查询数据库状态信息:

cat > select.py

# -*- coding:UTF-8 -*-

import xlsxwriter, cx_Oracle, sys

 

print(‘*‘ * 50)

print(‘NOTE: when you add sql_text,the ; sign is after the sql_text‘)

print(‘*‘ * 50)

 

reload(sys)

sys.setdefaultencoding(‘utf-8‘)

database_list = {

                        ‘xxxdb‘: ‘xj_exp_data/xxxxxx@172.xx.xx.xx/xxdb‘,

                          ……》》》省略部分IP内容

                 ‘xxxdb‘: ‘xj_exp_data/xxxxx@172.xx.xx.xx/xxxdb

                 }

                 》》》》连接数据库列表

sql=raw_input("Enter your sql_text: ");》》》提示输入SQL语句

while True:

   line=raw_input()

   if line==‘;‘:

       break

   sql = sql + ‘ ‘ +line

 

for d in database_list:

    print(‘*‘ * 50)

    print(d)

    conn = cx_Oracle.connect(database_list[d]) #connect database

    c = conn.cursor()  # get cursor

    x = c.execute(sql)  #sql_text 》》》》执行SQL语句

 

    row = x.fetchall()

    for r in row:

        print r》》》》进行循环输出结果

 

    c.close()

    conn.close()

 

Tnsping监听判断网络:

cat >tnsping_check.sh

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

# tnsping_check.sh

# This script is tnsping check

# Author CZT

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

#!/bin/sh

. ~/.bash_profile

####################tnsping function######################################

TNS_ECHO()

{

if [ `tnsping $1 | sed -n ‘$p‘ | awk ‘{print $1}‘` = OK ];then

  NowTime=`date +%T`

  avg_time=`tnsping $i $2 | grep OK | awk ‘{print $2}‘ | awk -F‘(‘ ‘{print $2}‘ | awk ‘{sum += $1};END{print sum/NR}‘`

  echo "$NowTime: tnsping against $name $i check OK $avg_time seconds"

else

  echo "$NowTime: tnsping against $name $i check ERROR"

fi

}

 

####################database ip list######################################

##crm_xxqd

arr_lis_xxqd=("172.xx.xx.xxx:1521" "172.16.xx.xx:1521" "172.16.xx.xxx:1521" "172.16.xx.xx:1521" "172.16.xx.xx:1521")

.........》》》省略IP列表信息内容

##other_xxxdb

arr_lis_xxxdb=("172.xx.xx.xx:1521" "172.xx.xx.xx:1521")

 

########################select database list########################

name=$1

#if [ !-n $1 ]

#then

#fi

 

case $name in

        ‘‘)

     name=$(uname -n)

     ;;

esac

 

  case $name in

  CRMDB-xxxDB|dzqd)

  for i in ${arr_lis_dzqd[*]}

  do

    TNS_ECHO $i $2

  done 

  ;;

  ……》》》》省略同样的部分内容

  help)

echo  ‘[usage:]          sh tnsping_check.sh yydb 100 ‘

echo  ‘[instance name]                  [type name]   ‘

echo  ‘xxxd                          -- CRMDB-xxxD   

……》》》省略部分重复内容‘

echo  ‘xxxdb                        -- OTHER-xxx3DB  ‘

  ;;

  esac

 

 

【问题思考】

1,  对于脚本的选择和方式要根据方便的需求和对目标的本身进行结合,比如tnsping是数据库自带的功能,从而更好的实现各种需求功能。

2, 对于tnsping的脚本中的一个延迟标准制定,需要结合业务和实际的网络情况来制定阈值对业务的影响;

3, 对于数据库登录查询状态中,也可以用其他查询语句,有时需要查询多个数据库的信息,可以更好的实现批量查询信息的需求。

 

【总结】:

1,  对数据库自带功能要有很好的了解,必能事半功倍;

2,  对于网络延迟问题,制定阈值是对功能效果的体现,不然只是数据查询而已;

3,  对于实现功能的语言有很多总,选择正确的语言实现,对跨平台部署有很多的帮助。

一次多个数据库tnsping及登录单点登录需求

标签:循环输出   服务器   load   好的   单点登录   xls   inpu   描述   1.2   

原文地址:https://www.cnblogs.com/zetanchen/p/9383256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!