一個拷貝操作導致的潛在監聽類問題
最近為了統計一些伺服器的監聽使用情況,於是寫了一個簡單的指令碼,在中控中執行,指令碼邏輯很簡單,也沒有什麼亮點。
指令碼內容如下:
#check $1 is IP
base_dir=`pwd`
ssh $1 "ps -ef|grep smon|grep -v grep; ps -ef|grep tns|grep -v grep|grep -v netns" > $base_dir/tmp_checkdb.lst
echo '***DB instance as below***'
echo .
cat $base_dir/tmp_checkdb.lst|grep smon|grep -v grep|awk -Fsmon_ '{print $2}'
echo .
echo '***DB instance as below***'
echo .
cat $base_dir/tmp_checkdb.lst|grep tns|grep -v grep|awk -Ftnslsnr '{print $2}'|sed 's/-inherit//g'
指令碼的執行情況如下:
# sh checkdb.sh 10.127.133.xxx
***DB instance as below***
.
testdb
.
***DB instance as below***
.
listener_1532
listener_1523
listener_testdb_1525
listener_testdb_1528
listener_testdb_1529
listener_testdb_1539
listener_testdb_1535
listener_1521
listener_1522
看到這個結果能夠基本得到一個整體的服務概況,這臺伺服器上有哪幾個例項(包括ASM),對應的監聽埠有哪些,目前根據基本的規範,監聽器後是帶著相應的埠。
但是我看到某一臺伺服器的時候,突然發現了一個很奇怪的結果:
裡面有一行的結果如下:
listener_1532 lsnrctl start listener_1522
看到這個結果著實讓我有些摸不著頭腦了,到底是我解析的問題還是本身的監聽的問題,檢視細節的資訊。
系統級看到的程式情況如下:
$ ps -ef|grep tns
root 125 2 0 Apr26 ? 00:00:00 [netns]
oracle 15416 14816 0 16:26 pts/0 00:00:00 grep tns
oracle 56123 1 0 Jul14 ? 00:00:05 /U01/app/oracle/product/11.2.0.4/bin/tnslsnr listener_1532 lsnrctl start listener_1522 -inherit
oracle 56126 1 0 Jul14 ? 00:00:23 /U01/app/oracle/product/11.2.0.4/bin/tnslsnr listener_1522 -inherit
oracle 56131 1 0 Jul14 ? 00:00:23 /U01/app/oracle/product/11.2.0.4/bin/tnslsnr listener_testdb_1525 -inherit
。。。
可以看到這個監聽確實夠奇怪的,顯示是1532,同時後面還跟了1522的埠,到底是開啟了哪個埠呢。看到還有一個監聽器是listener_1522,可以基本判斷出1522是已經開通的,所以這個場景下開通的是1532埠。
因為這是一個線上業務系統,所以趕緊檢視了一下當時的後臺連線情況,沒有發現什麼異常,但是這種情況看起來非常彆扭,就想好好糾正過來,簡單評估了一下,發現這個埠的連線目前都是有一定的時間頻度,使用lsnrctl檢視監聽器的狀態,發現也沒有問題,不過為了穩妥起見,還是考慮要把這個問題矯正過來。所以打算使用最快的方式,Kill -9殺掉這個監聽的程式,然後迅速開啟這個1532的監聽器,評估之後就這麼操作了,沒有任何異常,而殺掉監聽器對於原來的連線來說也沒有什麼影響,所以很快就搞定了這個問題,但是這個問題留給我的疑問是,怎麼會出現這種情況呢,我決定復現一下這個問題,在測試之後發現原來這是一個潛在的操作問題。
lsnrctl start後面是跟一個監聽器名,相應的監聽器埠就可以成功開啟,這個場景的問題略有不同,其實是執行了這樣的操作:
lsnrctl start LISTENER_1522 lsnrctl start listener_1521
這樣一來,我們可以看出,原來lsnrctl沒有校驗後面的幾個引數,簡直就是無視了那些引數,這個做得確實不大合理啊。而這個問題的出現其實在從文字拷貝命令的時候如果拷貝不當,很容易出現這種序列的情況,也對我們手工操作敲響了警鐘。這些看起來影響不大的細節很重要,稍有不慎就會影響大局,細節決定成敗,就是這個道理。
指令碼內容如下:
#check $1 is IP
base_dir=`pwd`
ssh $1 "ps -ef|grep smon|grep -v grep; ps -ef|grep tns|grep -v grep|grep -v netns" > $base_dir/tmp_checkdb.lst
echo '***DB instance as below***'
echo .
cat $base_dir/tmp_checkdb.lst|grep smon|grep -v grep|awk -Fsmon_ '{print $2}'
echo .
echo '***DB instance as below***'
echo .
cat $base_dir/tmp_checkdb.lst|grep tns|grep -v grep|awk -Ftnslsnr '{print $2}'|sed 's/-inherit//g'
指令碼的執行情況如下:
# sh checkdb.sh 10.127.133.xxx
***DB instance as below***
.
testdb
.
***DB instance as below***
.
listener_1532
listener_1523
listener_testdb_1525
listener_testdb_1528
listener_testdb_1529
listener_testdb_1539
listener_testdb_1535
listener_1521
listener_1522
看到這個結果能夠基本得到一個整體的服務概況,這臺伺服器上有哪幾個例項(包括ASM),對應的監聽埠有哪些,目前根據基本的規範,監聽器後是帶著相應的埠。
但是我看到某一臺伺服器的時候,突然發現了一個很奇怪的結果:
裡面有一行的結果如下:
listener_1532 lsnrctl start listener_1522
看到這個結果著實讓我有些摸不著頭腦了,到底是我解析的問題還是本身的監聽的問題,檢視細節的資訊。
系統級看到的程式情況如下:
$ ps -ef|grep tns
root 125 2 0 Apr26 ? 00:00:00 [netns]
oracle 15416 14816 0 16:26 pts/0 00:00:00 grep tns
oracle 56123 1 0 Jul14 ? 00:00:05 /U01/app/oracle/product/11.2.0.4/bin/tnslsnr listener_1532 lsnrctl start listener_1522 -inherit
oracle 56126 1 0 Jul14 ? 00:00:23 /U01/app/oracle/product/11.2.0.4/bin/tnslsnr listener_1522 -inherit
oracle 56131 1 0 Jul14 ? 00:00:23 /U01/app/oracle/product/11.2.0.4/bin/tnslsnr listener_testdb_1525 -inherit
。。。
可以看到這個監聽確實夠奇怪的,顯示是1532,同時後面還跟了1522的埠,到底是開啟了哪個埠呢。看到還有一個監聽器是listener_1522,可以基本判斷出1522是已經開通的,所以這個場景下開通的是1532埠。
因為這是一個線上業務系統,所以趕緊檢視了一下當時的後臺連線情況,沒有發現什麼異常,但是這種情況看起來非常彆扭,就想好好糾正過來,簡單評估了一下,發現這個埠的連線目前都是有一定的時間頻度,使用lsnrctl檢視監聽器的狀態,發現也沒有問題,不過為了穩妥起見,還是考慮要把這個問題矯正過來。所以打算使用最快的方式,Kill -9殺掉這個監聽的程式,然後迅速開啟這個1532的監聽器,評估之後就這麼操作了,沒有任何異常,而殺掉監聽器對於原來的連線來說也沒有什麼影響,所以很快就搞定了這個問題,但是這個問題留給我的疑問是,怎麼會出現這種情況呢,我決定復現一下這個問題,在測試之後發現原來這是一個潛在的操作問題。
lsnrctl start後面是跟一個監聽器名,相應的監聽器埠就可以成功開啟,這個場景的問題略有不同,其實是執行了這樣的操作:
lsnrctl start LISTENER_1522 lsnrctl start listener_1521
這樣一來,我們可以看出,原來lsnrctl沒有校驗後面的幾個引數,簡直就是無視了那些引數,這個做得確實不大合理啊。而這個問題的出現其實在從文字拷貝命令的時候如果拷貝不當,很容易出現這種序列的情況,也對我們手工操作敲響了警鐘。這些看起來影響不大的細節很重要,稍有不慎就會影響大局,細節決定成敗,就是這個道理。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2122470/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AIX maxperm引數導致監聽問題AI
- Oracle監聽日誌過大導致的問題Oracle
- [轉]C++ 之 stl::string 寫時拷貝導致的問題C++
- struct的拷貝問題Struct
- WPF 已知問題 監聽 WMI 事件導致觸控失效事件
- start_udev導致監聽自動停止問題處理dev
- map物件拷貝問題物件
- 比較罕見的一個問題,磁碟檔案數目太多導致的LISTENER監聽起不來
- 導致 Scan VIP 和 Scan Listener(監聽程式)出現故障的最常見的 5 個問題
- Javascript 中的克隆(拷貝)問題JavaScript
- 關於vue事件監聽的一個問題Vue事件
- 一個Oracle監聽問題的網路排查Oracle
- 深拷貝和淺拷貝的區別是什麼?實現一個深拷貝
- rac 本地監聽問題導致資料斷斷續續連線
- C++---寫時拷貝解決深淺拷貝問題C++
- PHP 物件導向 - 物件的淺拷貝與深拷貝PHP物件
- 你以為面試官在問深拷貝的時候,僅僅是在問深拷貝嗎?面試
- 面試題 | 請實現一個深拷貝面試題
- 兩次拷貝操作的故事
- 深拷貝與淺拷貝的實現(一)
- 一文搞懂Java引用拷貝、淺拷貝、深拷貝Java
- 雲端計算潛在的五個問題
- oracle的監聽問題Oracle
- 網路問題導致10g CRS監聽服務offline 處理
- 關於sun Solaris的遠端拷貝的問題
- 在js中如何區分深拷貝與淺拷貝?JS
- Java中的深淺拷貝問題,你清楚嗎?Java
- 解決 Laravel 專案中使用 NPM 監聽程式碼改動導致 IDE 卡死的問題LaravelNPMIDE
- js的深拷貝和淺拷貝JS
- 物件的深拷貝與淺拷貝物件
- C++派生類的拷貝構造C++
- Dell PowerEdge RAID控制器存在一個潛在問題AI
- vue深拷貝淺拷貝Vue
- 關於oracle的監聽問題Oracle
- python 指標拷貝,淺拷貝和深拷貝Python指標
- 對深拷貝和淺拷貝的一些學習心得
- 操作字元、物件方法, 深淺拷貝字元物件
- JavaScript中的淺拷貝與深拷貝JavaScript