同僚在bind一個DB2程式時出現下面的錯誤:
DSNDBC.DSNDB01.DSNSPT02
DSNDBC.DSNDS06.DSNAPX01 無法通路
分析:
通過檢視資料庫object發現,這兩個檔案是DB2系統表的index space,但由于未知原因(REORG或者REBUILD失敗)導緻這兩個space無法通路。嘗試REBUILD,仍然失敗,錯誤碼和上面一樣,斷定VSAM檔案損壞。不知道怎麼修複,是以隻能手動将這兩個vsam檔案删除,重新define,然後再REBUILD這個index,應該可以解決。
下面這個截圖就是定義這兩個DB2系統data set的JCL,用的PGM就是大家耳熟能詳喜聞樂見的IDCAMS。PS:從定義的參數可以看出DB2用的VSAM檔案是LDS(Linear Data Set),曾經在主機上輝煌過的各種VSAM檔案,現在DB2隻用LDS,也可以了解,畢竟更多的邏輯結構控制交給DB2來控制了。
再次執行REBUILD,成功。重新執行bind,也成功了。
小結:
問題是解決了,可是這中間一絲一縷的關系不知各位是否能全部了然于心。為什麼兩個index space無法通路就會導緻Bind不成功,SQL無法執行呢?Google了一下,發現第一個space DSNDB01.DSNSPT02是DSNDB01.SPT的一個索引空間,而SPT01是DB2的一個Directory table space,裡面存放的是bound packages。第二個space DSNDB06.DSNAPX01是SYSIBM.SYSPLANAUTH這個表上的一個索引(SYSIBM.DSNAPX01)空間。這樣就解釋通了,當DB2把query bind到package裡的時候,會去通路SPT這個表空間,并且使用index的方式去通路,而 DSNSPT02這個index space已經損壞,導緻通路失敗,進而導緻bind package的失敗。第二步bind package到plan的時候,也是由于相同原因導緻不能通路SYSPLAN這個表,bind plan也失敗。
解決這個問題倒是沒有花太多時間,但是寫這篇文章卻費了點勁兒,還不知各位看官能否讀明白。現在有點明白,自己懂了不難,如何讓别人也明白把經驗share出來就有點難了,畢竟你要弄清楚所有的地方,理出頭緒,有邏輯地講給别人。OK,see u later!
另附一個定義DB2系統dataset的jcl,下載下傳後把字尾名改為txt就可以了。
下載下傳(請用浏覽器右鍵盤/目标另存為)