天天看點

oracle 錯誤整理

ora-01789 <b>查詢塊具有不正确的結果列數</b>

      這個錯誤一般在執行表之間的相加(union),相減(minus)等SQL語句時發生。隻要将兩段SQL語句的列數調整一緻就可以解決了。

===========================================================

OCI-22053<b>overflow error</b>

     NET開發中使用微軟的System.Data.OracleClients通路ORACLE 資料庫時, 如果某字段的精度超出.NET的資料精度,就會發生OCI-22053錯誤.我個人解決OCI-22053錯誤溢出的方法是使用Oracle的函數TRUNC其具體的文法格式如下<b>         TRUNC(number[,decimals])<b>将length設定為NET允許的長度就OK 了</b></b>

==============================================================

無法加載DLL(OCI.DLL)

     這個問題出現一般是在新裝的Oracle資料庫,具體原因不太清楚。解決辦法也十分奇怪:首先确認oci.dll是否已經安裝到了機器上,如果沒有就需要拷貝一個或者重新安裝。oci.dll 的預設路徑應該是 X:\oracle\ora90\BIN 。然後打開他所在的檔案夾的屬性-&gt;安全,将你通路Oracle的帳戶的全部權限取消,然後确定。接着再打開安全把全部權限再選上,最後确定。如果你沒有安全頁籤那我就無能為力了。如果你不知道是哪個帳戶,那每個帳戶都做一次。如果你的權限複選框為不可改,那可以勾選拒絕也一樣。Good luck!

========================================================

ORA-01555: Snapshot too old<b>     這個錯誤很少見,跟系統設定有關系。實際的問題是對資料庫執行操作時,系統的復原段太小。引起的原因一般是執行SQL語句時間太長,執行過程中有復原記錄的操作太多。解決方法要麼是增大資料庫復原段空間,要麼更改SQL。</b>

======================================================

ORA-24338: 未執行語句句柄<b>     這個問題主要出現在使用資料庫遊标的時候.當執行存儲過程,傳回的遊标沒有打開時,可能會報這個錯.<b>open outCursor for select * from tempTab;<b>     遊标沒有打開的情況一般是忘記了寫打開遊标的語句,也可能是存儲過程中執行出錯,導緻最後遊标未打開</b></b></b>

===================================================

Tomcat不失為一個好的開發學習容器,但使用Oracle 11g自帶的JDBC驅動ojdbc6.jar和JDK6一起運作的時候,特别是和spring架構一起使用會報錯:SEVERE: Error while registering Oracle JDBC Diagnosability MBean.

這是Oracle Database 11g Release 1 (11.1.0.6.0) JDBC Drivers 的一個Bug。更新到11.1.0.7.0版本的驅動,則現象消失。

新版JDBC驅動下載下傳位址http://www.oracle.com/technology/global/cn/software/tech/java/sqlj_jdbc/htdocs/jdbc_111060.html

=========================================================

啟動oracle資料庫報錯:cannot mount database in exclusive mode

SQL&gt; conn /as sysdba<b>Connected to an idle instance.<b>SQL&gt; startup<b>ORACLE instance started.</b></b></b>

Total System Global Area 276824064 bytes<b>Fixed Size 778736 bytes<b>Variable Size 137371152 bytes<b>Database Buffers 138412032 bytes<b>Redo Buffers 262144 bytes<b>ORA-01102: cannot mount database in EXCLUSIVE mode</b></b></b></b></b>SQL&gt; shutdown immediate<b>ORA-01507: database not mounted</b>ORACLE instance shut down.GOOGLE一下,發現是lk&lt;SID&gt;檔案造成的,該檔案位于ORALCE_HOME下的dbs目錄下,馬上檢查該檔案:[root@qa-oracle dbs]# fuser -u lkNDMSQA<b>lkNDMSQA: 6666(oracle) 6668(oracle) 6670(oracle) 6672(oracle) 6674(oracle) 6676(oracle) 6678(oracle) 6680(oracle) 6690(oracle) 6692(oracle) 6694(oracle) 6696(oracle) 6737(oracle) 6830(oracle)</b>果然該檔案沒釋放,用fuser指令kill掉:[root@qa-oracle dbs]# fuser -k lkNDMSQA<b>lkNDMSQA: 6666 6668 6670 6672 6674 6676 6678 6680 6690 6692 6694 6696 6737 6830<b>[root@qa-oracle dbs]# fuser -u lkNDMSQA</b></b>然後:SQL&gt; startup<b>ORACLE instance started.</b>Total System Global Area 276824064 bytes<b>Fixed Size 778736 bytes<b>Variable Size 137371152 bytes<b>Database Buffers 138412032 bytes<b>Redo Buffers 262144 bytes<b>Database mounted.<b>Database opened.<b>SQL&gt;</b></b></b></b></b></b></b>資料庫成功OPEN.某系統突然掉電,系統啟動後發現Oracle無法啟動。啟動時報如下錯誤:

