2012年11月29日 星期四

第二十四回 dbv 和 backup validate

上上週小弟一個系統在  v$database_block_corruption 中出了幾個 corruption list ,找出了所在位置的物件,問了開發者,是個不重要的 table ,因此就只做將之 truncate 掉後就沒有再理會。

但是之後雖然每天的備份都成功,但是 v$database_block_corruption 中的 list 卻不會被清除,因為該空間雖然己經歸還給系統,但是在該 datafile 使用 dbv 去驗證時還是會出現有 corruption block 的現象,除非有人重新使用這塊空間,系統才會將之 format 。在之後的備份的驗證才不會重新被驗證到。證明該 block 己經是良好的 block 。

開了 SR 後, Support 要我依照 336133.1的引導,具體說來,該份文件就是指導你如何暫時建立一個 dummy 物件將該空間使用掉後,由系統 FORMAT 後,在下次的 backup validate 或者是備份成功後,就會由 v$database_block_corruption 的 list 裏消失,雖然我一開始只有 truncate table 的方式也是可以,但是該 list 除非在重新被使用到之前,區塊損壞的記錄是不會消失的。

所以我就依據文件的引導,指定了一個 table 到該損壞的 datafile 去讓他成長,文件提供了一個 trigger ,可以直接在做 insert 動作時發現該 block 己被修復,事實上該 trigger 不建立,整個流程一樣是 work 的。

因為我 block corruption 的部份有數十個,如果有建立 trigger 的話,有可能會發生,只修了其中一部份區塊,但其餘區塊未被修復。所以第二次 test run 時,我就沒建立 trigger 了。一直將 table 塞到滿為止。

後來使用 dbv 指令確認該檔案沒有損壞區塊後,再重新執行 backup validate datafile [number] ; 完成後,v$database_block_corruption 中的 list 就會被清除了。

2012年5月24日 星期四

第二十三回 SAP 系統主機變更筆記

因為有時有些需求,需要移動或複製一套 SAP 環境出來,目前己經做了好幾次,但不常做,所以筆記一下。

 OS 環境:確認有對應的 UID,GID,和 Username , Group Name , Home Directory 下必須有對應的 Profile 及 ENV
DB 環境:確認資料庫完整複製且可正常啟動,當然包含 ORACLE_HOME 及 SAP 相關的檔案結構。
SAP 環境:確認 /sapmnt 及 /usr/sap 下目錄有完整

因應 Hostname 變更的修改 /etc/host 下需要有變更後 hostname 的 Entry /etc/services 下需要新增對應的 sapMS 記錄,不然啟動時 Message Server 會找不到

以下列指令分別在 /home /usr/sap /sapmnt 下找出所有檔名包含舊 hostname 在內的檔案
find . –name '*old_hostname*'

找到後,將舊名部份 mv 為新名稱

以下列指令分別在 /home /usr/sap /sapmnt 下找出所有檔案內容包含舊 hostname 在內的檔案
find . -type f | xargs grep old_hostname|egrep -v 'err|trc|log|_evt|dev_|ERR|cofile'

通常比較重要的會有下列幾個
/sapmnt/P01/profile/DEFAULT.PFL
 /sapmnt/P01/profile/START_DVEBMGS00_old_hostname
/sapmnt/P1/profile/oracle/tnsnames.ora

 請記得 TNSNAMES 及 Listener 是位於 oracle home 之下 /oracle/P01/102_64/network/admin/tnsnames.ora
 /oracle/P01/102_64/network/admin/listener.ora

將找到的檔案以 VI 編輯,把找的到的 old hostname 更改為你新的 hostname ENV 和 PROFILE 內容再確認有沒有漏掉的部份

此時就可啟動 Oracle Listener

再啟動 Oracle Database

上述二者均正常啟動便完成大半了

再來啟動 SAP 如果正常啟動就完成了,接下來只要去官方申請 License ,將 key 填入 slicense 中。 基本上 system clone 的前段也是用類似方式,後面就用 SAP 提供方式將 SID 改掉,但我們這次的需求並不需要變更 SID。

詳細狀況請再查 SAP Notes 。

2012年4月17日 星期二

第二十二回 Oracle DB Online Backup 到其他主機

建立 DataGuard 時就必須複製整套 DB 資料,有人是使用 RMAN Duplicate 來做,我是不習慣用啦,因為前置還得搞通 TNS 那些東西,還必須確保備份也是正常的,所以就直接從 Source Database 複製是最快的。只是會消耗一點 Production 主機的效能和網路頻寬。而且這個方法只要 RSH 或 SSH 有 Trust 設過就可以使用。

測試過 400GB 資料在 1000Mbps 網路下,只需要 2 小時不到就可以完成了。如果你是要即時備份,當然是 Disk 快照最方便的。因為透過我這個方法,你還必須確保複製過程的 Archivelog 都必須存在,事後還需要做 Recovery 。這也算是窮人的 snapshot 吧。只是人家 snapshot 是以秒在算,這個可能都要幾個小時起跳。

首先一般資料庫在規畫時都會將 Datafile 放在特定目錄,所以在 Remote 端 Create Filesystem 時大部份人只會開一層,然後 Datafile 就放在下面,但有些套裝軟體比較雞婆(像SAP),每個 datafile 在 create 時會再建一層目錄,因此用 Scripts 做時就將這個因素也考慮進去,所有關聯目錄會依 Source 端也一併建好,如果用 RMAN 做的話,沒將整個目錄結構設對的話是倒不回來的。

整個 Scripts 內容如下:

#!/usr/bin/ksh

#===================================================================================
# 平常不使用時可將 exit 註解拿掉,以免誤執行此 Scripts,蓋到你的 Target 端資料庫
#exit
#===================================================================================

#參數初始
export ORACLE_SID=DB1
workdir="/orahome/jobs/dbdr"
target_dir=""
target_system="db_host_target"
remote_cmd=rsh
run_date=`date +%m%d`
logfile="/orahome/jobs/logs/dg_init$ORACLE_SID.log.$run_date"

#切換 SSH 或 RSH 用的 copy 工具,配合上面 remote_cmd 參數
case $remote_cmd in
rsh)
copy_method=rcp
break
;;
ssh)
copy_method=scp
break
;;
esac

date > $logfile

#先抓 Tablespace 名稱
echo "get Tablespace information...." >> $logfile
cd $workdir
echo "set term off" >$workdir/get_tablespace_name.sql
echo "set pagesize 60" >$workdir/get_tablespace_name.sql
echo "set head off" >>$workdir/get_tablespace_name.sql
echo "set feedback off" >>$workdir/get_tablespace_name.sql
echo "spool $workdir/tablespace.lst" >>$workdir/get_tablespace_name.sql
echo "select name from v\$tablespace where name not in (select distinct tablespace_name from dba_temp_files);" >>$workdir/ge
t_tablespace_name.sql
echo "spool off" >>$workdir/get_tablespace_name.sql
echo "exit" >>$workdir/get_tablespace_name.sql
sqlplus "/ as sysdba" @$workdir/get_tablespace_name.sql

#切換 Backup Mode 後抓出每個 Tablespace 內置的 Datafile ,開始複製到遠端
for i in `cat $workdir/tablespace.lst`
do
get_datafile="$workdir/get_datafile_name.sql"
echo " " >> $logfile
echo "==============================================================" >> $logfile
date >> $logfile
echo "$i transfer to backup mode" >> $logfile
echo "" > $get_datafile
#echo "select ts# from v\$tablespace where name = '$i';" >> $get_datafile
echo "alter tablespace $i begin backup;" >> $get_datafile
echo "set linesize 120" >> $get_datafile
echo "set pagesize 200" >> $get_datafile
echo "set term off" >> $get_datafile
echo "set head off" >> $get_datafile
echo "set feedback off" >> $get_datafile
echo "spool $workdir/ora_datafile_$i.lst" >> $get_datafile
echo "select name from v\$datafile where ts#=( select ts# from v\$tablespace where name = '$i');" >>$get_datafile
echo "spool off" >>$get_datafile
echo "exit" >>$get_datafile
sqlplus "/ as sysdba" @get_datafile_name.sql

for list in `cat $workdir/ora_datafile_$i.lst`
do

target_dir=`dirname $list`

result=$(rsh $target_system "test -d ${target_dir};echo \$?")

if [ result -ne 0 ] ; then
echo "create `dirname $list` on target filesystem..." >> $logfile
$remote_cmd $target_system mkdir -p $target_dir
fi

echo "copy $list to target filesystem..." >> $logfile
$copy_method $list $target_system:$target_dir
done

echo "alter tablespace $i end backup;" > $get_datafile
echo "exit" >>$get_datafile
sqlplus "/ as sysdba" @get_datafile_name.sql
echo "$i tablespace transfer complete" >> $logfile
echo "$i transfer to online mode" >> $logfile
date >> $logfile
echo "==============================================================" >> $logfile
echo " " >> $logfile
done

# Datafile 全部傳完後,寫個 LOG
echo "database transfer complete...." >> $logfile

#接下來是 online redo log
echo "==============================================================" >> $logfile
echo "set linesize 120" >> $get_datafile
echo "set pagesize 200" >> $get_datafile
echo "set term off" >> $get_datafile
echo "set head off" >> $get_datafile
echo "set feedback off" >> $get_datafile
echo "spool $workdir/ora_datafile.lst" >> $get_datafile
echo "select member from v\$logfile;" >>$get_datafile
echo "spool off" >>$get_datafile
echo "exit" >>$get_datafile
sqlplus "/ as sysdba" @get_datafile_name.sql

for list in `cat $workdir/ora_datafile.lst`
do

target_dir=`dirname $list`

result=$(rsh $target_system "test -d ${target_dir};echo \$?")

if [ result -ne 0 ] ; then
echo "create `dirname $list` for online REDO Log on target filesystem..." >> $logfile
$remote_cmd $target_system mkdir -p $target_dir
fi

done

# 最後是 Controlfile ,會直接複製到 Remote 端的對應位置,所以 Memory 配置夠的話,直接啟動就是
# standby database mode了。就可以開始 Dataguard 設定。

