TEMP表空間未建導致XMLTYPE型別內容讀取錯誤
今天一使用者環境說所有資料表中的xmltype型別,通過查詢語句看到如下結果:
例如表名ZLMXXXX的表中配置這個欄位是SYS.XMLTYPE,可以看到這個欄位所有值都是<Value Error>錯誤資訊,而不報錯的是因為該欄位是‘空’無內容的原因,仔細詢問使用者該問題出現前是否做了什麼操作,得到的回答是該資料庫由於硬體變更,進行了遷移,由於資料庫本身比較小,且遷移的環境平臺完全一樣,因此遷移的方式最原始簡單的是‘冷備份’恢復,但是遷移過來就發現所有XMLTYPE內容的欄位都出現錯誤,而其他欄位都沒有問題。
問題排查
一.檢查sys.xmltype TYPE是否缺失或者有效
由於所有XMLTYPE欄位都無法訪問,首先懷疑sys.xmltypeTYPE包是否在遷移的過程中損壞或者失效,如果該TYPE出現問題,肯定會導致所有該TYPE物件無法訪問,檢查物件狀態:
這裡我們看到沒有問題,如果出現問題,我們可以通過執行catproc.sql指令碼進行修復,具體操作如下:
Run catproc.sql andutlrp.sql as SYS.
sqlplus "/ assysdba"
startup upgrade
spool validate.log
@?/rdbms/admin/catproc.sql
@?/rdbms/admin/utlrp
spool off
shutdown immediate
startup
顯然我們這裡沒有問題,不需要進行修復,接下來該怎麼辦呢?
二.遷移環境檢查
由於使用者是採用冷備份恢復的方式進行遷移,按道理是最穩妥的遷移方式,如果環境一致,不太會出現問題,那麼估計是遷移恢復過程中出現了環境差異,我仔細檢測了作業系統、資料庫引數等,都沒什麼重大的發現,在檢測資料檔案的時候,發現因為安裝路徑的限制資料檔案的路徑進行了變更,進行檢測v$datafile也沒什麼問題,在檢查v$tempfile檢視的時候,發現該檢視下無內容,如下:
再次詢問使用者的遷移過程,告知由於源端和目標端資料檔案路徑變更,其採用再源端生成控制檔案指令碼,修改路徑後,然後在目標端重建控制檔案的方式進行的遷移,這種方法在處理路徑不一致的恢復是可行的,沒有錯,但是核對其建立過程中發現,其忘了臨時表空間檔案的新增,因為在控制檔案trace指令碼中,除了建立控制檔案本身,後面還有如下這句:
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE'D:\APP\ADMINISTRATOR\ORADATA\YDTEST\TEMP01.DBF'
SIZE176160768 REUSE AUTOEXTEND OFF;
ALTER TABLESPACE ZLTOOLSTMP ADD TEMPFILE'D:\APP\ADMINISTRATOR\ORADATA\YDTEST\ZLTOOLSTMP'
SIZE467664896 REUSE AUTOEXTEND OFF;
ALTER TABLESPACE SMITMP ADD TEMPFILE'D:\APP\ADMINISTRATOR\ORADATA\YDTEST\SMITMP01.DBF'
SIZE52428800 REUSE AUTOEXTEND OFF;
-- End of tempfile additions.
更改路徑後,補充執行這幾句語句,再次查詢v$tempfile檢視,有了結果,如下:
最後我們再回到之前的表,檢視XMLTYPE欄位已經正常,問題徹底解決,如下:
關鍵知識點
sys.xmltype:該TYPE可以通過指令碼重建,如果一旦失效,會導致所有XMLTYPE內容失效。另外臨時表同樣影響XMLTYPE物件的使用。
申明:原創,轉帖請註明出處