ORA-01102 cannot mount database in EXCLUSIVE mode<b>出現1102錯誤可能有以下幾種可能:</b>一、在HA系統中,已經有其他節點啟動了執行個體,将雙機共享的資源(如磁盤陣列上的裸裝置)占用了;二、說明Oracle被異常關閉時,有資源沒有被釋放,一般有以下幾種可能,1、 Oracle的共享記憶體段或信号量沒有被釋放;2、 Oracle的背景程序(如SMON、PMON、DBWn等)沒有被關閉;3、 用于鎖記憶體的檔案lk&lt;sid&gt;和sgadef&lt;sid&gt;.dbf檔案沒有被删除。首先,雖然我們的系統是HA系統,但是備節點的執行個體始終處在關閉狀态,這點通過在備節點上查資料庫狀态可以證明。其次、是因系統掉電引起資料庫當機的,系統在接電後被重新開機,是以我們排除了第二種可能種的1、2點。最可疑的就是第3點了。查$ORACLE_HOME/dbs目錄:$ cd $ORACLE_HOME/dbs<b>$ ls sgadef*<b>sgadef* not found<b>$ ls lk*<b>lkORA92<b>果然,lk&lt;sid&gt;檔案沒有被删除。将它删除掉</b></b></b></b></b>$ rm lk*<b>再啟動資料庫,成功。</b>如果懷疑是共享記憶體沒有被釋放,可以用以下指令檢視:$ipcs -mop<b>IPC status from /dev/kmem as of Thu Jul 6 14:41:43 2006<b>T ID KEY MODE OWNER GROUP NATTCH CPID LPID<b>Shared Memory:<b>m 0 0×411c29d6 –rw-rw-rw- root root 0 899 899<b>m 1 0×4e0c0002 –rw-rw-rw- root root 2 899 901<b>m 2 0×4120007a –rw-rw-rw- root root 2 899 901<b>m 458755 0×0c6629c9 –rw-r—– root sys 2 9113 17065<b>m 4 0×06347849 –rw-rw-rw- root root 1 1661 9150<b>m 65541 0xffffffff –rw-r–r– root root 0 1659 1659<b>m 524294 0×5e100011 –rw——- root root 1 1811 1811<b>m 851975 0×5fe48aa4 –rw-r—– oracle oinstall 66 2017 25076<b>然後它ID号清除共享記憶體段:</b></b></b></b></b></b></b></b></b></b></b></b>$ipcrm –m 851975<b>對于信号量,可以用以下指令檢視:</b>$ ipcs -sop<b>IPC status from /dev/kmem as of Thu Jul 6 14:44:16 2006<b>T ID KEY MODE OWNER GROUP<b>Semaphores:<b>s 0 0×4f1c0139 –ra——- root root<b>… …<b>s 14 0×6c200ad8 –ra-ra-ra- root root<b>s 15 0×6d200ad8 –ra-ra-ra- root root<b>s 16 0×6f200ad8 –ra-ra-ra- root root<b>s 17 0xffffffff –ra-r–r– root root<b>s 18 0×410c05c7 –ra-ra-ra- root root<b>s 19 0×00446f6e –ra-r–r– root root<b>s 20 0×00446f6d –ra-r–r– root root<b>s 21 0×00000001 –ra-ra-ra- root root<b>s 45078 0×67e72b58 –ra-r—– oracle oinstall<b>根據信号量ID,用以下指令清除信号量:</b></b></b></b></b></b></b></b></b></b></b></b></b></b></b>$ipcrm -s 45078<b>如果是Oracle程序沒有關閉,用以下指令查出存在的oracle程序:</b>$ ps -ef|grep ora<b>oracle 29976 1 0 Jun 22 ? 0:52 ora_dbw0_ora92<b>oracle 29978 1 0 Jun 22 ? 0:51 ora_dbw1_ora92<b>oracle 5128 1 0 Jul 5 ? 0:00 oracleora92 (LOCAL=NO)<b>… …<b>然後用kill -9指令殺掉程序</b></b></b></b></b>$kill -9 &lt;PID&gt;<b>總結:</b>當發生1102錯誤時,可以按照以下流程檢查、排錯:1.如果是HA系統,檢查其他節點是否已經啟動執行個體;<b>2.檢查Oracle程序是否存在,如果存在則殺掉程序;<b>3.檢查信号量是否存在,如果存在,則清除信号量;<b>4.檢查共享記憶體段是否存在,如果存在,則清除共享記憶體段;<b>5.檢查鎖記憶體檔案lk&lt;sid&gt;和sgadef&lt;sid&gt;.dbf是否存在,如果存在,則删除。</b></b></b></b>