echo "backup controlfile transfer...." >> $logfile
echo "alter database create standby controlfile as '$workdir/ctrlf_bk_$run_date';" > $get_datafile
echo "exit" >>$get_datafile
sqlplus "/ as sysdba" @$get_datafile
echo "set linesize 120" > $get_datafile
echo "set pagesize 200" >> $get_datafile
echo "set term off" >> $get_datafile
echo "set head off" >> $get_datafile
echo "set feedback off" >> $get_datafile
echo "spool $workdir/ora_datafile.lst" >> $get_datafile
echo "select name from v\$controlfile;" >>$get_datafile
echo "spool off" >>$get_datafile
echo "exit" >>$get_datafile
sqlplus "/ as sysdba" @$get_datafile

for list in `cat $workdir/ora_datafile.lst`

do
target_dir=`dirname $list`
result=$(rsh $target_system "test -d ${target_dir};echo \$?")
if [ result -ne 0 ] ; then
echo "create `dirname $list` for Controlfile file on target filesystem..." >> $logfile
$remote_cmd $target_system mkdir -p $target_dir
fi
#echo $target_dir
#echo $list
$copy_method $workdir/ctrlf_bk_$run_date $target_system:$list
done

rm $workdir/ctrlf_bk_$run_date
echo "backup controlfile transfer complete...." >> $logfile
echo "==============================================================" >> $logfile


缺點及注意事項
1. 前置處理 SSH 和 RSH 必須設定完成可不需密碼 Remote Login 到遠端。
2. Orache Home ,這個當然要自己裝嘍,不然設法 Copy 過去改,就不多寫了,因為這個東西也不是每次必 Copy 的
3. Initial File 和 SPFILE當然還是得自己先手動設置,只要複製過去就可以了
4. Archive Log 的部份,因為這隻是為了 Dataguard 做的,事後本來就會去設定傳遞 Archive Log
所以就沒雞婆繼續改下去
5. Temp File 沒有特別去處理,Target 端啟動後,要自行重新建立 Temp File
6. 兩邊的 shell 必須是 sh 或 ksh ,如果像 SAP 預設是使用 csh ,請先更改 default shell ,不然不能正常執行
7. 請測試過再用正式環境來玩,搞錯自己把自己的檔案蓋掉,不負任何責任。
8. 這個只是為了有需求一次複製整個資料庫使用(如軟體上線前或需要一個環境測試,又沒有 Disk snapshot 的功能時),不是為了平常備份做的,真的日常備份請用磁帶機。除非你覺得硬碟太便宜。

2011年11月15日 星期二

第二十一回 AIX + Oracle 10gR4 & 10gR5 使用 LOCK_SGA 不使用 large page 的方法

最近一個系統一直有 page swap 的問題,雖然系統發生 page swap 就代表平常記憶體不足,或是程式異常佔用記憶體,但這台機器其實己經沒有 Memory 可增加了,僅剩的方法就是請 AP 人員 Tunning 程式,分散系統 Loading 。

但是其實 Oracle Database 的系統中,SGA 的資源如果發生 Swap 的狀況下,系統會跟當掉一樣,少則幾分鐘,重至系統會整個癱瘓,最後只好重啟系統。從前一直以來為了預防這件事,在 Memory 非常大的系統上,會建議客戶將作業系統下,vmo 的參數 v_pinshm=1 設上,再配合 ORACLE LOCK_SGA=true ,將 SGA pin 在記憶體中,如此 SGA 就不會再被 swap。 之前第七回有說明過這件事 http://it2man.blogspot.com/2010/05/aix.html

但 Oracle 在 10.2.0.4 後,規則有些改變,系統會需要你設定 Large Page ,再配合作業系統調整 Oracle User 的權限,才能進行 Lock_sga ,不然在啟動時會發生錯誤。

詳細請見 metalink How to enable Large Page Feature on AIX-Based Systems [ID 372157.1]

這邊節錄幾個重點
一、須在 root 下將 oracle 授予權限
chuser capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE oracle

二、計算 Large Page 之大小,公式如下,以每個 Large Page 為 16MB 計算,取得要佔用的數目
num_of_large_pages = INT((total_SGA_size-1)/16MB)+1

三、VMO 設定之參數需將重點二計算出來的數目及 lgpg_size=16777216 (16MB) 和一開始說明的 v_pinshm=1 也設上
vmo -p -o lgpg_regions=num_of_large_pages -o lgpg_size=16777216
vmo -p -o v_pinshm=1 (請注意,我記得這個參數要重啟才會生效)

四、spfile 裏需設定 lock_sga=true

五、最重要的一點,這篇 Metalink 有 Bug ,寫在最後面,上述四點都做到後,SGA 是 pin 不到你預先規畫好的記憶體內的,他會另外自己再要一塊空間,需要配合最後寫的 NOTE:728444.1 中所述的 Patch 安裝後才會真的去使用你己經幫 Oracle 設定好的空間。10.2.0.4 和 10.2.0.5 都有這個 Bug。不過後來我用別的方法,沒有去上這個 Fix ,所以還沒測試過。

上面寫的,都不是本篇標題所要做的,最後來說明標題的作業內容

雖然官方有說使用 Large Page 會增進 5% 左右的效能,但是會造成每次重開機時間比較久,每次要重新設定 SGA Size 就需要在作業系統事先分配等缺點。所以還是有原來不需要設定和計算 Large Page 就可以 Pin 的方式。

重點在部驟一:
chuser capabilities=CAP_NUMA_ATTACH,CAP_BYPASS_RAC_VMM,CAP_PROPAGATE oracle

是的,只要授予作業系統 User 權限時,增加capabilities=CAP_NUMA_ATTACH 即可
第三個部驟的 vmo -p -o lgpg_regions=num_of_large_pages -o lgpg_size=16777216 就不用再設定了,直接就可以做 pin 的動作,當然 v_pinshm=1 是一定要設的

當然最後要說明一下,這個設定動作我好像在 Metalink 找不到,所以有可能你日後遇到問題時,跟 Oracle 諮詢的話,這個 support 看到你的設定方式不同,他可能會先要求你修正。

2011年9月4日 星期日

聽我在放屁 CASE4 如果 Google 的免費服務當掉一天

如果....這是如果,如果有一天,Google 的雲端服務當掉一天,且不知何時才會修復....

搜尋引擎方面雖然有很多替代品,但並不保證可以很快的幫你找到對的答案.....但是日子還是能過....
地圖服務的話,我也不知道現在人到底有多依賴 Google Map,反正找路的話是方向感比較重要,而且記得一點,路長在嘴上,路人都是你的地圖。

Gmail 沒有備份同步在自己 PC 上的人就比較慘,如果臨時要找一封重要的 Mail ,抱歉沒有....請祈禱官方會早一點修好....

反正生命自己會找出路,如果 Internet 還能聯網的話,不至於什麼都不能做,只是對一般像我這種 IT 人員的話,平常找解決方案用慣 Google 了,大概會像斷手斷腳一樣吧。

我想未來可能會有一天無 Google 日或一天無網日,畢竟現代人出門都被網路綁住了,雖然說真的很方便....

我想網路再怎麼依賴也不會像空氣和水一樣需要,所以有時還是不要帶任何可以連網的東西出門去看看,其實也不會怎樣的.....

只是像我們這種 IT 奴工,當 Vendor 時是被客戶 Call ,到 User Site ,設備都設定了 Alarm ,有事設備會直接發簡訊 Call 你,我想除非出國到一個電話接不到的地方,不然大概也沒辦法不帶電話吧。

2011年8月9日 星期二

第二十回 RMAN Restore 及 BRRESTORE 筆記

最近記性愈來愈差,做過的事,大約過一個月就不記得了,昨天分別用 RMAN 及 BRRESTORE 還原 SAP 的資料庫,趕緊筆記一下。

我這台 AIX 5.3 上面安裝SAP Netweaver 使用的備份是 EMC Networker 這套備份軟體,安裝了 LGTO 的 Agent 及 SAP Module.

# lslpp -l|grep LG
LGTOnmsap.rte 3.5.0.0 COMMITTED EMC NetWorker Module for SAP
LGTOnw.clnt.rte 7.4.1.0 COMMITTED NetWorker Client

如果要做異機還原時,需要在異機安裝上述的 Package ,如果作業系統是用 mksysb Backup/Restore ,就不需再安裝,如果是全新安裝的 Oracle ,就必需安裝,我測試過,可以在只有安裝 Oracle Database 的環境下,將 SAP 的備份還原。

另外 SAP 環境是否能使用 RMAN 還原,備份的方法是關鍵,如果是在 TSM 之下,小弟之前設定的案例都是使用 dd ,這是一種 hot backup 的方式,此時就只能用 brrestore 來還原,只能說透過 RMAN 呼叫時,在還原時又增加了一些靈活度。

務必記得安裝過 Oracle Agent 後, Link Library 是絕對必須的,10G 後做這個動作好像不需重啟資料庫,不過反正這是異機測試機,我還是重啟了。

在下列 Folder 必須存在這個 Link
# pwd
$ORACLE_HOME/lib

#ls -al libobk.a
lrwxrwxrwx 1 oracle dba 22 Feb 17 2009 libobk.a -> /usr/lib/libnworasap.a

另外要異機還原,必須要將 Netwoker 上的 Client 允許其他機器 Restore Backup Set 的權限開啟,另為要被 Restore 的 Node 必須記得在 Networker 上建立 Client 註冊的資訊。

如果順利的話,這時就能使用 RMAN 來還原了

如果 spfile 及 pfile 沒帶過來,可以先使用 startup mount force ,強制啟動資料庫,然後去原資料庫查詢 DBID ,之後還原 Control File ,這邊我是用原機下 Alter database backup 產生的,因為我懶得等磁帶找來找去的。

因為你必須事先查出 controlfile piece 在哪,如果 catalog 還在,當然找的到,如果一個都沒有,頭就比較大了。知道 Backup piece 名字時 Restore Control File 的指令如下。

run{
allocate channel c1 type 'sbt_tape' parms 'ENV=(NSR_SERVER=XXXbkpnn , NSR_CLIENT=xxxsapp3)';
restore controlfile to '/tmp/controlfile.bak' from 'P03_begnclcm.11862_1';release channel c1;
}

Control File 還原後,即可啟動資料庫至 Mount,不過還是先將原機的 SPFILE 備份過來後改為 INIT File ,修改一下相關的 PATH ,再重新啟動資料庫。開始 Restore Datafile

