通過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即可。其實實現方式會更簡便。主要的目的是藉助這個指令碼可以在中控機器上批量執行進行驗證。
如果有備庫,那麼問題來了,如果想去驗證備庫的狀態是否有效,是否及時應用了資料變更。怎麼檢視呢。常規的思路是我們登入到主庫使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通過shell指令碼 批量新增使用者指令碼
- 通過shell指令碼批量操作mysql資料庫指令碼MySql資料庫
- 通過shell指令碼分析足彩指令碼
- 通過shell定製ash指令碼指令碼
- 通過shell指令碼檢視procedure的資訊指令碼
- 通過shell指令碼檢視package的資訊指令碼Package
- [ Shell ] 通過 Shell 指令碼匯出 CDL 網表指令碼
- 通過shell指令碼防止埠掃描指令碼
- 通過shell指令碼檢視鎖資訊指令碼
- 通過shell指令碼監控oracle session指令碼OracleSession
- [ Shell ] 通過 Shell 指令碼匯出 GDSII/OASIS 檔案指令碼
- 如何通過簡單的shell指令碼操作MongoDB指令碼MongoDB
- 通過shell指令碼得到資料字典的資訊指令碼
- 通過shell指令碼新增備庫日誌指令碼
- 通過shell指令碼來統計段大小指令碼
- shell指令碼批量操作使用者指令碼
- 通過shell指令碼檢測MySQL服務資訊指令碼MySql
- 通過shell指令碼快速定位active session問題指令碼Session
- 通過POWERDESIGER指令碼批量設定表主鍵指令碼
- 通過shell指令碼得到資料庫的基本資訊(一)指令碼資料庫
- 通過shell指令碼生成查詢表資料的sql指令碼SQL
- iOS使用shell指令碼批量修改屬性iOS指令碼
- 通過shell指令碼監控sql執行頻率指令碼SQL
- 通過shell指令碼定位效能sql和生成報告指令碼SQL
- 通過shell指令碼生成資料統計資訊的報表指令碼
- 通過shell指令碼抓取awr報告中的問題sql指令碼SQL
- 通過shell得到資料庫中許可權的指令碼資料庫指令碼
- MySQL 批量更新、刪除資料shell指令碼MySql指令碼
- iOS使用Shell指令碼批量修改類名稱iOS指令碼
- 通過shell指令碼監控日誌切換頻率指令碼
- linux下通過sql檔案批量操作指令碼樣本LinuxSQL指令碼
- 通過shell指令碼來得到不穩定的執行計劃指令碼
- 通過shell指令碼來檢視Undo中資源消耗高的sql指令碼SQL
- 透過shell指令碼分析足彩指令碼
- shell指令碼和python指令碼實現批量ping IP測試指令碼Python
- 使用shell批量生成資料整合式遷移的指令碼指令碼
- 《通過指令碼檢視哪些ip被佔用》shell筆記指令碼筆記
- 驗證資料庫中URL的有效性資料庫