假期前的数据库检查脚本之主备关系(r11笔记第46天)

   快过年了,很多系统都要进入最后的检查和复验阶段,一方面在节假日前,提前发现问题总比过节的时候发现要好。另一方面如果出现故障的时候能及时进行处理,这个时候我们就需要有一个尽可能全面的元数据收集。而且还有一点比较重要的就是工作交接,如果你临时有事,需要让同事来代劳,你得提供清晰易懂的信息给他们。

  
可能有的同学会觉得我们已经有了数据库监控,基本的性能分析,这个工作是不是就可以忽略了。监控只是标记状态,出现问题时候它没法帮你处理,还是需要人工介入,而人工介入尽可能全面的信息就是这些元数据了,如果你们已经有了CMDB,那可能会简化很多工作,如果没有,也可以生成一个精简版的,在这个基础上能够故障自愈那就太好了。别着急,一口气吃个大胖子也不现实。

    之前也写了不少的脚本,自己也用了一些脚本完成了一些基本的检查任务,但是想得到一个简练的报告,这个工作现在还没有做好。比如对于节假日的问题处理分析,出现服务不可用,宕机类问题可能才是呼唤我们的时候。所以对于灾备的信息就尤其需要注意。

    先来看看目前的简单效果:

name                : ACCMOB0
db_unique_name      : s2accmob0
database_role       : PRIMARY
open_mode           : READ WRITE
version             : 11.2.0.3.0
Character set       : AL32UTF8
NCHAR Character set : AL16UTF16
10.11.2.145  s3accmob0.test.com   s3accmob0   1525
10.11.128.169  saccmob03.test.com   saccmob03   1525
   上面的输出就能够达到一个基本的效果,通过这些信息,我们就可以得到数据库的字符集,状态,对应的备库信息和IP,连对应的端口也抓到了,这个信息其实就比较简练了。

   实现这个脚本复杂不复杂呢,其实也没多少。

sqlplus -s  / as sysdba <<EOF
set pages 0
set feedback off
select rpad('name', 20, ' ') || ': ' || name || chr(10)||
       rpad('db_unique_name', 20, ' ') || ': ' || db_unique_name || chr(10)||
       rpad('database_role', 20, ' ') || ': ' || database_role || chr(10)||
       rpad('open_mode', 20, ' ') || ': ' || open_mode   
  from v\$database;
select rpad('version', 20, ' ') || ': ' || version
  from v\$instance;
select rpad(description, 20, ' ') || ': ' || property_value
  from database_properties
 where property_name in ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
EOF
for tmp_ins in `dgmgrl -silent / " show configuration"  |grep  -i "Physical standby database"|sed 's/Physical standby database//g'|sed 's/-//g'`
do

tmp_tns=`dgmgrl -silent / " show database verbose ${tmp_ins}"  |grep StaticConnectIdentifier|awk '{print $3}'`
echo $tmp_tns

tmp_host=`echo ${tmp_tns}|grep ADDRESS|sed 's/Attempting to contact //'|sed 's/(/\n/g'|sed 's/)/\n/g'|grep -i 'HOST\|PORT\|SERVICE_NAME\|SID_NAME' |grep -i HOST| awk -F= '{print $2}'`
#tmp_host=`tnsping ${tmp_ins}|grep ADDRESS|sed 's/Attempting to contact //'|sed 's/(/\n/g'|sed 's/)/\n/g'|grep -i 'HOST\|PORT\|SERVICE_NAME\|SID_NAME' |grep -i HOST| awk -F= '{print $2}'`
#echo ${tmp_host}
tmp_port=`echo ${tmp_tns}|grep ADDRESS|sed 's/Attempting to contact //'|sed 's/(/\n/g'|sed 's/)/\n/g'|grep -i 'HOST\|PORT\|SERVICE_NAME\|SID_NAME' |grep -i PORT| awk -F= '{print $2}'`
#echo ${tmp_port}
tmp_con_chk=`nc -w 1 -v ${tmp_host} ${tmp_port}`
#echo ${tmp_con_chk}
if [[ ${tmp_con_chk} =~ "succ" ]]; then
    echo  `grep  -w ${tmp_host} /etc/hosts|awk '{print $1}'`" " ${tmp_host} " " ${tmp_ins} " " ${tmp_port}
else
  echo 'NEED TO CHECK HOST '${tmp_host}
fi
done

◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆

这里有几点需要指出:

1)得到备库的信息,目前是基于DG Broker来抓取的,但是有的服务器可能配置了主机名,有的配置了IP,就需要根据情况来解析。

2)得到对应的服务器IP和端口,目前有三种实现方式,一种就是通过dgmgrl,使用show database verbose来得到连接串的信息,另外一种就是通过tnsping来得到,第3种是通过解析tnsnames.ora来得到。

上面的例子给出了前两种。

3)解析IP和端口后的网络情况是通过nc来实现的,nc这个命令比较好,可以设置超时时间,这个例子里面设置了1秒。

当然你说这个脚本看起来蛮有意思,你说有没有缺点呢,实在太多了,所以只是一个初版,会持续更新。

缺点有以下几个:

1)判断数据库的主备角色,这样就可以避免重复解析DG Broker中主备关系信息。

2)使用tnsping或者DG Broker中的show database verbose方式,如果多备库间的网络不通,会有超时的情况。不过这种概率较小,如果出现问题也需要我们及时修复