因為這是一個 Netweaver 的平台,所以 Datafile 的 Layout 和正統 R/3 不同,而我因為是做 SAP 單純還原至 Oracle ,所以有些 Folder Name 被我變更了,所公必須下 set newname 變更。

run{
allocate channel c1 type 'sbt_tape' parms 'ENV=(NSR_SERVER=XXXbkpnn , NSR_CLIENT=xxxsapp3)';
set newname for DATAFILE 1 to '/oradata1/P03/system_1/system.data1' ;
set newname for DATAFILE 2 to '/oradata1/P03/undo_1/undo.data1';
set newname for DATAFILE 3 to '/oradata1/P03/sysaux_1/sysaux.data1';
set newname for DATAFILE 4 to '/oradata1/P03/saux_1/saux.data1';
set newname for DATAFILE 5 to '/oradata1/P03/sr3db_1/sr3db.data1';
set newname for DATAFILE 6 to '/oradata1/P03/sr3db_2/sr3db.data2';
set newname for DATAFILE 7 to '/oradata1/P03/sr3db_3/sr3db.data3';
restore database;
release channel c1;
}

接下來我去 SAP Backup Log 查了需要的 Archive Log Range 為 4199 至 4246,依下列指令還原 Archive Log

run{
allocate channel c1 type 'sbt_tape' parms 'ENV=(NSR_SERVER=XXXbkpnn , NSR_CLIENT=xxxsapp3)';
RESTORE ARCHIVELOG FROM SEQ 4199 UNTIL SEQ 4246;
release channel c1;
}

到此為止,應該可以啟動資料庫了吧,結果上面兩個還原沒一個成功

理論上是 OK 的,但在 Networker 這個產品之下,我們的 Resource 不足,只有兩個 Driver ,同時運行了 D2D2T ,而 Netwoker 在做 Data Staging 時,Source 和 Target 兩份資料都會鎖住不讓你存取,所以我下了兩個 RMAN 的指令,經過漫常的等待,完全沒有回應,直到 Data Staging 做完後,終於開始從磁帶讀到資料了。

但是,有部份資料需要換帶,結果 Driver 在換帶過程又被別人搶去用了,以我所知,NBU 可以在 JOB 上設定 Priority ,TSM 的 Restore JOB Priority 是最高的,所以不太會有這類狀況發生。

我花了一天的時間,倒不回這個 Netweaver 30G 的資料,後來心想,才 30G ,幹麼不直接備份下來到 Networker 後,趁他未做 Data Staging 時趕緊 Restore ,不就直接還原了嗎?

結果我重做了一次備份,不到半小時,就將資料庫 Clone 一份出來了,真不知浪費一天時間在幹麼?

另一個小插曲,熟 Oracle 的人可能會問:「為何不用 alter database begin backup ,然後用 Hot Copy 就好了?」

因為這一個 Database 是 SAP ,當初 SAP 初始安裝會設定一個參數 filesystemio_options ,請看 這邊有解釋,而我並未去調整為asynch ( Oracle Default) 所以在此條件下, Hot Backup 是不允許的,只能經由 RMAN 操作這個資料庫。

最後調整完成後,我也覺得很煩,還是乾脆將原機 OS 備份下來後,還原至另一台,改用 brrestore 來做。

假設相關參數檔都在的狀況下,只需 Restore Control file , Data File 及 Archive Log File ,所以只需下三個指令

brrestore -m 0 <-- 還原 Control File ,他會依照 Init File 內定義的 Control File 位置進行複蓋的動作。

上述指令完成後,啟動資料庫至 Mount ,才能繼續下列動作。

brrestore -m full <-- 還原 Datafile ,此指令會直接還原最後一份備份成功的資料
brrestore -b bcnmhluz.aft -m full <-- 假設你知道要還原的 Backup Log 的 File Name ,可以使用 -b 參數指定, brrestore 會找出這份 Backup Set ,並還原回來。


brrestore -a 4199-4246 還原 archive log 中 sequence 為 4199 ~ 4246 的 Log File

如果相關參數檔都不在的話,就比較麻煩,還是使用原來 RMAN 的方式來做比較方便,由 Oracle 幫你找,不過前題是你倒的出 Control File ,能抓到最後一份 Catalog 。

brrestore 的方法至少要有 SAP 存在於 oracle 目錄下的 sapbackup 及 saparch 這兩個 folder 的相關檔案資訊(summary log 及 backup log) ,還有 Oracle HOME 目錄中 dbs 下的 init[Instance Name].sap 及init[Instance Name].utl 這些檔案才能無誤的運作,當然這些東西是可以用 brrestore 倒出來的,不過等我下次有機會做後再上來補完。這些動作之前也常作,不過不是很清楚了。

SAP help 裏的作法是如此的,有機會再來做一次,因為白天我們的 Networker 都在做 Staging ,又沒機會試了。

我只記得 sapdba 實在是比現在的 brtools 好用多了,不知 SAP 在想什麼。

2012/0622 實際操作了一次 Windows 下的 Brrestore ,狀態跟 UNIX 下的不太一樣,好像在過程中的 Log 是不會作動的。可能要 Restore 完成才會有 Log ,不過也可能跟使用的  Backup API 有關,等 Restore 完成再來確認。

2011年7月19日 星期二

第二十回 Oracle 裏的 TOP N

剛剛又遇到同事詢問這個問題,平常我也不寫程式,都在處理資料庫的問題,一時要寫 SQL 還真寫不出來,找了一些資訊後,趕緊來筆記一下

假設一個Table S,內容如下

LOC INV
----------------- ----------
aaa 20
aaa 30
aaa 50
aaa 60
bbb 60
bbb 60
bbb 70
bbb 90
bbb 100

試著找出每個 LOC 中,INV 最多的前兩筆,用文字編輯器改一改就是要如下結果
LOC INV
---------- ----------
aaa 60
aaa 50
bbb 100
bbb 90

LOC=aaa 中 INV 最大的兩筆為 60 和 50
LOC=bbb 中 INV 最大的兩筆為 100 和 90

所以先 create 一個 Table S

create table s
( loc varchar2(20) not null,
inv number
);

然後將資料 insert
insert into s values('aaa',20);
insert into s values('aaa',30);
......後略

因為 Oracle 沒有 Top N ,所以每次在用這種找出前幾筆的 Function 時,總是很麻煩得用 ROWNUM 來做
如果是一張表格要抓前兩名,其實也不難

select * from (select * from s order by inv desc) where rownum <=2
出來的結果如下

LOC INV
---------- ----------
bbb 100
bbb 90

但是我要的不是這個東西,因此不知在 Oracle 8i 還是 9i 就有了 RANK() 和 DENSE_RANK() 這兩個函數,這邊只依我原有範例說明用法,詳細的說明 這裏 寫的更清楚。

RANK() 會產生一個 column base 在後面的 over 子句下法
所以如果要用 RANK() 產生 TOP N 的結果就如下所示的寫法

select loc,inv,rank() over (order by inv desc ) test from s
LOC INV TEST
---------- ---------- ----------
bbb 100 1
bbb 90 2
bbb 70 3
aaa 60 4
bbb 60 4
bbb 60 4
aaa 50 7

aaa 30 8
aaa 20 9

會發現多了一個 test column 上面記載了排名,特別注意這邊有三筆 60 的記錄,如果使用 row_num 這三筆會被排名為 4,5,6 ,但在 RANK() 的下法中,會統一被規類為排名4

但使用 DENSE_RANK() 時會有什麼結果呢?
select loc,inv,dense_rank() over (order by inv desc ) test from s
LOC INV TEST
---------- ---------- ----------
bbb 100 1
bbb 90 2
bbb 70 3
aaa 60 4
bbb 60 4
bbb 60 4
aaa 50 5

aaa 30 6
aaa 20 7

由此可發現使用 RANK() 時,因為第 5和第6名均被佔據了,所以下一筆會直接代入7,但使用 DENSE_RANK() ,第5名和第6名仍是存在的

但如此還是無法達成原有的需求,不過因為在 over 子句裏還有一個 partition by 的參數,可以做表分割
所以改為下列寫法
select loc,inv from (
select loc, inv,rank() over(partition by loc order by inv desc ) rank from s)
where rank <= 2;

如此就會依據 loc 去分別計算各區的排名,結果就出來了
LOC INV
---------- ----------
aaa 60
aaa 50
bbb 100
bbb 90

但是,原本我以為如果像 SQL Server 有 Top N 可用,配合 Group BY 時是可以有這種功能的,結果我錯了,SQL Server 到了 2005 後也支援 rank() Function ,才可達到類似功能,不然就得寫 SP 才做的到了。

2011年7月11日 星期一

第十九回 Oracle 8.1.7 RMAN Backup 時出現錯誤訊息

最近將一台設備使用了類似 Log Shipping 的方式轉移,所以在啟動資料庫時有 Resetlogs

之後幾天使用原來的 Backup Scripts 備份 Archive Log 一直都失敗,會出現以下錯誤


RMAN-03022: compiling command: backup
RMAN-03025: performing implicit partial resync of recovery catalog
RMAN-03023: executing command: partial resync
RMAN-08003: starting partial resync of recovery catalog
RMAN-08005: partial resync complete
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure during compilation of command
RMAN-03013: command type: backup
RMAN-06004: ORACLE error from recovery catalog database: RMAN-20242: specification does not match any archivelog in the recovery catalog

原有的 Rman Archive Log Backup Scripts 如下

run {
allocate channel t1 type disk;
allocate channel t2 type disk;
backup
filesperset 20
format '/disk01/backup/al_%s_%p_%t'
(archivelog until time 'sysdate-7' delete input skip accessible);
release channel t1;
release channel t2;
}

後來查明原因,這是因為我們 Resetlogs 後,系統還沒有產生 7 天後的 Archvelog 可供備份,所以找不到需要備份的檔案。如果你的 Backup Scripts 中,有使用名字來過濾需要備份的檔案時,找不到該檔案也會出現類似的 Error ,其實這應該只是個 Waring 才對。

2011年3月9日 星期三

小插曲 Data Guard Archive Log Manage (Primary Site)

