通過shell指令碼批量驗證dataguard的有效性

jeanron100發表於2016-02-01
我們假設一個場景,當你接觸到一個新的環境,我們需要了解這個資料庫是否為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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章