============================================================

---------------------------ORACLE報錯:ora-12899-----------------------------------------

IMP-00019: 由于 ORACLE 錯誤 12899 而拒絕行 <b>IMP-00003: 遇到 ORACLE 錯誤 12899 <b>ORA-12899: 列 "JACKEYJ"."JK_REGISTER"."OPNAME" 的值太大 (實際值: 21, 最大值: 20)</b></b>

列 1 523 從9i環境下exp出來的資料,imp到10g資料庫的時候就出現這個錯誤。

解決方法:

修改oracle 10g的字元集 <b>Oracle <b>修改資料庫字元集為:ZHS16GBK <b>檢視伺服器端字元集SQL &gt; select * from V$NLS_PARAMETERS <b>修改:$sqlplus /nolog <b>SQL&gt;conn / as sysdba <b>若此時資料庫伺服器已啟動,則先執行 SHUTDOWN IMMEDIATE 指令關閉資料庫伺服器, <b>然後執行以下指令: <b>SQL&gt;shutdown immediate <b>SQL&gt;STARTUP MOUNT <b>SQL&gt;ALTER SYSTEM ENABLE RESTRICTED SESSION <b>SQL&gt;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0 <b>SQL&gt;ALTER SYSTEM SET AQ_TM_PROCESSES=0 <b>SQL&gt;ALTER DATABASE OPEN <b>SQL&gt;ALTER DATABASE CHARACTER SET ZHS16GBK <b>ERROR at line 1RA-12721: operation cannot execute when other sessions are active <b>若出現上面的錯誤,使用下面的辦法進行修改,使用INTERNAL_USE可以跳過超集的檢查: <b>SQL&gt;ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK <b>SQL&gt;SHUTDOWN IMMEDIATE <b>SQL&gt;STARTUP</b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b>

          今天加班,發現資料庫伺服器上的所有oracle服務都丢失了——也就是說在服務管理器中沒有oracle服務了,如OracleOraDb10g_home1TNSListener、OracleServiceORCL等服務都不見了。<b>          解決辦法:<b>          1、從另外一台安裝有oracle資料庫的機器上(要求oracle的版本一緻)的系統資料庫中導出所有的oracle服務。依次打開系統資料庫目錄HEY_LOCAL_MACHINE --&gt;</b></b> SYSTEM --&gt; ControlSet001 --&gt; Services,導出(在系統資料庫項上右鍵選擇“導出”)所有oracle的項:OracleDBConsoleorcl、 OracleJobSchedulerORCL、OracleOraDb10g_home1iSQL*Plus、 OracleOraDb10g_home1TNSListener、 OracleServiceORCL,儲存為*.reg檔案。<b>          2、把上一步中導出的系統資料庫檔案,導入伺服器上。把檔案拷貝到資料庫伺服器上逐個輕按兩下即可。<b>          3、修改導出的所有的系統資料庫項,主要修改資料庫執行個體(SID)名和資料庫安裝路徑。<b>          4、重新開機資料庫伺服器。<b>          5、啟動oracle的Net Manager工具,删除監聽程式LISTENER和服務命名中的本機的服務,并重建監聽程式和服務命名。<b>          6、啟動oracle服務即可。</b></b></b></b></b>

=======================================================

解決ORA-12560: TNS: 協定擴充卡錯誤,與大家共享

<b><b><b><b><b>今天遭遇ORA-12560: TNS: 協定擴充卡錯誤的問題,經過一番努力問題已經解決,與大家共享。<b>造成ORA-12560: TNS: 協定擴充卡錯誤的問題的原因有三個:<b>1.監聽服務沒有起起來。windows平台個一如下操作:開始---程式---管理工具---服務,打開服務面闆,<b><b>啟動oraclehome92TNSlistener服務。<b>2.database instance沒有起起來。windows平台如下操作:開始---程式---管理工具---服務,打開服務<b><b>面闆,啟動oracleserviceXXXX,XXXX就是你的database SID.<b>3.系統資料庫問題。regedit,然後進入HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0将該環境變量ORACLE_SI<b><b>D設定為XXXX,XXXX就是你的database SID.或者右幾我的電腦,屬性--進階--環境變量---系統變量--建立<b><b>,變量名=oracle_sid,變量值=XXXX,XXXX就是你的database SID.或者進入sqlplus前,在command line下<b><b>輸set oracle_sid=XXXX,XXXX就是你的database SID.<b>經過以上步驟,就可以解決問題。</b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b>

<b><b><b><b><b><b><b><b><b><b><b><b><b><b><b><b><b><b><b><b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b>

<b>     本文轉自My_King1 51CTO部落格,原文連結:http://blog.51cto.com/apprentice/1360608</b><b>,如需轉載請自行聯系原作者</b>

<b></b>