從 9i 開始到現在 10g (11g 小弟還沒使用過) ,所使用過的 DataGuard 有個缺點,就是設定之後,Archive Log 就必須自己管理,當然也可以不需要理會,完全交給 RMAN 備份去刪除就可以了,只是如果你擔心 Data Guard 的 Standby 在還沒傳輸完成及Apply Archive Log 前,Primary Site 的Log就被備份軟體刪除,你就必須自己控制哪個時間點才能刪除,尤其是有時在 dest_2 設定了 ARCH DELAY=XXX 時,萬一斷線發生時,Archvelog 又被備份軟體刪除就有點麻煩,尤其是對我的終端客戶而言,我可不想建立後一天到晚因為客戶的網路問題往那跑,在 UNIX 上面,可以寫 Shell Script 去控制。這裏僅提供 Primary 端的管理,其實 Standby 端的 Script 更簡單,只要修改幾個位置就可以了。

後來我發現,如果利用 RMAN 備份的話,RMAN 好像會去確認 Dataguard 另一端的 Archive Log 有沒有被 Apply ,進而保留未被 Apply 的 LOG ,一直到該 Archive Log 有被 Apply 後,下次的 RMAN 備份就會將之刪除了,所以這個 Script 其實是不需要了。不過這個特性不知是否是 10G 才有,隱約記得以前好像是沒這麼方便。

其實這個 Scripts 還挺簡陋的,不過我也不知道還有沒有更精簡的方法,至目前為止我都是如此使用的

#!/bin/ksh

export ORACLE_SID=PXX
export SCRIPT_HOME=/oracle/PXX/jobs/sapdr
export LOG_HOME=/oracle/PXX/jobs/logs
export DG_HOST=PXX_DR_HOST
export DG_TNSNAME=PXX_DR
TIME=`date +%m%d%H%M`
remote_cmd=rsh

case $remote_cmd in
rsh)
copy_method=rcp
break
;;
ssh)
copy_method=scp
break
;;
esac

#為了將來如果改使用 SSH 時,不需太多變更,因此加了上面的 Case 判斷

trap "rm /tmp/.lock_DG exit -1" 2 3 5 15
if [ -f /tmp/.lock_DG ] ; then
exit
fi
touch /tmp/.lock_DG

#避免此 Script 被重覆執行,因此用 trap 機制避免

cd $SCRIPT_HOME

#check remote site listener is alive
tnsping $DG_TNSNAME
if [ $? -ne 0 ] ; then
echo DG_HOST not exist > /tmp/rmarch.sh.$TIME
rm /tmp/.lock_log
exit 1
fi

#第一部當然要先確認對方的 TNS Names 是否存在

$remote_cmd $DG_HOST "cd $SCRIPT_HOME;sh ./get_MAX_log_dg.sh"

#從 Standby Site 取得目前己被 Apply 的 MAX Log Sequence#

# get_MAX_log_dg.sh 檔案的內容如下
#--> #!/bin/ksh
#--> export SCRIPT_HOME=/oracle/P02/jobs/sapdr
#--> TIME=`date +%m%d%H%M`
#--> echo "spool dg_log.lst" > $SCRIPT_HOME/grlist_dg_pri.sql
#--> echo "set echo off" >> $SCRIPT_HOME/grlist_dg_pri.sql
#--> echo "set feedback off" >> $SCRIPT_HOME/grlist_dg_pri.sql
#--> echo "set heading off" >> $SCRIPT_HOME/grlist_dg_pri.sql
#--> echo "select max(sequence#)" >> $SCRIPT_HOME/grlist_dg_pri.sql
#--> echo "from v\$log_history" >> $SCRIPT_HOME/grlist_dg_pri.sql
#--> echo "where first_time < sysdate-7/24;" >> $SCRIPT_HOME/grlist_dg_pri.sql
#--> echo "spool off" >> $SCRIPT_HOME/grlist_dg_pri.sql
#--> echo "exit" >> $SCRIPT_HOME/grlist_dg_pri.sql
#--> sqlplus '/ as sysdba' @$SCRIPT_HOME/grlist_dg_pri.sql
#--> rm $SCRIPT_HOME/grlist_dg_pri.sql

list1=`$remote_cmd $DG_HOST "cd $SCRIPT_HOME;cat dg_log.lst" | awk ' NR > 1 { print $1 }'`
echo $list1

$remote_cmd $DG_HOST "cd $SCRIPT_HOME;rm dg_log.lst"

echo "set echo off" > $SCRIPT_HOME/grlist_dg.sql
echo "set feedback off" >> $SCRIPT_HOME/grlist_dg.sql
echo "set heading off" >> $SCRIPT_HOME/grlist_dg.sql
echo "spool standby_log.lst" >> $SCRIPT_HOME/grlist_dg.sql
echo "select max(sequence#)" >> $SCRIPT_HOME/grlist_dg.sql
echo "from v\$log_history" >> $SCRIPT_HOME/grlist_dg.sql
#echo "where first_time < sysdate-1;" >> $SCRIPT_HOME/grlist_dg.sql
echo "where first_time < sysdate;" >> $SCRIPT_HOME/grlist_dg.sql
echo "spool off" >> $SCRIPT_HOME/grlist_dg.sql
echo "exit" >> $SCRIPT_HOME/grlist_dg.sql
sqlplus '/ as sysdba' @$SCRIPT_HOME/grlist_dg.sql

list1=`cat standby_log.lst| awk ' NR > 1 { print $1 }'`
echo $list1

echo "set echo off" > getrmlist.sql
echo "set feedback off" >> getrmlist.sql
echo "set heading off" >> getrmlist.sql
echo "set pagesize" >> getrmlist.sql
echo "spool rm_primary_arch.sh" >> getrmlist.sql
echo "select 'rm '||name " >> getrmlist.sql
echo " from v\$archived_log " >> getrmlist.sql
echo " where dest_id=1" >> getrmlist.sql
echo " and sequence#<${list1}" >> getrmlist.sql
echo " and backup_count>0 " >> getrmlist.sql
echo " and archived='YES'" >> getrmlist.sql
echo " and deleted='NO' " >> getrmlist.sql
echo " order by thread#, sequence#;" >> getrmlist.sql
echo "spool off" >> getrmlist.sql
echo "exit" >> getrmlist.sql

#產生要抓取 Archive Log 清單的 SQL ,但是 MAX Log 是由對面抓回來的,由此判斷己被 Standby 端 Apply 才會刪除

sqlplus "/ as sysdba" @getrmlist.sql > /dev/null
#由上面產生的 SQL 再產生要刪除的 Shell Scripts "rm_primary_arch.sh"

rm $SCRIPT_HOME/getrmlist.sql $SCRIPT_HOME/grlist_dg.sql $SCRIPT_HOME/standby_log.lst
#將本 Scripts 執行過程中產生的臨時程式 SQL 及 清單檔清除,Debug 時請將其 Remark 掉

chmod +x rm_primary_arch.sh
. ./rm_primary_arch.sh > /dev/null 2>&1
mv rm_primary_arch.sh $LOG_HOME/rm_primary_arch.sh."$TIME"

rman target / nocatalog msglog=$LOG_HOME/rmlog_ma_history <allocate channel for maintenance type disk;
change archivelog all crosscheck;
delete noprompt expired archivelog all;
release channel;
EOF
#在此是使用 RMAN 的 Maintenance Channel 來做 Crosscheck

find $LOG_HOME/ -name "rm_primary_arch.sh*" -ctime +7 -exec rm {} \;

#每次執行產生的 Log 使用 find 指令來刪除,以免執行的 Log 保留過多,這邊保留七天的 Log File

rm /tmp/.lock_DG
#最後記得 lock file 要刪掉,不然下次就不會再執行了

2011年3月8日 星期二

第十八回 SAP 建立 Oracle Data Guard 出現奇怪的 TNS 問題

上次的發言記錄是去年的 10/25 ,其實因為一些因緣際會,小弟換了家公司繼續 IT 服務,這幾天在建立一套 DataGuard 環境。發生了一些小插曲。

首先建立 DataGuard ,如果你不是用 Broker 來建立的話,依據文字介面的建立方式的部驟其實不難,這個隨便找也有一堆 Step by Step 的部驟,Metalink 上面也有官方參考的文件可看。我建了那麼多套,其實也沒用過 Broker 或是 GUI 建立,總覺得在命令模式下才會清楚自己究竟在幹麼,而且要操作時,只要有 Telnet 就可以完成全部的事情,而透過 Broker 反而也沒比較好操作。

這次建立的環境是 SAP ERP 的環境,依照同樣的部驟,我完成所有設定後,在啟動 log_archive_dest_2 的 MRP Service 後,發現 Archive Log 並沒有造我的期望傳過去,一直出現 Ora 12154 could not resolve service name 的錯誤,可是明明在 SQLPLUS 之下,我己經確認過在兩邊的 Oracle User 的提示字元下都能透過 TNS 順利連線至對方的資料庫,查了半天,確認沒有問題,又試了一次,結果仍然是一樣 ORA 12154 ,這個錯誤訊息就僅僅是 TNSNAMES.ORA 設定錯誤,讓 Oracle 無法解析指定資料庫的位置而己,而我確定我的資訊都是對的。

重新將整個設定全部確認過並重建後,再重新看了一下 Listener.ora 的設定,發現這台機器之前有疑似 DataGuard 的 Listener 存在,從 Alert Log 的保存資料裏面也有對應資訊,可能是從前有測試過該 Function ,所以我就用之前的 Listener 設定重新又做了一次。

終於..........還是不行,只是錯誤訊息不同,更神了,變成 ORA 12541 No Listener,一整個搞不清楚怎麼回事的狀況下,我只覺得我的 Source Instance 是不是瘋了,好像沒有吃到我的設定一樣。將 Metalink 整個翻過了一遍就是沒有對應的錯誤,尤其是 No Listener 才是怪異,根本不可能的事情啊,後來我將環境還原成原來 ORA 12154 的狀態。然後打電話問前同事有沒有遇過這種怪事。

前同事非常熱情的連線過來幫忙看我的狀況,首先,因為我還沒告知他相關的資料庫資訊,因此,他一連上終端機就用 ps -ef 查詢 Oracle Instance 是否有啟動,然後以 su 方式切換至所獲得的 User 資訊的 OS User 下操作,他一試就發現問題,tnsping 並無法 ping 到對方啊,我說怎可能,我測過兩邊的 sqlplus 都連線成功,怎可能 tnsping 不會過。結果他告知我他使用的是 SAP R3 的那個 Service 帳號,不是 Oracle 的帳號。