3)如果是多备库的情况,如果得到更具体的备库信息,比如同机房备库,异机房备库,这些就需要解析资产信息了。

 

时间: 2024-09-29 05:02:43

假期前的数据库检查脚本之主备关系(r11笔记第46天)的相关文章

假期前的数据库检查之主动优化

快要过年了,很多工作都会放下来,很多计划都会搁置下来,节前的检查还是必要的,尤其是那些看似不起眼的问题尤其需要注意.今天就处理了一起,也算是假期前的性能优化临门一脚. 一.一个不经意的问题? 做例行检查的时候,我基本会看看大体的DB time情况,是否有较大的抖动,归档频率是否频繁,近期是否有监控报警等,当然很多细则不需要一个一个去确认,打开Zabbix里面的zatree或者监控概览列表就能得到不少的信息了,或者跑个批量脚本也能得到不少信息. 我查看了一个套数据库环境,DB time看起来很低,

巧用shell生成数据库检查脚本

在生产环境中需要部署大量的数据变更.对于新增的表,需要注意权限和同义词等.但是手动去检查这些变更是否生效就很麻烦.而且也不易维护,比如写好了一个脚本,可能在过一段时间,有一些紧急变更,需要把这些变更加进来,可能就忘了更新检查脚本. 考虑到检查的性能,不想查询数据,只需要保证能够正常访问表即可.所以写了如下的sql.目标就是通过shell来生成这样的sql脚本. 比如对于表TEST,检查是否可以访问,如果可以访问,就显示表TEST is accessible... SELECT decode (c

使用shell脚本快速得到主备关系

对于备库的使用,尤其是一主多备的环境,一直以来有一点感觉不大给力,那就是主备库的关系,总是感觉会少一点什么. 尤其是在做月度404审计的时候,总是要反复确认备库的IP.如果是手工管理的场景中,基本就是查看log_archive_config的配置,也还需要解析里面的TNS配置 如果配置了DG Broker,可能情况会好些,输出的关系是还是比较清楚的. Configuration - dg_test   Protection Mode: MaxPerformance   Databases:   

Oracle数据库端口突然无法访问的分析(r12笔记第46天)

 最近碰到一个蛮有启发意义的案例.是数据库监听相关的,但是实际的原因却又出乎意料.  问题的反馈受益于开发同学,一个开发同学在lync上找到我,说现在一个线上业务的数据库访问有些问题,想问问我是否有什么建议.大体了解了下,他们在使用一个非1521的端口,比如端口是1525,他们在业务端看到的错误信息类似下面的样子: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection

云数据库Redis版主从热备高可用方案

引言 高可用(High Available)是线上生产环境所必不可少的重要条件,阿里云数据库Redis版作为一款成熟稳定的数据库产品,针对Redis的特性也支持高可用,本文将介绍云Redis是如何实现这一方案. 架构 目前云Redis有主从版和集群版两种架构,本次主要针对主从版做HA的解析. 下图为主从版架构: 由图可知,云Redis实例有主备两个节点,平时只有Master提供服务,Slave只做热备不提供访问,Slave通过slaveof命令挂载到Master上,不断从Master接收数据,保

[20170515]检查数据库scn脚本.txt

[20170515]检查数据库scn脚本.txt --//简单写一个脚本检查数据库各个scn的大小: column TABLESPACE_NAME format a20 SELECT b.file#       ,b.name       ,c.STATUS       ,c.FUZZY       ,a.checkpoint_change# "数据库记录的scn"       ,b.checkpoint_change# "控制文件记录的开始scn"       ,

Ubuntu Server下MySql数据库备份脚本代码

说明: 我这里要把MySql数据库存放目录/var/lib/mysql下面的pw85数据库备份到/home/mysql_data里面,并且保存为mysqldata_bak_2012_04_11.tar.gz的压缩文件格式(2012_04_11是指备份执行时当天的日期), 最后只保留最近7天的备份. 实现步骤: 1.创建保存备份文件的目录:/home/mysql_datacd /home #进入目录 mkdir mysql_data #创建目录2.创建备份脚本文件:/home/mysql_data

主键自增-数据库如何实现某主键以另一自增主键id为前缀自增

问题描述 数据库如何实现某主键以另一自增主键id为前缀自增 比如说,建立比赛和队伍两个表,想让队伍id在这个队伍参加的比赛的id前实现自增.有什么办法?顺便问一下,数据库操作入门有什么好的推荐吗?只掌握基础的增删改查-T-T希望大家帮我一下,谢谢大家 解决方案 你查询的时候, select (队伍id + 比赛id) as 编号 from 表 解决方案二: 如果这样,没有必要写在数据库中,增加数据冗余,只要查询的时候拼接就可以了. 解决方案三: 关于资料,自己google下有很多,关键是没有说你

Ubuntu Server下MySql数据库备份脚本代码_Mysql

说明: 我这里要把MySql数据库存放目录/var/lib/mysql下面的pw85数据库备份到/home/mysql_data里面,并且保存为mysqldata_bak_2012_04_11.tar.gz的压缩文件格式(2012_04_11是指备份执行时当天的日期), 最后只保留最近7天的备份. 实现步骤: 1.创建保存备份文件的目录:/home/mysql_datacd /home #进入目录mkdir mysql_data #创建目录2.创建备份脚本文件:/home/mysql_data/