通過shell指令碼新增備庫日誌

jeanron100發表於2016-08-17
今天下午的時候,準備順手寫一個簡單的指令碼,但是發現很多事情較真起來真是寸步難行。在寫指令碼的過程中碰到了太多的問題,很多時候感覺像要實現的功能更通用,就得做更多的檢查,更多的校驗也就意味著有更多的預先條件,這些條件裡面有些是規範和建議,有些是按照已有的配置情況,儘管如此,自己感覺還是缺少了太多的檢查。
  先來說說今天嘗試的簡單指令碼,就是給主庫新增standby logfile,這個需求聽起來非常簡單,都甚至在我的半自動化指令碼中隱去了,但是把這個需求要落到紙面上來,簡直了。
首先這個需求會涉及到下面的幾個資料字典。

V$LOGFILE裡是最全的資訊,可能有online logfile或者standby logfile,V$LOG裡面是線上日誌的資訊,V$STANDBY_LOG裡面是備庫日誌的資訊。
要新增備庫日誌,有很多的場景,比如已有了備庫日誌,那樣的話是在已有的基礎上新增,如果沒有則需要按照建議的樹目來新增,而新增的備庫日誌組成員是1個還是2個,這個不同的系統可能會差別很大,可以在v$logfile裡面檢視。
而如果日誌組參差不齊,同一個資料庫有的日誌組有1個成員,有的有2個成員,這種情況如果判斷,難度又得加大,而這個部分我是直接跳過了,因為這個得按照規範來,而不是指令碼來滿足這種特殊的場景。所以就如同我在開始所說的那樣,很多預備條件是規範和建議,有些需要參考已有的配置情況。
當然在實現的過程中,因為有一些判斷條件,所以自己就嘗試使用PL/SQL來實現,同時又需要包裝在shell裡面,感覺難度不是大了一點。在實現的時候最終還是發現理論上不可行,
因為需要新增多個日誌組,而且要根據日誌組成員的情況來動態生成SQL,這種二次動態的情況轉換過來也就是不滿足正規化,每一列都是不可分割的原子資料項,所以最後呼叫的時候有些問題,轉而使用了shell的方式,當然過程中也碰到了很多問題。
首先是得到日誌檔案的下標,當前最大的日誌組號和需要新增的日誌組數

然後嘗試了下面的來呼叫shell和PL/SQL

這樣會丟擲錯誤。
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 6
一種改進的思路就是下面的方式,分而治之,使用函式來迴圈迭代。

這種方式就會生成遞增的日誌建立語句,當然思路完成了,還得細化。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2123641/,如需轉載,請註明出處,否則將追究法律責任。

相關文章