一聽到這個寶貴的資訊後,我完全了解是怎麼回事了,我馬上切換成 SAP R3 的帳號,echo $TNS_ADMIN ,果然答案出來了,這個 User 有自己的 TNS_ADMIN 位置,所以我從昨天一整個改到翻掉的ORACLE_HOME 裏的那個預設 tnsnames.ora 根本就不是現在啟動的這個資料庫使用的。

但是....................為什麼 Oracle 啟動會使用 SAP 帳號而不是 Oracle 帳號呢? 這是因為,大部份 SAP 都是透過 SAP User 直接執行 SAP 提供的 scripts,就會將 Database 和 R3 Instance 一起啟動,這時,Oracle Process 的 Owner 就會是 SAP 帳號,因為該帳號也有 DBA 權限,所以他是可以操作 Oracle 的檔案的。

但,如果之前啟動是先 su 至 Oracle 帳號啟動資料庫,再 su 成 SAP R3 帳號啟動 R3 ,就不會有這種問題了。而最終的解決方式是,最好將兩個 User 的 TNS_ADMIN 設定的位置都設為相同,這樣才不會有類似的問題發生。在 Oracle ERP 下面也是要注意類似的問題,因為 Oracle ERP 為了相容舊版的Client ,我記得它有多個 ORACLE_HOME ,但在 SAP 上我就沒想到這個問題。

果然是旁觀者清,我查了快一天的問題,沒有 SAP 經驗的同事連線過來2分鐘就搞定了。而原本 ORA 12541 NO Listener 的錯誤是怎麼回事呢,因為之前有人做過設定,在 SAPR3 的 TNSNAMES 裏面是有定義的,但是目地主機早就不存在了,所以我從 Oracle 裏更改對應資料時,他才出現 ORA 12541 ,因為程式讀的根本就不是我後來設定的目地主機。

2010年10月25日 星期一

第十七回 IT 職場生存法則,程序程序再程序

記得2004 還2005年左右,我還在管理某家委外的 SAP 時,因為 Interface (ERP 統稱所有要對外連接的介面叫 Interface) 的部份要透過 Oracle 建立幾個 View ,並且授予權限給能夠存取的子公司存取,還跟網路的防火牆有關,當時我只糊里糊塗的搞清楚哪些 Object 要建立 View,並給哪些人權限,相對應的 SQL 怎麼下,要給哪幾間子公司,就請客戶來開會了,不知各位知不知道當天客戶來了多少人,首先,對口端的連絡人,應該叫他 PM ,但是這種小小的需求我想應該不需要有 PM 吧,然後有一個 SA 跟著來,還有一個客戶那邊的網管,和一個 DBA ,另外來了兩個日本顧問,還有一個翻譯,總共7個人,說實在的我嚇到了,因為我們這邊,只有我一個人負責這些事情。

其實需求都很清楚,客戶那邊有些也有對應的 Specific 了,所以就開始討論細節和 Schedule ,我心裏一直 OS ,SQL 程式碼有了,該給的權限也有了,網路開哪個 Port 連哪個 IP 也知道,這幾件事,我只要二小時就搞定,因為機器統統都是我管的,你們來那麼多人,還要討論什麼 Schedule ,我直接就說,你們回到公司時我就會弄好。直接連過來就是了。

現在我心裏想一想,當時對方那麼多人,個個領的薪水都可能比我當時還高,他們負責的東西還沒我多,憑什麼領那麼多錢? 所以當時兩小時可完成的事情事實上我覺得應該這樣子拆,資料庫的部份因為授權還要請我委外的客戶端開放然後填單,所以工作天三天,網路也是再加三天,然後我處理的時間要二天,頂多文件申請填單可以平行處理,但怕相關人等不在無法授權還要再加個 Buffer ,所以至少要七個工作天。結果我兩個小時就做掉了,我幹麼那麼精實啊我。

雖然這只是一件小小的事情,但看看以日本人為借鏡的客戶端多麼的重視,來了七個人開會,而我們只找了一隻像我一樣的小貓出來叫囂說我二個小時就可以搞定了,搞不好人家還以為我們不專業,不重視他們的需求哩。

所以事情會的多其實也不是什麼重點,當初我直接就開放給客戶使用是因為沒事(雖然我也有經過授權同意,但沒Paper Work),萬一發生了個什麼資料外洩還是規格不對,如果有填單跑程序,出事了,你也還找的到人揹,說是某人同意某人如何如何。不然就是你自己扛了,說實在的也不是官僚,無論在大小公司,有時多嚴謹點也不是什麼壞事啦。只是這其中的拿捏就看個人了,如果當時我喊七天可完成,結果兩天做掉,人家是感謝你,你直接說二小時就可做掉,那不是反而不給人家面子,我們來這麼多人是幹麼吃的不是嗎?

2010年8月27日 星期五

第十六回 個人經驗:幾家 Storage 遇過最常見的幾個問題,以EMC 和 IBM 為例

EMC 這家儲存設備廠商所製造的各個型號的 Storage ,在效能和穩定度上的水準一直是不錯的,平台支援度也挺完整的,不過就我常遇到的 CX 等級的機器,其實是有一些問題存在,不過這些問題其實也是個瑕不掩瑜的問題。

首先無論在哪個 Storage 平台都一樣,在安裝之前,請務必參考該 Storage 提供的 Checklist 仔細核對你要使用的平台的作業系統版本及對應的 MultiPath 驅動程式的版本和必須安裝的 Patch 及平台配合需調整的參數,才能在使用時,將問題降到最低。

狀況一:Storage 陷入不明的 Busy 狀態,造成 CPU Load 增加,因為全部都在 I/O Wait 狀態,Application Hang 住,之前就是平台驗證未做好,相對的參數也沒對應好,有過到類似的狀況。後來將 Patch Level 更新後,就沒發生過類似狀況。

另外第二點,既然是 Multipath 的狀態下,請注意你的路徑安裝的方式及 Storage 提供的 MultiPath 使用方式,EMC 的 CLARiiON 及 Symmetrix 的 MultiPath 使用方法是不太一樣的,就如同 IBM 在 DS4 和 DS8 的 MultiPath 亦是不同,所以在 Zoning 和接線方式是要注意的,以免你的 Path 亂掉造成 Storage Controller 誤判而將控制權自行更動。

狀況二:在 IBM DS4 系列曾遇到安裝的工程師在調整 SAN Switch 設定時,接光纖線接錯,造成某張光纖卡故障時,Controller 誤判一直在做切換動作,剛好所屬的 LUN 是在 Cluster 架構下,使得所有同時 Access 到該組 LUN 的 Server 的路徑一起也被切換,使得 I/O 一直不停的 Busy 。因為為了處理這個問題我曾不小心將某全球雙 A 品牌之一的 Mail Server 關閉了半個小時後才回復。

狀況三:在 EMC CX 比較常見,在Disk 被Access 的狀態下,如果突然所有線路直接被拔除,不是瞬斷馬上恢復那種,是真的實體線路連接斷線時,CX 的 Powerpath 下所屬的那個 Path 的 Disk 有非常大的機會會被 Controller Lock 住,此時會有一種狀況,該 Disk 就算線路己經連接回來,你仍然無法使用該 Disk ,有時在 Navigator 下面就可以看到該磁碟的狀況是有些異常的,通常將該 Disk Unassign 再 Assign 後會回復正常,但少數狀況可能需要將目地端主機設備重開,這個問題我在 AIX 上面連接 EMC CX 時經常遇到。

CLARiiON系列的MetaLun在很多場合真的是非常好的一項特性,尤其是原本就有 LVM 架構下的 AIX ,更是強大,幾乎可以不需花費什麼風險就任意的將一個 Disk 放大,不像 DS4 系列號稱可以如此,但是卻是必須要連續空間才有辦法如此使用。

另外 CLARiiON 的前五顆 DISK ,預設是放置 Flare Code OS 用的,這五顆 Disk 內置了整座 CX 的設定及作業系統,系統預設當這五顆 Disk 其中有一顆發生損壞時,是非常危急的一件事,預設第一件事就是要通知所有的人,所以當這五顆 Disk 其中有一顆發生損壞時,就會將 Write Cache 關閉,Write Cache 一關閉,所有接續在本座 CX 儲存設備的系統主機的效能馬上就會陷入無比的低落。

狀況四:EMC CX 系列的前五顆硬碟,只要損壞其中一顆,預設 Controller 的 Write Cache 就會被關閉,此時在使用這個子儲存系統的主機都會發現效能變差,當然在尚未修復前可以透過設定將 Write Cache 再度啟動,讓系統效能恢復,不過 Flare Code OS 所屬的 Disk 故障務必儘速報修將之修復,以免發生遺憾的事情。

狀況五:非常類似 EMC 狀況三的情形,在其他家 Storage 也是會發生的,在 IBM 過去的 ESS 系列,也就是 SHARK 和 DS8000 上面使用 SDD 時會有類似情形,就是當有個 LUN 原本是屬於某個系統存取時,忽然該系統被關閉,緊急改用另一個作業系統接手,而你又未將 LUN 設定在這兩個作業系統都可存取,僅是後來才變更設定,該 LUN 就會被第一個 Access 的作業系統鎖住。在 DS8000 和 ESS 下的 SDD 有個工具叫 lquerypr 可以將這個 Lock 解除。相對的其他廠商也會有類似的工具可以處理類似的問題。

2010年8月16日 星期一

第十五回 某製造業的 HA 問題

去年底時,有位同事去某製造業 implement HA ,結果一直不順,後來我就過去看,因為狀況真的很怪異。

問題在 HA 設定上都可以順利完成,但在切換演練時會發生兩個問題,一個問題是切換過去後 Application 的 Applet 畫面會出不來,另外一個問題更嚴重,如果我是用 HA 裏的 Move Resource 整個切換過去後,約5~8分鐘的時間,整個系統就會被踢回來。

第一次去看時,我順道帶了一台 Gigabit Ethernet Switch 過去,將網路問題簡單化,只是這兩個問題有時是偶發,有時又不會發生,所以真的很難抓。後來在一次切換成功,等了快半小時以上沒有任何異常的狀態下,我們決定只能先將系統留置在 Standby 端,觀察一個晚上看看。

