1. 程式人生 > >Oracle資料庫常見錯誤總結(一)

Oracle資料庫常見錯誤總結(一)

實際專案實踐過程中,經常會遇到一些形如“ORA-XXXX”的Oracle錯誤提示,此時,我們便會開啟百度、Google,搜尋相關技術解決方案。本系列博文的目的就在於,對常見的Oracle錯誤提示進行總結,不斷完善。

ORA-12560

這裡寫圖片描述

ORA-12560: TNS: protocol adapter error(SQLPLUS)
ORA-27101: shared memory realm does not exist(PL/SQL Developer)

(1)原因分析
在path環境變數中Oracle_home設定在client之後、且PL/SQL Developer設定正確的ORACLE_HOME和OCI DLL,使用sqlplus出現ORA-12560錯誤,PL/SQL Developer出現ORA-27101錯誤。

(2)解決方法(之一): 將ORACLE_HOME/bin放在CLIENT_HOME/bin之前,sqlplus命令和PL/SQL Developer均可正常使用。

(3)解決方法(之二): 資料庫連結字串有誤,修改連線字串。

ORA-28001

這裡寫圖片描述

解決方法(之一):
這個問題是由於Oracle 11G的新特性所致, Oracle 11G建立使用者時預設密碼過期限制是180天, 如果超過180天使用者密碼未做修改則該使用者無法登入。可通過:
SELECT * FROM dba_profiles WHERE profile=’DEFAULT’ AND resource_name=’PASSWORD_LIFE_TIME‘;
語句查詢密碼的有效期設定,LIMIT欄位是密碼有效天數。

在密碼將要過期或已經過期時可通過ALTER USER 使用者名稱 IDENTIFIED BY 密碼;語句進行修改密碼,密碼修改後該使用者可正常連線資料庫。長久對應可通過ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED語句將口令有效期預設值180天修改成“無限制”。出於資料庫安全性考慮,不建議將PASSWORD_LIFE_TIME值設定成UNLIMITED,建議客戶定期修改資料庫使用者口令。

ORA-01659

ORA-01659 無法分配超出5(或者其他數字)的MINEXTENTS** 

(1)原因:表空間已滿

(2)解決方法:使用SQLPLUS登陸命令修改,或進入Oracle Enterprise Manager Console手工修改ALTER DATABASE DATAFILE ‘C:\SDE.dbf’ AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED 或ALTER TABLESPACE SDE AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED

客戶端連線Oracle報錯

這裡寫圖片描述

這裡寫圖片描述

(1)問題分析

   關於這個問題,其出現的機會還是比較大。
   而且網上關於這個問題的回答也基本上有兩種不同的解決方式。

   **http://www.cnblogs.com/shunyao8210/archive/2011/11/16/2251302.html
   http://heisetoufa.iteye.com/blog/287714**

看完後,發現解決的方式有些混亂,竟然授權使用者有NETWORK SERVICE或Authenticated Users,而授權的目錄有ORACLE_CLIENT,也有ORACLE_HOME,即,其實網路上有4種解決方式(2種授權使用者與2種目錄授權的組合),讓人不知所措。

(2)問題探索
為此,我在我的電腦上進行了驗證,過程如下:

(一)、軟體環境:
(1) 作業系統:Windows 7 64位;
(2) Oracle環境:Oracle Server 64位,Oracle Client 64位。

(二)、實驗步驟:

1. 對ORACLE_CLIENT授權

(1) 設定NETWORK SERVICE使用者擁有oracle client目錄的讀取和執行、列出檔案內容、讀取、寫入許可權後,重啟IIS。
結果:錯誤提示依舊存在。
(2)使用Authenticated Users使用者賦予其上述許可權後,重啟IIS,錯誤消失。

此時,ORACLE_HOME沒有對NETWORK_SERVICE和Authenticated Users使用者賦予上述許可權。

2 對ORACLE_HOME授權

(1) 設定NETWORK SERVICE使用者擁有oracle HOME目錄的讀取和執行、列出檔案內容、讀取、寫入許可權後,重啟IIS,錯誤提示“System.Data.OracleClient 需要 Oracle 客戶端軟體 8.1.7 或更高版本”,去掉ORACLE_HOME目錄對NETWORK SERVICE使用者的授權;
(2)使用Authenticated Users使用者賦予其上述許可權後,重啟IIS,出現如下新的錯誤提示:

這裡寫圖片描述

3. 重新新增ORACLE_CLIENT對Authenticated Users使用者的授權,保留ORACLE_HOME目錄的許可權配置,
測試結果:錯誤消失,訪問正常!

4.  去掉ORACLE_HOME目錄的許可權配置,保留ORACLE_CLIENT對Authenticated Users使用者的授權,
測試結果:錯誤消失,訪問正常!

