ORACLE常見錯誤程式碼的分析與解決(轉)

gugu99發表於2007-08-13
ORACLE常見錯誤程式碼的分析與解決(轉)[@more@]

  ORA-01650:unable to extend rollback segment NAME by NUM intablespace NAME

  產生原因:上述ORACLE錯誤為回滾段表空間不足引起的,這也是ORACLE資料管理員最常見的ORACLE錯誤資訊。當使用者在做一個非常龐大的資料操作導致現有回滾段的不足,使可分配用的回滾段表空間已滿,無法再進行分配,就會出現上述的錯誤。

  解決方式:使用“ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size_of_file”命令向指定的資料增加表空間,根據具體的情況可以增加一個或多個表空間。當然這與還與你主機上的裸盤裝置有關,如果你主機的裸盤裝置已經沒有多餘的使用空間,建議你不要輕意的增加回滾段表空間的大小,可使用下列的語句先查詢一下剩餘的tablespace空間有多少:

  Select user_name,sql_text from V$open_cursor where user_name=’’;

  如果多餘的空間比較多,就可以適當追加一個大的回滾段給表空間使用,從而避免上述的錯誤。你也可以用以下語句來檢測一下rollback segment的競爭狀況:

  Select class,count from V$waitstat where calss in(‘system undo header’,’system undo block’,’undo header’,’undo block’);和Select sum(value) from V$sysstat where name in (‘db_block_gets’,’consistents gets’);

  如果任何一個class in count/sum(value)大於1%,就應該考慮增加rollback segment。

  相應的英文如下:

  Cause:Failed to allocate extent from the rollback segment in tablespace

  Action:Use the ALTER TABLESPACE ADD DATAFILE statement to add one or more files to the specified tablespace.

  ORA-01652:unable to extend temp segment by num in tablespace name

  產生原因:ORACLE臨時段表空間不足,因為ORACLE總是儘量分配連續空間,一但沒有足夠的可分配空間或者分配不連續就會出現上述的現象。

  解決方法:我們知道由於ORACLE將表空間作為邏輯結構-單元,而表空間的物理結構是資料檔案,資料檔案在磁碟上物理地建立,表空間的所有物件也存在於磁碟上,為了給表空間增加空間,就必須增加資料檔案。先檢視一下指定表空間的可用空間,使用檢視SYS.DBA_FREE_SPACE,檢視中每條記錄代表可用空間的碎片大小:

  SQL>Select file_id,block_id,blocks,bytes from sys.dba_free_space where tablespace_name=’’;返回的資訊可初步確定可用空間的最大塊,看一下它是否小於錯誤資訊中提到的尺寸,再檢視一下預設的表空間引數:

  SQL>SELECT INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,PCT_INCREASE FROM SYS.DBA_TABLESPACES WHERE TABLESPACE_NAME=name;

  透過下面的SQL命令修改臨時段表空間的預設儲存值:

  SQL>ALTER TABLESPACE name DEFAULT STORAGE (INITIAL XXX NEXT YYY);

  適當增大預設值的大小有可能解決出現的錯誤問題,也可以透過修改使用者的臨時表空間大小來解決這個問題:

  SQL>ALTER USER username TEMPORARY TABLESPACE new_tablespace_name;

  使用ALTER TABLESPACE命令,一但完成,所增加的空間就可使用,無需退出資料庫或使表空間離線,但要注意,一旦新增了資料檔案,就不能再刪除它,若要刪除,就要刪除表空間。

  一個報錯例子如下:

  ORA-1652:unable to extend temp segment by 207381 in tablespace TEMPSPACE

  相應的英文如下:

  Cause: Failed to allocate extent for temp segment in tablespace

  Action:Use the ALTER TABLESPACE ADD DATAFILE statement to add one or more files to the specified tablespace or create the object in another tablespace.

  產生原因:當ORACLE訪問一個資料塊時,由於1、硬體的I/O錯誤;2、作業系統的I/O錯誤或緩衝問題;3、記憶體或paging問 題;4、ORACLE試圖訪問一個未被格式化的系統塊失敗;5、資料檔案部分溢位等上述幾種情況的一種引起了邏輯壞塊或者物理壞塊,這時就會報ORA-01578的錯誤。

  解決方式:由於ORACLE只有在訪問到有問題的資料檔案時才會報錯,所以報錯的時間有可能會比實際出錯的時間要晚,如果ORA-01578出錯資訊提示資料壞塊指向的是使用者自己的資料檔案,則用以下方法來解決:

  如果透過下面的SQL語句查出的壞塊出現有索引上,則只需重建索引即可

  SQL>Select owner,segment_name,segment_type from dba_extents where file_id= and between block_id and block_id+blocks-1;(和分別是ORA-01578報出的壞塊出現的檔案號和塊號)

  如果壞塊出現在表上,先用以下語句分析是否為永久性壞塊(建議多執行一兩次,有助於鑑別資料壞塊是永久性的(硬碟上的物理壞塊)還是隨機性的(記憶體或硬體錯誤引起)):

  SQL>Analyze table validate structure cascade;

  執行該命令後,可能會出現以下的結果:

  ORA-01578:與原先錯誤資訊有相同的引數,為永久性的物理或邏輯壞塊;與原先錯誤資訊有不同的引數,可能與記憶體,page space和I/O裝置有關。如果使用者有此表的最新備份,那麼最好是用此備份來恢復此表,或者使用event 10231來取出壞塊以外的資料:

  <1>.先關閉資料庫

  <2>.編輯init.ora檔案,加入:

  event=”10231 trace name context forever,level 10”

  <3>.startup restrict

  <4>.建立一個臨時表:SQL>create table errortemp as select * from error;(error是壞表的表名)

  <5>.把event從init.ora檔案中刪掉並重起資料庫

  <6>.rename壞表,把臨時表rename成壞表的表名

  <7>.建立表上的INDEX等

  如果ORA-01578出錯資訊提示資料壞塊指向的是資料字典或者是回滾段的話,你應該立即與ORACLE公司聯絡,共同商量一個好的解決辦法。

  這裡所講的解決方法只是比較常見的一種,一些更為具體的解決辦法可以檢視一下ORACLE的故障解決手冊,那裡面有浞及使用ROWID方法來取出壞塊以外的資料的方法,這裡就不介紹了。

  相應的英文如下:

  Cause:The given data block was corrupted,probably due to program errors

  Action:Try to restore the segment containing the given data block,This may involve dropping the segment and recreating it,If there is a trace file,report the messages recorded in it to customer support.

  ORA-01628:max # of extents num reached for rollback segment num

  產生原因:這種錯誤通常為一個回滾段和一個表空間已經達到MAXEXTENTS引數設定的極限。要注意的是這個MAXEXTENTS不是該回滾段或表空間的硬體極限,硬體極限取決於資料庫建立時在init.ora檔案中指定的DB_BLOCK_SIZE引數的值。

  解決方法:使用SQL命令ALTER TABLESPACE…STORAGE(MAXEXTENTS XXXX)來增加 MAXEXTENTS,其中“XXXX”值必須大於錯誤資訊中所指的數值,但不能大於LARGEST MAXEXTENT的值,如果已經達到了LARGEST MAXEXTENT VALUE,解決的辦法就是重新建立較大的範圍尺寸,使用帶有選項COMPRESS=Y的Export工具匯出表,如果表空間有可用空間,先給表做一個備份,用alter tablespace tablespace_name更改其名字,然後再裝載表回資料庫。檢視其錯誤出現的地方,如果出現在回滾段或索引上,那麼必須將其刪除並重建,如果出現在臨時表空間,修改臨時表空間的儲存欄位,便可解決這個問題。

  一個報錯例子如下:

  ORA-1628:max # extents 50 reached for rollback segment RBS_1

  相應的英文如下:

  Cause: An attempt was made to extend a rollback segment that already has reached its maximum size or space could not be allocated in the data dictionary to contain the definition of the object.

  Action:If possible,increase the value of either the MAXEXTENTS or PCTINCREASE initialization parameters or find the data dictionary table lacking space and alter the storage parameters,as described in the Oracle8 Server Administrator’s Guide.

  產生原因:這種錯誤通常為ORACLE的內部錯誤,只對OSS和ORACLE開發有用。ORA-600的錯誤經常伴隨跟蹤檔案的狀態轉儲 (系統狀態和程式狀態),系統狀態儲存將包括ORACLE RDBMS持有的當前物件的資訊,程式狀態轉儲則將顯示特殊程式持有的物件,當程式符合了某錯誤條件時,經常是由於一些資訊取自它持有的一個塊,如果我們知道這些錯誤程式持有的塊,就容易跟蹤問題的來源。

  解決方法:一般來說出現這個錯誤我們本身是無法解決的,只有從提高系統本身各方面來解決這個內部問題,如增加硬體裝置,調整系統效能,使用OPS(當然OPS從某種意義上說並不是一種好的解決方式)等。ORA-600錯誤的第一個變數用於標記程式碼中錯誤的位置(程式碼中的每個部分的第一變數都不一樣),從第二個到第五個變數顯示附加資訊,告訴OSS程式碼在哪裡出現了錯誤。

  一個報錯例子如下:

  ORA-00600: internal error code, arguments: [1237], [], [], [], [], [], [], []

  相應的英文如下:

  Cause:This is a catchall internal error message for Oracle program exceptions.It indicates that a process has met a low-level,unexpected condition.Various causes of this message include:

  Time-outs(超時)

  File corruption(檔案太老)

  Failed data checks in memory(記憶體檢索失敗)

  Hardware,memory,or I/O errors(硬體、記憶體或者磁碟錯誤)

  Incorrectly restored files(錯誤的重建檔案)

  ORA-03113:end-of-file on communication channel

  產生原因:通訊不正常結束,從而導致通訊通道終止

  解決方法:

  1>.檢查是否有服程式不正常當機,可從alert.log得知

  2>.檢查sql*Net Driver是否連線到ORACLE可執行程式

  3>.檢查伺服器網路是否正常,如網路不通或不穩定等

  4>.檢查同一個網上是否有兩個同樣名字的節點

  5>.檢查同一個網上是否有重複的IP地址

  相應的英文如下:

  Cause:An unexpected end-of-file was processed on the communication channel.The problem could not be handled by the Net8,two task,software.This message could occur if the shadow two-task process associated with a Net8 connect has terminated abnormally,or if there is a physical failure of the interprocess communication vehicle,that is,the network or server machine went down.

  Action:If this message occurs during a commection attempt,check the setup files for the appropriate Net8 driver and confirm Net8 software is correctly installed on the server.If the message occurs after a connection is well established,and the error is not due to a physical failure,check if a trace file was generated on the server at failure time.Existence of a trace file may suggest an Oracle internal error that requires the assistance of customer support.

  ORA-00942:table or view does not exist

  產生原因:這是由於裝載的表或檢視不存在,多半是CATEXP.SQL還沒有執行,無法執行Export檢視,如果CATEXP.SQL已經執行,則可能是版本錯誤。

  解決方法:因為Import和Export共享的一些檢視是透過執行CATEXP.SQL來裝載的(它們具有相同的檢視),並不生成單獨的CATEXP.SQL,因而造成檢視與Export程式碼不同步,較難保持彼此之間的相容,使用者就必須建立自己的Export應用,從而避免ORA-00942的錯誤。

  相應的英文如下:

  Cause:The table or view entered does not exist,a synonym that is jnot allowed here was used,or a view was referenced where a table is required.Existing user tables and views can be listed by querying the data dictionary.Certain privileges may required to access the table.If an application returned this message,the table the application tried to access does not exist in the database,or the application does not have access to it.

  Action:Check each of the following:

  The spelling of the table or view name.

  That a view is not specified where a table is required

  That an existing table or view name exists.

  Contact the database administrator if the table needs to be created or if user or application priviledes are required to access the table.

  Also, if attempting to access a table or view in another schema,make certain thecorrect schema is referenced and that access to the object is granted.

  ORA-01598:rollback segment “name” is not online

  Cause:The rollback segment was taken offline either manually or by SMON.

  Action:Check the status of the rollback segment in DBA_ROLLBACK_SEGS.

  ORA-1636: rollback segment “name” is already online

  Cause:A rollback segment can only be used by one instance and an instance is trying to bring a rollback segment online that is already in use.

  Action:Check that the values set in the initialization parameter file for parameters

  ROLLBACK_SEGMENTS,ROLLBACK_SEGMENT_INITIAL,and ROLLBACK_SEGMENT_COUNT are correctly set for the instance whiththe problem,Also check that the instance is using the correct initialization parameter file.Make sure you are not confused about the difference between private and public rollback segments.See the Oracle8 Server Administrator’s Guide for more information about using rollback segments in paraller mode.

  上述錯誤均為我們在使用回滾段時比較常見的問題,ORA-01598指明當前使用的回滾段的狀態為“not online”,不能使用,將它改為“online”狀態即可使用;ORA-01636指明當前回滾段已經為“online”狀態,可以直接使用,不用再集合它。

  ORA-1636 signalled during: alter rollback segment rb00 online

  我們在做統計時還可能遇到下述問題:一個rollback segment的狀態為”Needs Recovery”的現象,這是由於ORACLE回退一個事物表中的沒有提交的事物時失敗所造成的。通常原因為一個datafile或者tablespace是在offline的狀態或者一個undo的目標被破壞或者rollback segment被破壞。解決的辦法是將所有的tablespace和datafile都置為online狀態,如果不能解決則做下面的工作:1>.在initsid.ora中加入event=”10015 trace name context forever lever 10”;2>.shutdown資料庫然後重啟;3>.在$ORACLE_HOME/rdbms/log下,找到startup時生成的trace file;4>.在trace檔案中,找到下列資訊“error recovery tx(#,#) object #”;5>.根據object#(與sys.dba_objects表中的object_id相同)在sys.dba_objects表中查出該object的名字;6>.將該object drop掉;7>.在init.ora檔案中將該rollback segment放回rollback_segments引數中,刪除event;8>.shutdown資料庫然後重啟。此時”Needs Recovery”的問題應該是完全解決了,否則就是rollback segment被破壞了。

  ORA-01688:unable to extend table name.name partition NAME by NUM in tablespace NAME

  產生原因:指定的tablespace空間已經被佔用滿,無法擴充套件。

  解決方法:使用“ALTER TABLESPACE ADD DATAFILE”命令增加檔案系統檔案和原始分割槽,或者增加INITIAL的大小(如:alter tablespace CDRS101 default storage(next 500M pctincrease 1))應該能夠解決,否則就是有人使用你的表空間上建立了一個比較大的資料檔案導致你的表空間不夠用。

  一個報錯例子如下:

  ORA-1688: unable to extend table RMMCDR.LOCAL_CDR partition LOCAL_CDR101 by 460800 in tablespace CDRS101

  相應的英文如下:

  Cause:An extent could not be allocated for a table segment in tablespace


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-953954/,如需轉載,請註明出處,否則將追究法律責任。

相關文章