第二次去看時,發現系統己經自己回到 Master 端在運作,我回去有做了功課,因為做這類 HA 的工作,一開始最好將網路環境的 SPANNING TREE 和 ARP Proxy 關閉,這個原本一開始就跟客戶確認過了,但又再次請教客戶,這些協定有沒有被開啟,但是對口的客戶並不是網管,當天網管也不在公司,無法回答我們。當天又測了好幾次,狀況是一樣的。只好暫時歇兵。

後來不得己請了原廠出馬,看他們在測試的樣子,小弟覺得那個程序確實有值得我學習的地方,但是方法就不說了,老實講,也是亂測一通,把所有可能和不可能的方法都列在白板上,做完失敗就畫掉,交叉分析。其實有些程序在手冊及原理上根本就不存在,這樣也是被列出來測試。最後原廠將整個設定打掉重做,系統忽然就穩定了。因此大家以為從此可以安居樂業了,就快樂的回家。

不過這次穩定的時間確實比較久,大概過了快三天,老現象又發生,後來大家一直在 Review 所有的設定重新檢查,最後客戶發現一件事,為何在 Application 的 Web Server 的設定只有一台主機,此時負責的顧問也注意到了,將兩部主機的設定全加進設定裏後,第一個 Applet 出不來的問題解決了。重覆試了好幾次,都是正常的。但是第二個問題依然是存在,我們又回頭去請教網管,確認是不是不能設的設定有確認過真的沒設。

後來真的確認了,ARP Proxy 被打開了,造成系統切換至 Standby 後我的 ARP Table 不一致,隔沒多久,網路就斷線,然後整個系統就會被踢回 Master 端。

所以在做一些設定時,雖然己經將所需環境及設定告知客戶了,還是得再三確認過才行,這次這個問題,花了快兩週的時間解決。每天許多人都熬到很晚,因為有時又不會發生,根本找不到解釋的原因。所幸 ARP Proxy 關閉了以後,這件事就真的解決了。

2010年8月13日 星期五

聽我在放屁 CASE3 我的證照之路

最近的很多廣告,都是某某電腦在推畢業前考取某某證照之後工作有多好找。或考取某某證照以後在哪上班....對於在 IT 業打滾了很多年之後的我來說,實在也是非常諷剌的事情。

老實說,小弟手上的三張證照,MCSE、OCP、SAP都不是我學生時代去考的,MCSE 2000年時當初找最便宜的教育訓練中心也要二萬多,OCP 要 10 萬,SAP 要 3X萬,一個學生哪來那麼多錢上課,而且還要考試,MCSE 當初7科也要二萬多,OCP 五科,單科好像五仟,SAP Basis 我是不知道,因為是含在教育訓練的費用內的。所以以當初我自己花錢去報 SCJP 時,發現那時暑假期間好多學生跑來上課考證照,一時覺得現在的家長和學生真的很辛苦,這類專業證照的上課動則一、兩萬,有些大學生在畢業後會不會走這行都還不知道,就得讓他來上課,當時最熱門的課程就是 MCSE和CCNA。

而我的這幾張證照都是進了公司後,因為有專案配合,或是公司有政策需要,才去考的,而為何在 2004 年後我就不再去考任何證照了呢? 因為我想在 IT 業打滾,之後除非我是去考 PMP 這類管理性質證照,如果還有在做相同的工作的話,同類型證照只要有當初那張就夠了,至於需不需要每年為了昇級一直在考試,被原廠騙錢。除非是配合政策,但這類配合政策取得的證照有時根本就不重要,如某些硬體廠商或軟體廠商每幾年就會要合作夥伴花錢去考一些證照,要有一定的數量才能有販售產品的資格,或取得某些標案。像這類型的有時我就只是配合著去考,所以我手上也有兩、三張硬體維護工程師的證照,但是有效期只有二年。這種證照對我而言,也沒什麼價值可言,現在是 2010 年,我手上有三張五到八年前的Intel 平台的原廠硬體工程師認證執照,當時的機器是 PIII 架構,請問現在哪家公司會認你這張證照。

就算你很行,在大學畢業之前,你就考取了二、三十張不同領域的證照,前一陣子新聞就常報導這類學生,我只想問一句,你畢業後想做什麼,是逼不得己有什麼工作就做什麼還是依自己的專業、興趣去找工作。而且二、三十張,你專精的領域在哪? 抱歉,應該沒有老闆相信你是什麼都會的。

就我之前有去面試的經驗而言,很抱歉,有些公司跟我說,我們不需要同時會管 Oracle 、AIX 、SAP 、Storage 的人,甚至告訴我,你應該自已先想清楚,你自己要走哪條路,而這些公司,還是國內上市櫃公司排名前一百大的。意思是表示,這些公司他並不需要跳樑小丑,可能也不需要高手,因為再強的高手還是得依賴原廠或合作廠商,也許他們分工非常的細密,只需要懂單一產品的人就可以了。

至於有關 IT 證照取得,現在對岸有太多的資源可取得,就算你不知道門路,網路上還有流傳 Braindump 的試題,只要找幾個想要一起考同類型考試的朋友,在網路上都可以買到題目,花個幾天背一背就能過了。所以有些考試才會有你沒去上相關課程就算考過也不會發給證照這種規定。

基於 Braindump 這種東西其實也有他的價值,必竟花我的錢是錢,花公司的錢也是錢,總不可能光靠唸熟去考試就一定會過吧,而且考一門也不便宜。事先了解考試題目的內容也是不錯,只是這些 Braindump 就真的很強,不知是跟考試中心合作洩題,還是真有人能把題目背下來(不過有些連圖片都有,我就不相信是背下來的),只要在一定時間內,題目命中率可說是 100%。

老實說我的 MCSE 和 OCP 都是透過 Braindump 考上的,當初 MCSE 的唸法就是一週讀一本考題,然後就上場考,不過微軟的題目比較長,我每題都花了時間去唸完並理解,不是只背答案,因為當時的考試經驗也不多,七科就花了七週去考,後來的 OCP 更誇張,當初的教育訓練中心直接提供試題,那五科考試,我看我們平均一科都只需花 20分鐘就可以考完,OCP 就這樣輕輕鬆鬆入手。至於 SAP 我是真的把原廠上課的四本教材每天拿來複習,翻到都快爛掉,抱著心驚膽顫的心情去考,考完仍是沒把握,因為 SAP 的考試比較不一樣,考完要一個月左右才會有結果,不會當場告知你有沒有通過。一直到拿到成績通知那天我才放鬆下來。

整體比較起來,我是覺得微軟題目的變動好像比較多也比較靈活,當初如果只是呆呆的背題目去考,我大概沒辦法順利在七週內通過,OCP 當時就比較死板,題目也很短,當然現在的 OCP 考試我是不知道。

至於我唯一自費上課和考試,而且沒考過的 SCJP ,雖然我也是沒看考題,只有看教材,但是程式設計可能跟我比較不合,我後來只差一題結果沒通過,後來也沒再去考了。我覺得 SCJP 考試的內容有點過份,根本就是把人的腦袋當編譯器和執行緒在考,直接扔段程式,問你哪裏錯,或著是執行的結果是什麼。而且大多數都是廻圈的題目,我考試過程中在腦袋裏不斷的執行那些廻圈轉到頭都暈了。後來就這樣敗下陣來。

而其他跟原廠硬體有關的考試,其實只要大概的唸一下當年度最新的技術手冊和安裝手冊就可以了,反正幾年後這張證照就沒用了。只要通過就可以了。

後來我在工作之餘又跑回去唸大學資管時,因為大部份的大學最流行的就是叫你去考 MCSE ,CCNA,SCJP ,所以很多教授上課時都會 Push 你去考試,尤其是我網路的老師,老是上課就一直 CCNA、CCNA、CCNA,唸到我都煩了,當然我不是說 CCNA 沒有用,是因為我沒有要做網路這塊,我只需要有基本功就好了,再多考張證照只是浪費錢而己。

所以當時那門課在第二學期的學分期末考時,我考完實作了離場時,教授就跟我說:「同學,看你設定很熟喔,要不要去考個 CCNA ?」當時心裏只想反正我都過了期末考,一時忘記直接在全班同學面前凸老師:「不用了,我考那個沒有用。」後來每個同學出來都跟我說,你也講的太大聲了,全班都聽到了,這樣教授很沒面子耶。我才驚覺,對喔,其實我當時只是把心裏的想法說出來,也沒想那麼多,只是聽了兩個學期的CCNA實在很煩,一直在說考取 CCNA ,可以往電信業發展啊,前途有多好啊什麼的。每次上課都在說。感覺好像在上洗腦課程,而且其實我也沒那麼熟,學校考試的內容頂多只是基本的 Route 設定而己。我還是把我工作上該做好的事情搞定就好了。

屁了這麼多,最後下個結論吧,其實現在這個社會大家都很忙,互相不認識,社會新鮮人在初入社會時又沒什麼工作經驗,證照是個快速讓公司對你直接有專業的形象的證明,但以現在大學畢業的工資可能平均在 28000 ~ 32000 之間,你在學期間一次拿到許多張證照只是讓你的實力在面試時被模糊掉了,搞不好還會讓一些公司覺得請不起你。

不如選定一、兩種基本入門又負擔的起,或者是管理類的證照 (個人覺得 PMP 和ITIL 可以去考,但是千萬別在沒什麼實務經驗的狀態下拿這些理論跟你的老闆屁,那就真的太白目了,他打滾了多少年要你來教嗎? ) ,基本上大公司看的可能還是在校成績和社團領導經驗,其他的證照在清楚你要走的路之後再慢慢取得,幾年後累積了一定實力之後,你才會發現,有哪些證照根本就不重要,你累積的工作經驗和你執行專案的結果才是人家要看的東西。

後記:之後我才得到 01 論壇上面網友的更新,PMP 實際上需要實務經驗才能取得,ITIL 目前 V3 版本價錢也是天價,己經跟之前 V2 是完全不一樣的世界了。所以大家還是量力而為,基本上要投資自己,語文能力的訓練一定是不會錯的。

2010年8月10日 星期二

第十四回 200X年 SAP 效能低落的一次經驗....

