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

对于备库的使用,尤其是一主多备的环境,一直以来有一点感觉不大给力,那就是主备库的关系,总是感觉会少一点什么。
尤其是在做月度404审计的时候,总是要反复确认备库的IP。如果是手工管理的场景中,基本就是查看log_archive_config的配置,也还需要解析里面的TNS配置
如果配置了DG Broker,可能情况会好些,输出的关系是还是比较清楚的。
Configuration - dg_test
  Protection Mode: MaxPerformance
  Databases:
    test   - Primary database
    stest1 - Physical standby database
    stest2 - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
但是这里有个问题就是备库的IP是哪个,可能tnsping的结果是主机名的情况,那么还需要再转义一次,到/etc/hosts里面去匹配。
这样下来,其实这些工作有多难,还真没有,但是重复的手工操作太多,实在让人感觉有种鸡肋的味道。
既然搭建Data Guard都能实现半自动化了,这个功能不实现还是有些说不过去。
这个输出应该把备库的主机名,IP都罗列出来,如果只是配置了IP,就显示IP和数据库的db_unique_name并列
这样一个数据库的大体情况就会一目了然,包括一些必备的参数等。
而运行脚本只需要输入主库的IP即可
比如sh checkdb2.sh 10.127.xxx.xx
改进后的输出类似下面的形式:
10.127.xxx.xx
.
  Databases:
    test   - Primary database
    stest1 - Physical standby database
    stest2 - Physical standby database
.
10.127.133.16  stest1.cyou.com   stest1
10.127.2.3    stest2.cyou.com   stest2

NAME                 DB_UNIQUE_NAME       DATABASE_ROLE    FORCE_LOGG
-------------------- -------------------- ---------------- ----------
TEST                 test                 PRIMARY          YES

NAME                           VALUE
------------------------------ --------------------------------------------------
db_file_name_convert
db_name                        test
db_unique_name                 test
dg_broker_start                TRUE
local_listener                 TEST
log_file_name_convert
standby_file_management        AUTO

checkdb2.sh的脚本内容如下:
base_dir=/U01/oracle/auto_dg
ip=$1

