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

时间:2022-05-04
本文章向大家介绍通过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即可。其实实现方式会更简便。主要的目的是借助这个脚本可以在中控机器上批量执行进行验证。