假期前的数据库检查脚本之主备关系(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)如果是多备库的情况,如果得到更具体的备库信息,比如同机房备库,异机房备库,这些就需要解析资产信息了。
- Elasticsearch推荐插件篇(head,sense,marvel)
- sql基础知识:日期的常用用法
- 《Effective Java》—— 对于所有对象都通用的方法
- 《Effective Java》—— 创建与销毁对象
- web调试工具——Fiddler使用介绍(一)
- Windows c++应用程序通用日志组件(组件及测试程序下载)
- 快速排序
- 如何在Elasticsearch中安装中文分词器(IK+pinyin)
- Python抓取中文网页
- 《Effective Java》—— 读后总结
- unix共享内存要点
- LAMP=Linux+Apache+Mysql+Php
- unix共享内存要点
- Elasticsearch —— bulk批量导入数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux中利用Vim对文件进行密码保护的方法详解
- Linux中禁止用户修改/重置密码
- 详解 MAC/Linux Vi配置环境变量及Java环境变量配置
- 扒开DMA映射的内裤
- 如何理解与识别Linux中的文件类型
- ubantu 16.4下Hadoop完全分布式搭建实战教程
- Linux定时删除日志的简单实现方法
- ubuntu如何安装中文输入法
- Ubuntu18.04安装Python虚拟环境
- linux下查看so或可执行程序的依赖库
- Linux中crontab输出重定向不生效问题的解决方法
- Ubuntu中安装MySQL更改默认密码的步骤详解
- linux下用csplit命令分割文件的方法示例
- Linux基础命令之mktemp详解
- CentOS7设置jar应用程序开机启动的方法