. ${base_dir}/autodg.cnf
echo $ip
ORACLE_HOME=`ssh $ip "cat /etc/oratab | tail -1 | awk -F: '{print \\$2}'"   2>&1 `
ssh $ip "mkdir -p /home/oracle/auto_dg/scripts"
scp -r ${base_dir}/scripts/* $ip:/home/oracle/auto_dg/scripts >/dev/null 2>&1
ssh $ip " sh /home/oracle/auto_dg/scripts/getdbinfo.sh"   2>&1 |grep -v stty

这个脚本本身逻辑很简单,关键是两个辅助脚本。
一个是getdbinfo.sh,脚本在/home/oracle/auto_dg/scripts下
内容如下:
. /home/oracle/.bash_profile
chown -R oracle:oinstall /home/oracle/auto_dg

sudo su -l oracle <<eof
echo .
dgmgrl -silent / " show configuration"  |grep  -i database

echo .
sh /home/oracle/auto_dg/scripts/get_dg_host.sh
EOF

sudo su -l oracle <<eof
sqlplus -s / as sysdba <<eos
col name format a20
col DB_UNIQUE_NAME format a20
col force_logging format a10
col value format a50
set linesize 150
set feedback off
select name,db_unique_name,database_role,force_logging from v\\\$database;
col name format a30
select name,value from v\\\$parameter where upper(name) in ('DB_NAME','DB_UNIQUE_NAME','LOCAL_LISTENER','DG_BROKER_START','STANDBY_FILE_MANAGEMENT','DB_FILE_NAME_CONVERT','LOG_FILE_NAME_CONVERT') order by name;
EOS
echo .
tnsping $1|grep ADDRESS|sed 's/Attempting to contact //' > /home/oracle/auto_dg/tns_port.lst
EOF

而最为关键的脚本则是get_dg_host.sh,脚本内容如下:

for tmp_ins in `dgmgrl -silent / " show configuration"  |grep  -i "Physical standby database"|sed 's/Physical standby database//g'|sed 's/-//g'`
do
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=`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 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  ${tmp_host} /etc/hosts|awk '{print $1}'`" " ${tmp_host} " " ${tmp_ins}
else
echo 'NEED TO CHECK HOST '${tmp_host}
fi
done
这个脚本里面会做复杂的校验,最终能够生成我们期望的数据行。

</eos
</eof
</eof

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

使用shell脚本快速得到主备关系的相关文章

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

   快过年了,很多系统都要进入最后的检查和复验阶段,一方面在节假日前,提前发现问题总比过节的时候发现要好.另一方面如果出现故障的时候能及时进行处理,这个时候我们就需要有一个尽可能全面的元数据收集.而且还有一点比较重要的就是工作交接,如果你临时有事,需要让同事来代劳,你得提供清晰易懂的信息给他们.    可能有的同学会觉得我们已经有了数据库监控,基本的性能分析,这个工作是不是就可以忽略了.监控只是标记状态,出现问题时候它没法帮你处理,还是需要人工介入,而人工介入尽可能全面的信息就是这些元数据了,

Shell脚本快速部署Kubernetes集群系统

  本文紧跟上节所讲的手动部署Kubernetes管理Docker篇所写,本篇主要内容利用Shell脚本完成快速部署Kubernetes集群.上节博文看过的朋友也能感觉到部署过程相对比较简单,那么,出于简化工作流程,推进运维自动化角度来说,于是花了2/3天时间写这个部署Kubernetes脚本.   运维工作中,常常会遇到部署各种各样的服务,建议:常规部署都应该尽量使用脚本完成,一方面提高自身脚本编写能力,另一方面推进运维自动化. 详细部署说明文档:http://lizhenliang.blog

用Shell脚本快速搭建Ubuntu下的Nodejs开发环境_linux shell

nodejs的确是很火,以前倒腾过,但是从来没有认真记录下什么.在ubuntu下搭建它的开发环境尝尝鲜,有一个捷径,它能让系统自动帮你安装所需要的东西,我们生成一段shell脚本,让它来完成以下工作: 安装 git下最新的node,node包管理器,Forever和Cloud9IDE工具(可选),mongodb 10gen:注:脚本的正常运行需要比较新版本的Ubuntu,而且需要联网,因为它会连接网络去下载所有的依赖包顺序安装. 1.脚本代码: 复制代码 代码如下: #!/bin/shecho

通过shell脚本快速定位active session问题

如果你得到反馈,数据库突然间性能下降了好多,希望你能够尽快的定位出问题来,有一些思路和方法可以参考.分别从数据库层面,系统层面来定位,但是个人感觉而言还是不够快和准. 因为绝大多数的问题都是由于active session导致的,所以我们的注意力集中在ash是比较合理的.ASH在这个时候就是一个利器,通过它能够得到几乎实时的数据库变化. 相比而言我们通过ashrpt得到ash的报告来诊断问题理论上可行,但是有个缺点就是不够直观.报告里面的描述着实很详细,有时候是有优点有时候可能就是缺点. 公司的

Linux通过shell脚本创建SVN版本库简化创建过程

  Linux每次建立SVN版本库的过程都非常麻烦,如果将这些通过shell脚本来实现的话会简单很多,那么这个shell脚本要如何编译呢?下面小编就给大家介绍下Linux利用shell脚本创建SVN版本库的方法. 每次建立一个新的SVN版本库总感觉很繁琐,所以写了段脚本来把这个过程自动化,详细代码如下: #!/bin/bash # by www.111cn.net echo -n "Enter SVN name :" read svn_name /usr/bin/svnadmin cr

SED单行脚本快速参考中文版(Unix 流编辑器)_linux shell

英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) 原标题:HANDY ONE-LINERS FOR SED (Unix stream editor) 整理:Eric Pement - 电邮:pemente[at]northpark[dot]edu 版本5.5 译者:Joe Hong - 电邮:hq00e[at]126[dot]com 在以下地址可找到本文档的最新(英文)版本: http://sed.sourceforge.net/

SED单行脚本快速参考(流编辑器)第1/2页_linux shell

sed (stream editor) 功能说明:利用script来处理文本文件.语法:sed [-hnV][-e<script>][-f<script文件>][文本文件]补充说明:sed可依照script的指令,来处理.编辑文本文件.参数:-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件.-f<script文件>或--file=<script文件> 以选项中指定的scr

《构建高可用Linux服务器 第3版》—— 3.6 生产环境下的Shell脚本分类

3.6 生产环境下的Shell脚本分类 生产环境下的Shell脚本作用还是挺多的,这里根据3.1节所介绍的日常工作中Shell脚本的作用,将生产环境下的Shell脚本分为备份类.监控类.统计类.开发类和自动化类.前面3类从字面意义上看比较容易理解,后面的我稍微解释一下:开发类脚本是用Shell来配合PHP做一些非系统类的管理工作,比如SVN的发布程序等:而自动化类脚本则利用Shell自动来替我们做一些繁琐的工作,比如自动生成及分配密码给开发组的用户或自动安装LNMP环境等.下面我会就这些分类举一

运维前线:一线运维专家的运维方法、技巧与实践3.3 利用批处理与Shell脚本简化逻辑节点的搬迁

3.3 利用批处理与Shell脚本简化逻辑节点的搬迁 3.3.1 逻辑节点切换脚本的思路 众所周知,对于服务器的搬迁,不只会涉及物理层面的设备搬迁.在物理设备搬迁到新机房后,往往还需要对虚拟机中的多种参数进行相关调整. 如果管理的服务器台数比较少的话,则可以采用手工设置的方式逐一更改参数.但是,如果手中管理的Windows和Linux虚拟机有数千台的话,那么这些繁琐的参数调整一定会让你头疼不已.其中需要调整的参数如下: IP GATEWAY DNS WSUS NTP HOSTS 也许大家要问,像