ORACLE中一些問題的解決方法
2024-08-29 13:45:21
供稿:網友
Oracle中一些問題的解決方法
在ORACLE治理和應用中,難免出現一些問題。通常,ORACLE會顯示錯誤標號和簡短說明,我們可以根據顯示的信息去處理問題。但有時顯示的信息很少,處理起來有些麻煩。本文討論了這樣幾個問題,根據一些資料和經驗,提出了解決方法。
一、 ORA-00604 error occurred at recursive SQL level
這個信息表明,在數據庫執行內部SQL語句時,發生了錯誤。比如,要往表中插入一行數據,但沒有可擴展的空間。ORACLE于是去查尋,哪兒可以建立下一個擴展空間,它有多大小,但沒有成功。一般在發生ORA-00604錯誤時,還伴隨著其它的錯誤,例如:ORA-1547等。
首先,應當檢查警告文件alertSID.log,查找有關ORA-600類的信息。
該錯誤最常見的原因是數據庫文件initSID.ora中的參數OPEN_CURSORS值太小。可以修改initSID.ora文件,OPEN_CURSORS的值一般為255。修改完后,宕下ORACLE,再重新啟動。
還可以設置并啟動數據庫的事件跟蹤功能。在initSID.ora中加上一行:
event = "00604 trace name errorstack"
宕下并重新啟動ORACLE,使這個事件跟蹤參數起作用。這樣,當再發生ORA-604錯誤時,有關信息就保存在TRACE文件中。
造成ORA-604錯誤的其它原因可能有:
- initSID.ora中,參數DC_FREE_EXTENTS或ROW_CACHE_ENQUEUES太低。可以根據操作系統和數據庫的情況,適當增加這兩個參數的值,宕下并重新啟動ORACLE。
- 運行超出空間(伴隨ORA-1547錯誤)。這時,要對表空間添加新文件,即增加表空間的大小。
- 達到了MAX_EXTENTS(伴隨ORA-1556錯誤)。假如這樣,就要修改表,答應更多的擴展。請從技術手冊中查找MAX_EXTENTS的最大值。假如已經達到了最大值,必須用comPRess extents選項,把表卸出(eXPort),再導入(import)數據庫中。
二、ORA-03106 fatal two-task communication protocol error
這個信息表明,在ORACLE進行網絡通信工作時,發生了錯誤。比如,客戶應用程序使用SQL*NET訪問服務器數據庫時,不能進行,ORACLE顯示ORA-03106錯誤。
首先,應當檢查客戶應用與數據庫服務器之間的兼容性,這是ORA-03106錯誤中最常見的原因。現已發現,Developer/2000 V1.3預版與ORACLE V8.0.5 for Digital UNIX不兼容;ORACLE V7.0.1.6 for ScoUNIX與ORACLE V8.0.5 for Digital UNIX不兼容,等等。再檢查客戶應用與數據庫服務器之間的NLS(字符集)兼容性。前些年計算機上的中文字符集一般設置為ZHS16CGB231280,近幾年一般設置為ZHS16GBK,英文操作系統下的設置一般為US7ASCII。最好在系統安裝時,把字符集設置為同一種,這樣也方便數據庫之間數據的卸出和導入。
假如數據庫鏈路一直不通,并顯示ORA-03106錯誤,那么可能是SQL*NET的設置問題。要想使用數據庫鏈路,雙方數據庫文件InitSID.ora中GLOBAL_NAMES的值應當是FALSE,服務器上的文件TNSNAMES.ORA中要有對方的數據庫別名,該別名就是建立數據庫鏈路時使用的別名。尤其在雙機等組成的CLUSTER系統中,人們經常在TNSNAMES.ORA中只寫入帶有機器虛地址的數據庫虛別名,而忘記寫入帶有機器真地址的數據庫真別名。應當把實際應用所涉及到的數據庫別名都寫入TNSNAMES.ORA。
另外,InitSID.ora中OPEN_LINKS的值一般默認為4,在應用程序使用多個數據庫鏈路時,需要適當增加該值。
還可以設置并啟動SQL*NET的事件跟蹤功能,獲得發生ORA-03106錯誤時產生的有關信息,有針對性地解決問題。
在比較極端的情況下,該問題表明ORACLE所使用的共享內存段崩潰了。可能需要用abort選項宕下數據庫,并釋放所有的semaphores(UNIX下)。因為ORACLE使用semaphores來控制所有后臺進程的同步。Semaphores也用來控制用戶進程和影子進程之間的雙任務通信。由于該種情況下牽涉的問題比較復雜,可以將整個機器系統宕下,再重新啟動。
三、從ORACLE8卸出數據并導入ORACLE7中
從ORACLE7卸出的DMP文件,可以導入ORACLE8中;但從ORACLE8卸出的DMP文件,不能導入ORACLE7中。
假如用ORACLE7的實用程序,也不能卸出ORACLE8的數據。這對應用多種版本ORACLE的用戶是非常不方便的。
實際上,ORACLE8已經考慮到這一點。在服務器目錄$ORACLE_HOME/rdbms/admin 中,有個文件catexp7.sql,就是用來解決這個問題的。首先,在ORACLE8的服務器中,以SYS帳戶登入ORACLE,接著運行這個catexp7.sql文件。ORACLE系統于是建立一些卸出視圖,從而使得在卸出時,ORACLE8數據庫仿佛是ORACLE7數據庫。這時,就可以用ORACLE7實用程序直接卸出ORACLE8的數據,然后便可以順利地導入ORACLE7中。
在用ORACLE7實用程序直接卸出ORACLE8的數據時,有些屬于ORACLE8特性的東西卸不出來。具體的情況,可以參考有關的技術手冊,比如《Oracle8 Utilities》。
四、ORA-27101 Shared Memory Realm Does Not Exist
在出現上述錯誤信息時,一般還伴有錯誤信息:ORA-01034: ORACLE not available。原因是在同一個服務器上,使用了不同的ORACLE_HOME。該問題經常是在ORACLE8.1.7服務器版上出現的。
首先檢查文件initSID.ora和listener.ora等,看ORACLE_SID和ORACLE_HOME設置的正確與否,ORACLE8.1.7是否用該參數值啟動并運行。在UNIX環境中,字母大小寫的意義是不一樣的,這一點應當注重。假如ORACLE_HOME指向8.1.7版,而數據庫是用8.1.6版或8.1.5版建立的,也可能出現該種錯誤信息。
在WINDOWS系統中,假如修改了機器名或ip地址,ORACLE8.1.7啟動時使用的機器名或IP地址就不是真正的機器名或IP地址,就會出現該種錯誤。可以查看目錄database下的文件oradim.log,根據內容確定原因。
在涉及到域(DOMAIN)的服務器上,包括WINDOWS和UNIX,根據系統設置情況,可能需要在使用機器名時,后面添加域名。