在 200X 年,因為公司外包了某物流業的 SAP Basis 的工作,我就是當時的 Basis ,當時的 UNIX 主機在我們公司代管,客戶端是透過企業內的 Intranet 連線至我們機房的 SAP 主機,其中有一家關係企業一直在報 Call ,說經常發生 SAP GUI 連線時,整個畫面 Hang 住不動,但又不是當機,只要隔一陣子就會再恢復。這可造成 HR 和 FI 人員不少困擾。

因為其他點的關係企業並沒有類似的問題,而且有問題的這家關係企業跟其他關係企業也處在同一棟大樓內,所以我直接排除是我主機的問題,只能懷疑是網路的問題造成的。

因為安控的關係,這幾家關係企業的網路只有在進到我機房時才會串在一起,而且彼此之間是無法 Router 的。而負責網路的也是同一家廠商,所以我先做了一個簡單的實驗。

將我機房的 FTP Port 防火牆開啟,然後我到客戶端以 FTP 上傳數個大小不等的檔案到我的主機端,就開始發現連線到我機房的網路不是很穩定,有時會 Hang 住不動,因此我將 SAP Router 透過 Internet 連線的 Port 啟動,透過客戶的 Internet 連線到我機房,然後暫時將幾個重要 User 設定為透過 SAP Router 連線,決定先觀察一週看看。

結果這一週以來,透過 SAP Router 連線的 User 的使用體驗是前所未有的順暢,反而是走 Intranet 的人一直在開罵。這時確實證實了一定是網路的問題,因此就找齊客戶的 MIS ,我和網路廠商的人出來開會討論,我將我測試的結果報告完畢後,網路廠商拿了一張流量圖,告訴我們,該客戶的網路流量一直非常正常,並沒有滿載的狀況,所以問題應該也不在他們那邊,他們會回去檢查看看是不是有問題,小弟當時想說真是睜眼說瞎話,我在這邊測了一個多星期時,你們在哪? 有了結果和證據了,開會時還說這種廢話。

因為我也不是客戶的 MIS ,客戶不發難,我也無話可說,只好就暫時離場,讓他們回公司去確認,就這樣過了快3 個月,開了快3次的會,每次的結果就是帶網路流量圖來,OOXX ,你也換一套吧,每個月開會都用這招也太沒梗了。然後同樣說客戶使用的流量一直沒滿載,問我們主機端有沒有什麼問題,我說有問題其他關係企業早就把我 K的滿頭包了,還需要等你們來問嗎? 這次的會議又沒有結論。

一直到隔了快幾個月後,客戶忽然都沒有再問過這個問題,我才去電問說,現在網路正常了嗎? 客戶才跟我說:「網路廠商後來發現是 core 上面對他們公司的那個 Port 有問題,流量到某個程度時就會 Hang 住,但是連線並不會中斷,後來換掉就沒問題了」

我當時心裏想說,那你們為何也不告訴我,我這幾個月的冤情要找誰討,每次開會就把問題指到我這裏來。解決了還要我來問才肯說。不過可以高興的是終於找到原因,而且不是我管理不當造成的。我還真是個容易滿足的人啊....

2010年8月9日 星期一

第十三回 Oracle 10g 的 BlockRecover

在剛剛某海運公司的問題處理過後,同樣該公司關係企業打來說他們的資料庫因為 Filesystem 一直有問題造成 HA 切換會失敗,所以在週六他們有請硬體廠商來做 FSCK ,當天做完沒問題,一直到過了星期天和今天星期一一整個上午後,Oracle 在某些 DML 會出現錯誤訊息,表示發生 Block Corruption 。原本我還在處理 RMAN 問題時,就己經把 Paper 整理給客戶請他們先試試看,可是一直到接近 16:00 時,客戶又打來問說我們能不能過去看看,反正也在附近,所以我和同事就開車過去了。此時心裏還在盤算著說,其實 Block Recover 我也只聽說過,有這個概念,實做還是沒做過的,而且怎這麼巧,最近翻的一本書裏才有說明類似的狀況,馬上就被我遇到。

到客戶端後,首先坐在電腦前,我先看了一下 v$database_block_corruption 這個 view 的內容,並沒有東西,因為在 FSCK 之後,Oracle 還能被啟動,而且 Application 也正常的運作,只是針對某些 Block 做 Access 時會出現 Block Corruption 的錯誤,同時在 FSCK 之後,當天的 RMAN 備份和今天的備份都失敗了。而且這個 view 只有在備份過程或者是你在下 backup validate database 時,才會去掃描整個資料庫,做 block 確認的動作,我如果不知道這個東西,以往可能會用 dbv 這個工具來掃。我先檢查 alert log ,發現確實有幾個 Block 在 Access 時被標記出來,首先針對這幾個 block 先以 blockrecover 指令測試看看是否有效,還原了兩個 block 之後,我決定使用 RMAN 的 backup validate database 整個全部掃描一次,預估需要 20 分鐘左右後,再去確認 v$database_block_corruption ,結果裏面有約 18 個 block 被標記出來。

有標記出來後就簡單了,只要使用 blockrecover corruption list , RMAN 就會參考這個 view 的內容去做 block recover ,又花了約半小時將資料庫還原後,我決定再將 Oracle database 備份一次,原因有二,一是確認資料庫可以整個被 RMAN 備份下來,二是在還原資料庫上線前,先確保這兩天的資料仍有被備份,所以將 Backup 送出去後,客戶也很客氣的邀我們先去用餐,約 40 分鐘後回來,資料庫確實的有被備份完成,將 Application 啟動後,我們就等待客戶測試,同時,雖然我 對 Solaris 並沒有很熟,還是無聊的下了 dmesg 看了一下,發現該 Filesystem 好像還是有問題,可能是有遺失的 inode ,因為客戶剛也有問到他有些檔案在 fsck 後不見了要怎麼比對找出來,個人覺得比對的工程龐大且無法準確,因此跟客戶解釋,如果每週對 ERP 都有做備份,無妨將 ERP 的整個 Home Directory 還原回來,包證 ERP 能像一週前一樣健康,不足的部份,貴公司的同仁一定有資料能查出這星期做了哪些變更再去調整即可,不然用比對方式再還原,可能你系統隨時會有未爆彈發生。在客戶檢查了約半小時後,大致上沒問題,我們才準備驅車回到台北。

第十二回 RMAN 在NBU 下備份效能時低落

今天和同事約好要去之前曾去美國出差過的某海運公司,原因是 NBU 透過 RMAN 備份時的效能有點奇怪,問題就是每次開始備份時,明明 Schedule 已經啟動了,而且 NBU 下的 Device 都閒置著,但是 RMAN 就是沒有動作, NBU 的狀態也沒有 LOG 表示有動作,必須要在過了 10~40分鐘不等的狀態下,才會將磁帶 Volume 掛載到磁帶館中,並開始做備份寫入動作。

因為同時間同一台資料庫下的同一個 Instance 也有 Archive Log 備份的工作剛正常結束,只有接之在後面的 Full Database Backup Schedule 有這個問題,所以把 RMAN 的 Scripts 整個叫出來看,其實也很一般就是正常的 RMAN Scripts 而己。

只不過這台資料庫主機內存在了兩個資料庫,其中一個備份的啟動是正常的,馬上可以取得備份的資源就開始做備份,只有我描述過那個資料庫會有問題,而這個資料庫的大小約 2.2TB ,剛開始我懷疑是因為這個資料庫比較大,所以在需要寫入前會有一些處理時間,但最短10分鐘,最長40分鐘,實在是太離譜了,別說是客戶,連我都無法接受,所以我花了一些時間查看這台資料庫在備份的時候到底在做什麼事,因為這台其實是 Product 的 Standby Database ,也就是 Database 的 Target 端,所以這台設備唯一的 Loading 就是傳輸 Archive Log 和 Apply Log 而己,特別對照了需要執行到 40 分鐘的那幾天有什麼特別的交易,看起來也沒有。

最後我比較了同一台資料庫下,兩個 Instance 登入到 RMAN 的方式,其中有問題的資料庫是使用 Catalog DB ,而沒有問題的那台則是 Nocatalog Mode 下面執行的。

所以我試著寫了一個備份該資料庫最小單一檔案的 RMAN Scripts 測試,分別使用 Catalog 和 Nocatalog Mode 去備,同樣的一個 20MB 的檔案,在Catalog Mode 之下,光 RMAN 在 Allocate Channel 指令送出去後,就沒有下文了,一直等到快 10 分鐘後,才有下一個作業被呼叫,且連備份完成後 Release Channel 的動作也是慢到無法接受;而在 Nocatalog Mode 之下處理時,則是一 Allocate Channel 後就開始備份,所以我想起了多年前那家書局 Catalog 久未維護所造成的問題,因此我就跟客戶先解釋一下可能發生的原因,然後詢問了上次整理 Catalog DB 的時間,客戶說並不是很清楚,只記得以前有重整過。

所以這下原因找到了,一樣就是 Catalog 未整理的狀態下,不只 Restore 時的效果非常差,連備份都會受到影響,雖然重整 Catalog DB 沒什麼了不起的,我還是決定先判定原因,待下次大家有機會開個會坐下討論時,再說明一次這件事後再來做處理,以免以後大家又忘記了。

最後因為該公司另一家關係企業的資料庫發生問題,我們要趕過去看,所以就先走了。這件事就這樣處理完畢。

2010年7月30日 星期五

第十一回 2004 年我去美國的那幾天

2004年10月,因為某海運公司買了當時全世界算起來算是數一數二的超級計算機,要將原來的 Oracle Single Instance 變為 RAC,所以去了一次美國紐約。

英文很爛,技術也算是還好的我,當時能夠被挑中飛去裝機,完全也是意外,連回來後英文老師期末考考英文自我介紹(那時還在唸二技的進修班),在我背了一大堆我準備好的文稿之後,老師只用英文問我說,你去美國是幹麼,因為我英文真的很爛,所以答不出來,老師又問,你去美國只需要打電腦就好了嗎? 都不用說話嗎? 只好硬擠了幾個字出來,還好老師最後還是讓我過了。

當時這次的經驗也是挺特別的,當時 911 剛發生滿一年多,所以那時的海關仍然很嚴格,光在台灣辦簽證我就覺得超級麻煩,雖然我是去工作,但是客戶那邊不肯發給我們工作證明,所以我們不能辦工作簽證,只能用觀光簽證進去,去辦簽證時,美國在台協會問我要去哪裏,我只說了一句拉斯維加斯他就蓋章了,旁邊比我早面談看起來要去遊學的,因為英文很好就被問了一大堆,看來辦美國簽證時,就算你英文再好,也是裝死比較容易拿到。