結論:
1. 只需對ORACLE_CLIENT對Authenticated Users使用者的授權,與ORACLE_HOME及其使用者許可權是否配置無關!
2. 對於網路上提供的:“將ORACLE_HOME目錄賦予NETWORK_SEVICE使用者相應許可權、並將NETWORK_SEVICE使用者加到使用者組Administrator裡” 的做法,在我的電腦上測試未通過。

這裡寫圖片描述

ORA-08002

ORA-08002:序列XXXX尚未在此程序中定義

(1)現象分析:
select sequence.currval from dual 時報“ORA-08002: 序列XXXX尚未在此程序中定義”。

(2)原因分析:未定義該序列;未初始化新定義的序列。

(3)解決方案:
在已經正確定義該序列前提下,使用sequence.nextval進行序列初始化

這裡寫圖片描述

PS:在序列作為自增長欄位的使用場景中,有時候會出現一個問題:即,將機器A上表的資料拷貝到另一個機器B上,而機器B上該表的序列值沒有被擴大、仍然保持資料表拷貝過來之前的值,那麼會出現“ORA-00001”錯誤提示。因為B機器上某個依賴序列新增、且該欄位有唯一性約束時,生成得值在資料表中已經存在,這時會違反唯一性約束。

ORA-12154

ORA-12154: TNS: 無法解析指定的連線識別符號

原因分析:

(1) 出現以上錯誤提示出現的原因之一,是在一臺電腦上同時安裝了oracle客戶端和資料庫服務,並且是先安裝客戶端,再安裝資料庫服務造成的,如果先安裝資料庫服務,再安裝客戶端就不會出現這種情況了;
(2) tnsnames.ora配置有誤;
(3) 資料庫連結字串有誤;

解決方法(之一) :
(1)配置Oracle服務端Net Manager,或者直接將Oracle客戶端的tnsnames.ora拷貝到服務端對應目錄;
(2)在path目錄中,將client的bin目錄放在ORACLE_HOME之前,且在使用PL/SQL Developer時,將其Connection的ORACLE_HOME配置為Client的主目錄;

ORA-28002

ORA-28002: the password will expire within 7 days
原因分析:

    Oracle 11G 普通使用者有個180天的預設密碼週期,使用者在安裝完資料庫後未對口令過期策略進行調整,當快過期的時候即會出現此提示。

解決方法(之一) :
(1) 檢視當前使用者的profile;
SELECT username,PROFILE FROM dba_users;
(2) 檢視其profile的有效期設定;
SELECT * FROM dba_profiles s WHERE s.profile=\’DEFAULT\’
AND resource_name=\’PASSWORD_LIFE_TIME\’;
(3) 修改密碼有效期為“無限制“;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
(4) 修改後,還沒有被提示ORA-28002警告的帳戶不會再碰到同樣的提示;已經被提示的帳戶必須使用alter user USERNAME identified by NEWPASSWORD再改一次密碼。

ORA-00119

這裡寫圖片描述

解決方法(之一) :
(1) 文字檔案開啟tnsnames.ora,找到ADDRESS;    
(2) 開啟資料庫安裝時建立的初始化pfile檔案,將其中的local_listener的value改為上述ADDRESS地址;
(3) 使用下述命令建立spfile: 
    startup pfile='D:\app\Mike\admin\orcl\pfile\init.ora.112620141540’;
    create spfile from pfile ='D:\app\Mike\admin\orcl\pfile\init.ora.112620141540’;
(4) 退出重新登入即可

BadImageFormatException. This will occur when running in 64 bit mode with the 32 bit Oracle client components installed

Stackoverflow給出的說法:

You’re using System.Data.OracleClient. This namespace has been deprecated and will be removed in a future version of .NET. Perhaps you are using a 32-bit version of that? It is also not part of the Oracle client, so whether you are using a 32-bit or 64-bit Oracle client is irrelevant.

ORA-32004

ORA-32004: 指定了廢棄/過時的引數

這裡寫圖片描述

原因分析:
根據提示,可以看出是該版本的資料庫在啟動時(具體來說,是啟動到nomount階段檢查引數時),發現有些引數設定已經過時,故出現ORA—32004錯誤(警告)。

解決辦法:

由於該錯誤(警告)是因為 “引數設定已經過時”,故通過如下步驟解決:
(1) 啟動到nomount階段,檢視alert日誌:如D:\app\Mike\diag\rdbms\orcl\orcl\alert\ log.xml;
(2) 找到對應的提示,如
![這裡寫圖片描述](https://img-blog.csdn.net/20160721100103062)
(3) 修改引數值、或解決錯誤

關於Oracle資料庫常見錯誤這部分內容,會在後續工作中陸續更新。

學海無涯,分享快樂,快樂分享!