通过shell脚本批量验证dataguard的有效性(r7笔记第96天)

我们假设一个场景,当你接触到一个新的环境,我们需要了解这个数据库是否为RAC,是否有备库。 如果有备库,那么问题来了,如果想去验证备库的状态是否有效,是否及时应用了数据变更。怎么查看呢。常规的思路是我们登录到主库使用dg broker,如果得到dg broker验证的状态为SUCCESS,在11g中我们认为备库的状态是ONLINE就是达标了,如果在10g,还不能完全说明备库没有问题。如果有一 主两备的情况,怎么查看每个备库的日志更新情况呢,我们需要使用show database verbose xxx的方式去查看更新的进度,是否有延迟,当然在这个基础上我们要查看这个备库是在哪台服务器上,使用哪个端口和主库进行交互等等,这些似乎需要一连串 熟练的命令才能搞定。 如果有100个主库,出一个难题,有的主库是一拖一,有的是一拖二,怎么判断其中的一部分备库在同一台服务器上?这种情况其实通过简单的元数据管理似乎还是很难定位,有兴趣可以琢磨一番。 当然我的意图不在于此,我是希望通过一个命令或者一个脚本把上面的这些手工工作都完成。 比如输出的结果类似下面的形式。

RAC   LOG_MODE      INST_ID INSTANCE_NA HOST_NAME       VERSION         STATUS   STARTUP_TIME
----- ---------- ---------- ----------- --------------- --------------- -------- ------------------------
NO    ARCHIVELOG          1 test0       stest0.test.com 11.2.0.3.0      OPEN     02:33:38 14-APR-15
      ,PRIMARY
.
ORACLE_HOME is:/U01/app/oracle/product/11.2.3/db_1
stest032 - Primary database   SCN:348:CURRENT
.
stest0 - Physical standby database
  Intended State:  APPLY-ON
  Transport Lag:   0 seconds
  Apply Lag:       0 seconds
HOST =stcard2.test.com
PORT = 1531
SERVICE_NAME = test0
.
s2test0 - Physical standby database
  Intended State:  APPLY-ON
  Transport Lag:   50 minutes 47 seconds
  Apply Lag:       50 minutes 47 seconds
HOST =s2test0.test.com
PORT = 1531
SERVICE_NAME = test0

通过这个输出我们很清晰的看到这是一主两备的情况,备库2 存在一定的延迟应用。主库的SCN为348,数据库是在最近启动的,备库对应的主机,开放的端口也都是一目了然。 所以这也是一种细小的改进。 我们可以通过如下的脚本来实现上面的输出效果。在10g,11g中测试效果能够达到预期。

function get_pri_info
{
sudo su -l oracle <<EOS
sqlplus -s / as sysdba 
REM ------------------------------------------------------------------------
set pagesize 20
set feedback off
set verify off
set head on
alter session set nls_date_format='HH:MI:SS DD-MON-YY';
col host_name for a15
col instance_name format a11
col version format a15
col status format a8
col RAC for a5
col log_mode format a10
col platform_name format a16
set lines 150
PROMPT
--PROMPT --------------- Instance  general information ------------------
select (select decode(value,'TRUE','YES','NO')from v\$option WHERE Parameter = 'Real Application Clusters') RAC,
       (select log_mode||','||database_role from v\$database where rownum<2)log_mode,
       --(select platform_name from v\$database where rownum<2)platform_name,
inst_id, instance_name, host_name, version, status, startup_time
from gv\$instance
order by inst_id;
EOS
}

function get_pri_seq
{
sudo su  -l oracle <<EOS
sqlplus -s / as sysdba
set feedback off
set pages 0
select 'SCN:'||sequence#||':'||status from v\$log where STATUS='CURRENT';
EOS
}

function get_oracle_home
{
cat /etc/oratab | tail -1 | awk -F: '{print $2}'
}

function get_tns_std
{
sudo su -l oracle<<EOF
$ORACLE_HOME/bin/tnsping  $1  |sed 's/(/\n/g'|sed 's/)/\n/g'|grep -i 'HOST\|PORT\|SERVICE_NAME\|SID_NAME' 
EOF
}