又扯遠了,這次去美國安裝的主機,其實是備援台灣這邊的同樣架構的備援系統,這家海運公司租了兩條 T1 的海纜,透過 Oracle 的 Dataguard 技術,達成了資料庫遠端備援,但其實在系統仍在 Single Instance 測試時,以這家公司的規模和交易量,兩條 T1 的頻寬仍是不足以傳輸實際的交易量的,所以我們在 DataGuard 的傳輸處理上,有特別的動了一些手腳,將之改為手動的批次壓縮傳輸,以節省頻寬,將這隻手動程式排入 crontab 後,就可以定時自動化傳輸了,而且我們也將兩邊資料庫的交易配置成相差六個小時,以防止有人為錯誤誤刪資料時,還可以去備援端將資料趕緊的匯出再匯回,就算 Primary 端發生災難,備援端追回六小時的交易大約要 1 小時的時間,這樣子 RPO 跟 RTO 是客戶可認可的。所以後來就這樣子設計了。

裝機的過程所幸還挺順利的,只是因為時差跟台灣相差了快 16 小時,通常我們在工作時,台灣這邊的同事在睡覺,他們睡覺時就輪到我們工作,每天有重疊到的時間了不起也二、三個小時,把前一天的工作交接後,他們就去休息了。只是光 Dataguard 要使用的 source ,就是 Primary 端的 RMAN 備份檔,我記得好像快 500GB 以上吧,當時光傳檔就需要八個小時,因為一次建立失敗,只好又重傳一次,還好最後有建起來就是了。不過這家海運公司真的很精實啊。

我還在台灣寫工作計劃時,原本只寫週一到週五,結果客戶問,那你們六、日要做什麼,我差一點就說六、日休息啊,還好沒說出口,後來就更改計劃內容,把一整個星期填的滿滿的。所以我們是真的星期六、日都還在機房工作,就連最後一天要上飛機的當天,早上從旅館退房出來後,還是去機房做最後的工作,一直到上飛機的前幾個小時才離開機房去機場報到,後來這幾年看到鴻海經常被報導說他們出差都是下飛機就去工作了,一直工作到要上飛機前都還在做,說到底我們也是這樣子的啊。其實中間有個假日客戶還是有帶我們有抽空跑去紐約州的隔壁,維吉尼亞州去逛了一下,後來又往南開去了大西洋城的賭場參觀。體驗了一下美國真的是地大到可怕,高速公路也是又大又直,只是過路費我們四個人 Share 下來,真的是不便宜,所以要在大蘋果生活還真的是不容易呢...。

2010年7月20日 星期二

聽我在放屁 CASE2 我如果去了 User Site ,我絕不用 RAC ,也不想用 HA

RAC 是 Oracle Database 的一個特性,可以用來提昇高可靠度和系統延展性,在理論上這兩個指數提昇的話,系統管理人員應該是高枕無憂了才對,但是事情絕對不是你我想的那麼簡單。

基本上兩部主機之間要高速存取資料庫,且有辦法互換資料,依賴的就是兩部主機之間的網路,而 Storage 層級,只是個儲存媒介,所以當主機從一台變成二台或三台,這兩部或三部主機間的網路就會由原本的2或3條,變為 4 或 9條,更多的線路,更多的卡片,更複雜的架構,硬體成本不算好了,這些管理成本都會落在系統人員身上,而且元件愈多,反而單一元件出錯的可能性變高了,我這邊說的出錯不是硬體元件壞掉,如果是斷線或損壞,那是個小問題,因為備援機制啟動後,這些問題都能被接手掉,但是如果是壞一半,半壞不壞,時通時不通的,時快時慢你就頭大了。這些問題都可能造成 RAC 的不穩定,效能變差,動不動就當機,而且問題有時還不只來自於硬體。

所以 Oracle RAC 架構在維護時需要上的 Patch 和 Update 大概是 Single Instance 時的數倍,而且可能經常性的需要關切及更新。所以基本上這個東西除非我所待的那個地方的資料庫己經大到無法用目前世界最大的伺服器去支撐他的需求,不然我大概是不會用的。因為那所帶來的,就是未來不知原因的當機,可能來自於時間同步,網路限制,單一伺服器的問題,還有很多可能完全找不到原因的當機,反正就是忽然一個 Node 不見,不然就忽然 Hang 住。我相信目前我見過的 RAC 在高可靠度這點是不及格的。

至於 HA Solution ,雖然有 HA 可以在最短的時間內讓你因主機硬體損壞將服務切換到另一部主機,但是如果你有心架了 HA,卻從來不驗證,那你這個 HA 在建置完成半年至一年後,就有可能是不會運作的,尤其是當你特別有心,設置了另一部機器平常還真的沒在 Run 什麼服務,只為了接手 Product ,那這個從來沒被驗證過的機制,大概有 6 成的機率是不會動的,為了這個機制特別買的機器結果只是插著浪費電而已,每年還要繳給原廠保護費,多划不來。

另外在有 HA 機制存在時,如果 Product 發生了 Outstge ,如果順利的話,系統會在 5 分鐘內被重新啟動,但這只限於 Product 本身的硬體壞掉,還有其他狀況是無法避免的,如果沒有重新啟動,我通常會有2種選擇:

1. 直接設法略過 HA 的機制,將服務啟動,盡最快的速度恢復服務讓使用者使用,至於 HA 機制,可能就另外安排時間將之恢復。
2. 設法恢復 HA 機制,將服務由 HA 啟動,此時可能會面臨很多問題,所需花費的修復時間,要視 HA 機制設定完成後,系統變做了多少變更而定,或是因為發生故障原因而定,所要花費的時間可能是第一種選擇的數倍以上。

至於發生 Outage 的原因,可能來自於系統內部,如系統軟體 Bug、應用程式 Bug 、硬體、韌体或系統外部如網路環境、SAN 環境、機房環境、電源種種原因造成,尤其在很多狀況下,很多公司在做 HA 機制時,通常還是只會保護主機本身,網路就沒有那麼重要了,其實很多時間就網管人員而言是他們是最重要的一個部份,通常一個機房如果要做整體維修,就系統而言,網路人員是最辛苦的,因為他們在最底層,關機時是最後關的,開機時又要第一個開起來,等所有系統開機完成無誤,網管人員才能夠休息。

題外話扯遠了,還是回到主題,其實就 Single Instance 我有信心可以維持好一定的可靠度,因為單純,當老闆有心投資到 IT 想要做一些防護時,我會建議他將錢投資在異地備援及備份上面,而不必去考慮自動化的備援環境,理由有幾個:

1.不是自動化的環境,就會有標準 SOP 的產出,在每次的驗證去修改,將 SOP 愈修愈是完整,總而言之主旨是不變的,程序上的修改也不會太大,除非系統是整個架構被翻掉
2.投資在異地備援,資料和系統都會有一定程度的保護,不像部份 HA 機制,只能保護到主機的部份,資料是未受到保護的。如果是主要機房受到天災人禍攻擊,就一般的主機端備援HA機制而言,是沒有任何用處的。
3. 依賴 HA 自動接手的機制,雖然還是會有 SOP,但可能發生的例外會較自己手動切換多的太多 ,而省下的時間頂多是從 30 分鐘縮短至5分鐘,而且自動化的程式也是人寫的,出錯誤判的機率仍然是存在的,與其將之投資在系統主機這端,個人還是認為不如去補強網路的 HA 或是異地備援上會更有效率。

這些心得都是在接觸了大量的 HA 環境後產生的,目前我約建置了快50套的 HACMP 環境,10套的 MSCS 環境,手上曾經維護過的也有 RHCS 和 MC Service Guide 環境,不過這就未實際參與建置。

當然以上所言,隨著科技的進步,一定會有成熟的一天,所以目前只能說就產品而言,仍然還是不成熟的。

2010年7月14日 星期三

第十回 我是系統工程師,我不是劉謙....

上週五時和另一台同事去某外商銀行操作設定 AS/400 在 Tivoli Storage Server 上的備份,在我完成沒多久後,我去檢查客戶目前 TSM 的備份狀況,結果發現客戶的磁帶機終於在上線一年多後,兩個 Driver 都己經髒了,無法再讀取和寫入任何一捲磁帶的資料,因此日常的備份己經五、六天沒備份了。這個問題我己經在幾個月前就提出警告,但是客戶都沒有處理,一直到今天。

因為Driver 髒了也不是什麼大不了的事,就放清潔帶進去清潔就好了,我馬上回報客戶,這時他才跑去問機房人員,機房的人說其實他們一直都有清潔帶,只是沒人問過而己,馬上就幫我放進磁帶館中,讓我準備設定。

誰知上週大概是全省各大銀行年中的稽核,很多銀行這時都有稽核人員會來,沒提出需求申請,就算我再急也不能連線進去設定,因此從約 17:30起,我就一直在等客戶申請,一直到19:00了還沒下文,這時我己經想離開了。

但是客戶說沒有弄好不是未來備份還是有問題,所以不讓我走,我的媽啊,有問題不讓我做事,也不讓我走,那是怎樣,要我變魔術讓大家見證奇跡發生嗎? 我又不是劉謙。 而且 IT 只會有靈異事件,從來不會有發生見證奇跡的時刻發生。

我只好說那你們申請那個單子可以直接讓我進機房嗎? 我不要連線 Console ,以免到時有問題,我又得說要進機房去看那台設備,你們又要再提一次申請單,起先客戶還一直有疑慮看起來好像不太肯讓我進去,說那個機櫃有多重要多重要,後來想了半天才去申請單上更改,重新找到相關人員簽名後,我終於可以開工了。不過有趣的是,我在機房的這段時間,根本就沒人陪我,那這麼龜毛的 Security 到底是搞什麼鬼,堅持了半天還不是放我一個人在裏面亂搞。

等到整個搞定己經快 21:00 了,不過是清個磁帶,20分鐘就能搞定,在這裏要一等再等,搞到人快抓狂。我看我還是來去學特異功能,看哪天能不能練成用念力控制電腦算了。