前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过shell脚本批量验证dataguard的有效性(r7笔记第96天)

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

作者头像
jeanron100
发布2018-03-19 10:53:49
6820
发布2018-03-19 10:53:49
举报

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

代码语言:javascript
复制
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中测试效果能够达到预期。

代码语言:javascript
复制

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即可。其实实现方式会更简便。主要的目的是借助这个脚本可以在中控机器上批量执行进行验证。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档