function dgmgrl_verbose
{
sudo su -l oracle << EOF
dgmgrl / "show database verbose "$1|grep 'Transport Lag\|Apply Lag\|Intended State'
EOF
}
get_pri_info
pri_seq_no=`get_pri_seq`
ORACLE_HOME=`get_oracle_home`
echo .
echo 'ORACLE_HOME is:'$ORACLE_HOME

std=`sudo su -l oracle <<EOS
dgmgrl  -silent / " show configuration"
EOS`
pri_db=`echo "$std"|grep "Primary database"|tail -1`
std1=`echo "$std"|grep "Physical standby database"|tail -2|head -1`
std2=`echo "$std"|grep "Physical standby database"|tail -1`

echo $pri_db " " $pri_seq_no
echo .
if [[ $std1 = $std2 ]]; then
  std2=''
  echo .
  echo $std1
  dgmgrl_verbose $std1
  get_tns_std $std1
else
  echo $std1
  dgmgrl_verbose $std1
  get_tns_std $std1
  echo .
  echo $std2
  dgmgrl_verbose $std2
  get_tns_std $std2
fi

如果在本地环境的oracle用户去掉那个sudo即可。其实实现方式会更简便。主要的目的是借助这个脚本可以在中控机器上批量执行进行验证。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2016-02-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

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

快过年了,很多系统都要进入最后的检查和复验阶段,一方面在节假日前,提前发现问题总比过节的时候发现要好。另一方面如果出现故障的时候能及时进行处理,这个时候我们就需...

298100
来自专栏24K纯开源

CoCreateInstance调用返回代码0x80040154的一种解决方法

引言       前面的一篇博文中总结了开发Windows Thumbnail Handler的一些经验。在公司实际项目中,需要同时针对图片和视频实现缩略图。同...

458100
来自专栏以南小隐-数通那些事儿

IOL镜像导入篇《GNS3 2.1.3 环境搭建系列教程四》

1.1K30
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch推荐插件篇(head,sense,marvel)

安装head head插件可以用来快速查看elasticsearch中的数据概况以及非全量的数据,也支持控件化查询和rest请求,但是体验都不是很好。 一般就用...

35770
来自专栏北京马哥教育

运维工具箱

运维精简工具箱 Bootstrapping:  Kickstart、Cobbler、rpmbuild/xen、kvm、lxc、 Openstack、 Clou...

524100
来自专栏FreeBuf

初窥卡巴斯基ARK读取MBR

LONG LONG LONG AGO就发现通过Hook磁盘端口驱动程序中的IRP_MJ_SCSI派遣函数方式过不了KB了,最近又遇到这个问题就想借此机会分析一下...

11560
来自专栏极客编程

Java为Hyperledger Fabric(超级账本)开发区块链链代码智能合约之环境部署

您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用。本教程将帮助大家解惑。我将分步展示如何使用 Hyperledger Fabric v0.6 来...

25120
来自专栏FreeBuf

Cisco Linksys无线路由固件安全分析与后门研究

最近我对嵌入式设备安全方面比较感兴趣,所以我决定找点东西练练手,于是我在淘宝上搜了一下,发现Linksys WRT54Gv5无线路由比较流行,决定就拿这个下手了...

33950
来自专栏Android源码框架分析

Android进程保活-自“裁”或者耍流氓

本篇文章是后台杀死系列的最后一篇,主要探讨一下进程的保活,Android本身设计的时候是非常善良的,它希望进程在不可见或者其他一些场景下APP要懂得主动释放,可...

64310
来自专栏Golang语言社区

从零开始创建一个基于Go语言的web service

20个小时的时间能干什么?也许浑浑噩噩就过去了,也许能看一些书、做一些工作、读几篇博客、再写个一两篇博客,等等。而黑客马拉松(HackAthon),其实是一种自...

52890

扫码关注云+社区

领取腾讯云代金券