通过shell脚本批量验证dataguard的有效性

我们假设一个场景,当你接触到一个新的环境,我们需要了解这个数据库是否为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即可。其实实现方式会更简便。主要的目的是借助这个脚本可以在中控机器上批量执行进行验证。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-1985413/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23718752/viewspace-1985413/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值