Oracle常見問題集(四)

发表于:2007-06-30来源:作者:点击数: 标签:
21. 用EXISTS替換DISTINCT 當提交一個包含一對多表資訊(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXIST替換 例如: 低效: SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO 高效: SELECT
21. 用EXISTS替換DISTINCT

當提交一個包含一對多表資訊(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT.

一般可以考慮用EXIST替換



例如:

低效:

SELECT DISTINCT DEPT_NO,DEPT_NAME

FROM DEPT D,EMP E

WHERE D.DEPT_NO = E.DEPT_NO

高效:

SELECT DEPT_NO,DEPT_NAME

FROM DEPT D

WHERE EXISTS ( SELECT ‘X’

FROM EMP E

WHERE E.DEPT_NO = D.DEPT_NO);



EXISTS 使查詢更爲迅速,因爲RDBMS核心模組將在子查詢的條件一旦滿足後,立刻返回結果.



22. 識別’低效執行’的SQL語句



用下列SQL工具找出低效SQL:



SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,

ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,

ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,

SQL_TEXT

FROM V$SQLAREA

WHERE EXECUTIONS>0

AND BUFFER_GETS > 0

AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8

ORDER BY 4 DESC;



(譯者按: 雖然目前各種關於SQL優化的圖形化工具層出不窮,但是寫出自己的SQL工具來解決問題始終是一個最好的方法)



23. 使用TKPROF 工具來查詢SQL性能狀態



SQL trace 工具收集正在執行的SQL的性能狀態資料並記錄到一個跟蹤文件中.

這個跟蹤文件提供了許多有用的資訊,例如解析次數.執行次數,CPU使用時間等.這些資料將可以用來優化你的系統.



設置SQL TRACE在會話級別: 有效



ALTER SESSION SET SQL_TRACE TRUE



設置SQL TRACE 在整個資料庫有效仿, 你必須將SQL_TRACE參數在init.ora中設爲TRUE,

USER_DUMP_DEST參數說明了生成跟蹤文件的目錄



(譯者按: 這一節中,作者並沒有提到TKPROF的用法, 對SQL TRACE的用法也不夠準確, 設置SQL

TRACE首先要在init.ora中設定TIMED_STATISTICS, 這樣才能得到那些重要的時間狀態.

生成的trace文件是不可讀的,所以要用TKPROF工具對其進行轉換,TKPROF有許多執行參數.

大家可以參考ORACLE手冊來瞭解具體的配置. )



24. 用EXPLAIN PLAN 分析SQL語句

EXPLAIN PLAN 是一個很好的分析SQL語句的工具,它甚至可以在不執行SQL的情況下分析語句.

通過分析,我們就可以知道ORACLE是怎麽樣連接表,使用什麽方式掃描表(索引掃描或全表掃描)以及使用到的索引名稱.

你需要按照從裏到外,從上到下的次序解讀分析的結果. EXPLAIN PLAN分析的結果是用縮進的格式排列的,

最內部的操作將被最先解讀, 如果兩個操作處於同一層中,帶有最小操作號的將被首先執行.

NESTED LOOP是少數不按照上述規則處理的操作, 正確的執行路徑是檢查對NESTED

LOOP提供資料的操作,其中操作號最小的將被最先處理.



譯者按:



通過實踐, 感到還是用SQLPLUS中的SET TRACE 功能比較方便.

舉例:



SQL> list

1 SELECT *

2 FROM dept, emp

3* WHERE emp.deptno = dept.deptno

SQL> set autotrace traceonly /*traceonly 可以不顯示執行結果*/

SQL> /

14 rows selected.

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 NESTED LOOPS

2 1 TABLE ACCESS (FULL) OF ‘’EMP‘’

3 1 TABLE ACCESS (BY INDEX ROWID) OF ‘’DEPT‘’

4 3 INDEX (UNIQUE SCAN) OF ‘’PK_DEPT‘’ (UNIQUE)



Statistics

----------------------------------------------------------

0 recursive calls

2 db block gets

30 consistent gets

0 physical reads

0 redo size

2598 bytes sent via SQL*Net to client

503 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

14 rows processed



通過以上分析,可以得出實際的執行步驟是:

1. TABLE ACCESS (FULL) OF ‘’EMP‘’

2. INDEX (UNIQUE SCAN) OF ‘’PK_DEPT‘’ (UNIQUE)

3. TABLE ACCESS (BY INDEX ROWID) OF ‘’DEPT‘’

4. NESTED LOOPS (JOINING 1 AND 3)

注: 目前許多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了極其方便的EXPLAIN

PLAN工具.也許喜歡圖形化介面的朋友們可以選用它們.

25. 用索引提高效率

索引是表的一個概念部分,用來提高檢索資料的效率. 實際上,ORACLE使用了一個複雜的自平衡B-tree結構.

通常,通過索引查詢資料比全表掃描要快. 當ORACLE找出執行查詢和Update語句的最佳路徑時, ORACLE優化器將使用索引.

同樣在聯結多個表時使用索引也可以提高效率. 另一個使用索引的好處是,它提供了主鍵(primary key)的唯一性驗證.

除了那些LONG或LONG RAW資料類型, 你可以索引幾乎所有的列. 通常, 在大型表中使用索引特別有效. 當然,你也會發現,

在掃描小表時,使用索引同樣能提高效率.

雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價. 索引需要空間來

存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改. 這意味著每條記錄的INSERT ,

DELETE , UPDATE將爲此多付出4 , 5 次的磁片I/O .

因爲索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢.



譯者按:

定期的重構索引是有必要的.

ALTER INDEX REBUILD



26. 索引的操作



ORACLE對索引有兩種訪問模式.



索引唯一掃描 ( INDEX UNIQUE SCAN)



大多數情況下, 優化器通過WHERE子句訪問INDEX.



例如:

表LODGING有兩個索引 :

建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER.



SELECT *

FROM LODGING

WHERE LODGING = ‘ROSE HILL’;



在內部 , 上述SQL將被分成兩步執行, 首先 , LODGING_PK 索引將通過索引唯一掃描的方式被訪問 ,

獲得相對應的ROWID, 通過ROWID訪問表的方式 執行下一步檢索.

如果被檢索返回的列包括在INDEX列中,ORACLE將不執行第二步的處理(通過ROWID訪問表). 因爲檢索資料保存在索引中,

單單訪問索引就可以完全滿足查詢結果.

下面SQL只需要INDEX UNIQUE SCAN 操作.



SELECT LODGING

FROM LODGING

WHERE LODGING = ‘ROSE HILL’;



索引範圍查詢(INDEX RANGE SCAN)

適用於兩種情況:

1. 基於一個範圍的檢索

2. 基於非唯一性索引的檢索



例1:



SELECT LODGING

FROM LODGING

WHERE LODGING LIKE ‘M%’;



WHERE子句條件包括一系列值, ORACLE將通過索引範圍查詢的方式查詢LODGING_PK . 由於索引範圍查詢將返回一組值,

它的效率就要比索引唯一掃描

低一些.



例2:



SELECT LODGING

FROM LODGING

WHERE MANAGER = ‘BILL GATES’;



這個SQL的執行分兩步, LODGING$MANAGER的索引範圍查詢(得到所有符合條件記錄的ROWID)

和下一步同過ROWID訪問表得到LODGING列的值.

由於LODGING$MANAGER是一個非唯一性的索引,資料庫不能對它執行索引唯一掃描.



由於SQL返回LODGING列,而它並不存在於LODGING$MANAGER索引中,

所以在索引範圍查詢後會執行一個通過ROWID訪問表的操作.



WHERE子句中, 如果索引列所對應的值的第一個字元由通配符(WILDCARD)開始, 索引將不被採用.



SELECT LODGING

FROM LODGING

WHERE MANAGER LIKE ‘%HANMAN’;



在這種情況下,ORACLE將使用全表掃描.

27. 基礎表的選擇

基礎表(Driving Table)是指被最先訪問的表(通常以全表掃描的方式被訪問). 根據優化器的不同,

SQL語句中基礎表的選擇是不一樣的.

如果你使用的是CBO (COST BASED

OPTIMIZER),優化器會檢查SQL語句中的每個表的物理大小,索引的狀態,然後選用花費最低的執行路徑.

如果你用RBO (RULE BASED OPTIMIZER) , 並且所有的連接條件都有索引對應, 在這種情況下,

基礎表就是FROM 子句中列在最後的那個表.

舉例:

SELECT A.NAME , B.MANAGER

FROM WORKER A,

LODGING B

WHERE A.LODGING = B.LODING;

由於LODGING表的LODING列上有一個索引, 而且WORKER表中沒有相比較的索引, WORKER表將被作爲查詢中的基礎表.



28. 多個平等的索引

當SQL語句的執行路徑可以使用分佈在多個表上的多個索引時, ORACLE會同時使用多個索引並在運行時對它們的記錄進行合併,

檢索出僅對全部索引有效的記錄.

在ORACLE選擇執行路徑時,唯一性索引的等級高於非唯一性索引. 然而這個規則只有

當WHERE子句中索引列和常量比較才有效.如果索引列和其他表的索引類相比較. 這種子句在優化器中的等級是非常低的.

如果不同表中兩個想同等級的索引將被引用, FROM子句中表的順序將決定哪個會被率先使用.

FROM子句中最後的表的索引將有最高的優先順序.

如果相同表中兩個想同等級的索引將被引用, WHERE子句中最先被引用的索引將有最高的優先順序.

舉例:

DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.

SELECT ENAME,

FROM EMP

WHERE DEPT_NO = 20

AND EMP_CAT = ‘A’;

這裏,DEPTNO索引將被最先檢索,然後同EMP_CAT索引檢索出的記錄進行合併. 執行路徑如下:



TABLE ACCESS BY ROWID ON EMP

AND-EQUAL

INDEX RANGE SCAN ON DEPT_IDX

INDEX RANGE SCAN ON CAT_IDX



29. 等式比較和範圍比較

當WHERE子句中有索引列, ORACLE不能合併它們,ORACLE將用範圍比較.



舉例:

DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.

SELECT ENAME

FROM EMP

WHERE DEPTNO > 20

AND EMP_CAT = ‘A’;



這裏只有EMP_CAT索引被用到,然後所有的記錄將逐條與DEPTNO條件進行比較. 執行路徑如下:

TABLE ACCESS BY ROWID ON EMP

INDEX RANGE SCAN ON CAT_IDX



30. 不明確的索引等級



當ORACLE無法判斷索引的等級高低差別,優化器將只使用一個索引,它就是在WHERE子句中被列在最前面的.

舉例:

DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.



SELECT ENAME

FROM EMP

WHERE DEPTNO > 20

AND EMP_CAT > ‘A’;



這裏, ORACLE只用到了DEPT_NO索引. 執行路徑如下:



TABLE ACCESS BY ROWID ON EMP

INDEX RANGE SCAN ON DEPT_IDX



譯者按:

我們來試一下以下這種情況:

SQL> select index_name, uniqueness from user_indexes where

table_name = ‘’EMP‘’;



INDEX_NAME UNIQUENES

------------------------------ ---------

EMPNO UNIQUE

EMPTYPE NONUNIQUE



SQL> select * from emp where empno >= 2 and emp_type = ‘’A‘’ ;



no rows selected

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF ‘’EMP‘’

2 1 INDEX (RANGE SCAN) OF ‘’EMPTYPE‘’ (NON-UNIQUE)



雖然EMPNO是唯一性索引,但是由於它所做的是範圍比較, 等級要比非唯一性索引的等式比較低



ORACLE9i 的透明閘道的配置

ORACLE實現異種資料庫連接服務的技術叫做透明閘道(Transparent Gateway)。

目前ORACLE利用透明閘道可以實現和SQL SERVER、SYBASE、DB2等多種主流資料庫的互聯。

筆者由於工作需要,通過oracle訪問sybase資料庫,把配置oracle9i TRANSPARENT GATEWAY FOR

SYBASE

的步驟寫成文檔,供需要的網友參考!

配置TRANSPARENT GATEWAY FOR SYBASE步驟

1.

oracle所在伺服器上安裝sybase client(或者在同一台server上安裝oracle、sybase伺服器)

確保能夠訪問sybase資料庫

2.

安裝TRANSPARENT GATEWAY FOR SYBASE選件,要用自定義安裝。

正確選擇sybase的安裝目錄

3.

選擇一個sid字串準備賦給sybase資料庫。如:tg4sybs

設置SYBASE的dll路徑到環境變數PATH(這一步很重要)

4.

修改初始化文件,默認的是:

ORACLE_HOME\tg4sybs\admin\inittg4sybs.ora

設置參數

HS_FDS_CONNECT_INFO

格式:HS_FDS_CONNECT_INFO= server_name. database_name[,INTERFACE=

interface_file]

server_name. database_name是大小寫敏感的。

INTERFACE可選

例子:如下

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

# This is a sample agent init file that contains the HS parameters

that are

# needed for the Transparent Gateway for Sybase

#

# HS init parameters

#

HS_FDS_CONNECT_INFO=migration_serv.tax

HS_FDS_TRACE_LEVEL=OFF

HS_FDS_RECOVERY_ACCOUNT=RECOVER

HS_FDS_RECOVERY_PWD=RECOVER

#

# Environment variables required for Sybase

#

set SYBASE=d:\sybase

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

上例中

server_name是migration_serv

database_name是tax

5.

配置oracle網路服務的listener,配置文件是:listener.ora

默認路徑:ORACLE_HOME\network\admin

加入如下

SID_LIST_LISTENER=

(SID_LIST=

(SID_DESC=

(SID_NAME= gateway_sid)

(ORACLE_HOME= oracle_home_directory)

(PROGRAM=tg4sybs)

)

)

gateway_sid就是3選擇的sid字串

oracle_home_directory是ORACLE_HOME

tg4sybs若是SYBASE是特定的。如果是其他資料庫,會不同。

例子如下:

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

(SID_DESC=

(SID_NAME=tg4sybs)

(ORACLE_HOME = D:\oracle\ora92)

(PROGRAM=tg4sybs)

)

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

6.

停止監聽

lsnrctl stop



重新啓動監聽程式

lsnrctl start

7.

配置oracle server的tnsnames.ora使其能夠訪問sybase

connect_descriptor=

(DESCRIPTION=

(ADDRESS=

(PROTOCOL=TCP)

(HOST= host_name)

(PORT= port_number)

)

(CONNECT_DATA=

(SID= gateway_sid))

(HS=OK))

connect_descriptor是連接串,任取,一般爲sybs

host_name:oracle server的name

port_number:oracle監聽埠

gateway_sid就是3選擇的sid字串

例子如下:

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

sybs=

(DESCRIPTION=

(ADDRESS_LIST =

(ADDRESS=(PROTOCOL=TCP)(HOST= dw-server1)(PORT= 1521))

)

(CONNECT_DATA=

(SID= tg4sybs)

)

(HS=OK)

)

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

8.建立database link

如:

CREATE DATABASE LINK sybs CONNECT TO sa

IDENTIFIED BY prient

USING ‘’SBYS‘’ ;

即可訪問sybase 資料庫。



需要注意的是,sybase資料庫的表名,欄位名,如果是小寫的,那麽在oracle裏訪問的時候要加上雙引號""

如:

SQL〉select "a" from "b"@sybs;



ORA-01034錯誤的解決辦法

--Oracle常見錯誤之一

事先說明,Oracle高手是不需要看本文的。

這是個Oracle資料庫伺服器比較常見的錯誤。有經驗的用戶幾乎馬上就能解決這個錯誤,再不濟也能馬上到Metalink(http://metalink.oracle.com)去搜索一下。

不幸的是,大多的時候,都是初級用戶遇到的這樣的問題(對他們提Metalink也起不到什麽作用--一般都沒有上面的帳號:))。所以,這個小帖子可能還有一定的作用。



問題描述

=======

在試圖啓動資料庫的時候,Oracle報告下列錯誤:

ERROR:

ORA-27101 Shared memory realm does not exist

ORA-01034 ORACLE not available

基本解釋

=======

Error: ORA-27101

Text: shared memory realm does not exist

-------------------------------------------

Cause: Unable to locate shared memory realm

Action: Verify that the realm is aclearcase/" target="_blank" >ccessible



如何解決

=======

這個問題其實用一句話就可以說清楚:

ORACLE_HOME或者ORACLE_SID設置不正確。

在以前的版本中,如果ORACLE_SID不正確,一般都只提示ORA-01034。Oracle 8.1.7

給出一個額外的資訊:ORA-27101。

->如果是Unix,在Shell裏把ORACLE_SID設置正確即可(注意大小寫敏感的問題)。

此外,檢查ORACLE_HOME環境變數。如何檢查參考如下的命令:

% echo $ORACLE_SID

% ps -ef |grep smon

->如果是Windows,一般都是因爲系統中有多個實例造成的。

可以在命令行下 C:\>set ORACLE_SID=DEMO

把這裏的DEMO換爲你相應的實例名。

如果還不行的話,檢查註冊表中的ORACLE_HOME。



此外,在Windows環境下有的時候連接不上遠端的資料庫,會報告如此的錯誤。

解決辦法是把sqlnet.ora文件中的

SQLNET.AUTHENTICATION_SERVICES = (NTS) NTS換爲NONE.



ORA-03113錯誤分析 Fenng(原作)

關鍵字 Oracle 03113

Fenng(Fenng@itpub.net)

版權聲明:轉載請注明作者及出處

前言

每一個DBA在進行資料庫管理的過程中不可避免的要遇到形形色色的錯誤(ORA-xxxx).有些錯誤由於頻繁出現、原因複雜而被DBA們戲稱之爲"經典的錯誤".其中ORA-3113

"end of fileon communication channel" 就是這樣的一個.

我們可以簡單的把這個錯誤理解爲Oracle用戶端進程和資料庫後臺進程連接中斷.不過,導致這個錯誤的原因實際上有很多種,對資料庫設置不當、任何能導致資料庫後臺進程崩潰的行爲都可能産生這個錯誤.這個錯誤的出現還經常伴隨著其他錯誤,比如說:ORA-1034

ORACLE not available.

此外,該錯誤出現的場景複雜,可能出現在:

啓動的Oracle的時侯;

試圖創建資料庫的時侯;

試圖對資料庫進行連接的時侯;

在客戶端正在運行SQL/PL/SQL的時侯;

備份/恢復資料庫的時侯;

其他一些情況下......

在論壇上也時常可以看到初級DBA對這個問題的求救. 在這裏簡單的對該問題進行一下整理.不當之處,請多指教!



錯誤原因種種

根據網路上大家反映的情況來看,錯誤原因大約有這些:

Unix核心參數設置不當

Oracle執行文件許可權不正確/環境變數問題

用戶端通信不能正確處理

資料庫伺服器崩潰/作業系統崩潰/進程被kill

Oracle 內部錯誤

特定SQL、PL/SQL引起的錯誤

空間不夠

防火牆的問題

其他原因

在開始解決問題之前,作如下幾件事情:

1、 回憶一下在出現錯誤之前你都做了什麽操作,越詳細越好;

2、 查看background_dump_dest目錄中的alertSID.log文件也是你要做的事情;

3、

Google一下,在互聯網上有很多資訊等著你去發現,不要什麽都問別人.當然,如果你找到了一些對你非常有幫助的東西――這篇文檔就不用看了,別耽誤你的時間,呵呵.



Unix核心參數設置不當/ init參數設置不當

如果資料庫在安裝過程中沒有設定正確的作業系統核心變數,可能在安裝資料庫文件的時侯

沒甚麽問題,在創建資料庫的時侯常常會出現03113錯誤.和此有關的另一個原因是init.ora

參數文件中的processes參數指定了不合理的值,啓動資料庫導致錯誤出現(當然這個歸根到

底也是核心參數的問題).

這個錯誤資訊一般如下:

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

ORA-01034: ORACLE not available

ORA-27101: shared memory realm does not exist

解決辦法有兩個:

1修改核心參數,加大相應核心參數的值(推薦);

2減小init.ora參數的Processes的值.

需要注意的是:

SEMMSL必須設定爲至少要10 + 進程數的最大值.

SEMMNS 也依賴於每個資料庫上的進程參數值.

-------------------------------------------------------------------------------

注:

這個錯誤類型只在Unix平臺上出現.在Windows上如果processes的值過大,則會出現:

ORA-00068: invalid value 24200001 for parameter

max_rollback_segments, must be

between 2 and 65535 /* 此時指定的參數值超過了65535 */

或者

ORA-27102: out of memory /* 小於65535的一個大參數值 */

我的軟體環境:

Windows 2000 Version 5.0 Service Pack 3, CPU type 586

ORACLE RDBMS Version: 8.1.7.0.0.

-------------------------------------------------------------------------------



在特定平臺上更改核心參數可能會有差別,請參考Oracle

Technet(http://otn.oracle.com)上的安裝文檔.對特定Unix平臺的安裝文檔也有對核心參數意義的解釋.

Init.ora中的參數如果設置不當,會産生該錯誤.有經驗表明:shared_pool_size設置過小會出現錯誤,此外timed_statistics=true的設置也會帶來問題.



Oracle執行文件許可權不正確/環境變數問題

這個問題只出現在Unix平臺上.常見情況是有的時侯管理員爲了方便而使用Unix

的tar命令處理過的壓縮包進行的安裝,或者是系統管理員指定了額外的OS用戶也可以管理數

據庫卻沒有指定正確的環境變數.

Oracle執行文件在$ORACLE_HOME/bin目錄下,如果出現問題,應該用如下Unix類似命令來糾正:

chmod 7755 $ORACLE_HOME/bin/oracle

有的時侯要對Oracle進行relink操作.

在Unix上通過cp拷貝安裝的時候,常常會出現環境變數的問題,和個別執行程式連接問題.LD_

LIBRARY_PATH如果設置的不正確會導致問題,在這種情況下,需要對Oracle進行relink.如果

可執行文件oralcle被破壞,也要對其relink.

如果安裝了並行伺服器選項而Distributed Lock Manager沒有安裝或正確運行也會導致錯誤.



用戶端通信不能正確處理

SQL*Net驅動器的問題:

如果使用的版本比較低的驅動器,請更換到新版本的驅動.SQL*Net

的驅動沒有連接到Oracle可執行文件會導致錯誤.

檢查網路是否通暢

Windows平臺的常見問題:

在Windows平臺創建資料庫的時侯,如果出現該問題可以考慮用如下的方法:

首先檢查本地網路設置.查看網路上是否有同名的結點或有衝突的IP.如果問題依舊,可以保

守的用下面的方法:

1. 禁用網卡:將本地連接狀態改爲禁用;

2. 將sqlnet.ora文件打開(以記事本形式)將nts驗證注釋掉:

#SQLNET.AUTHENTICATION_SERVICES= (NTS).

3. 創建資料庫;

4. 創建成功後,恢復本地連接.

資料庫伺服器崩潰/作業系統崩潰/進程被Kill

在連接過程中,如果Oracle資料庫的伺服器崩潰或者資料庫所在的作業系統崩潰,就會出現這

個錯誤.Oracle

Server崩潰的原因可能因爲主要後臺進程死掉.被錯誤的進行了Kill操作.如果是這個原因還是比較容易解決的.此外,和OS有關的應用程式存在記憶體泄漏(或者有病毒)的時侯也會導致Oracle後臺程式問題.

推薦排錯辦法:

1、 查看應用軟體相關進程是否正常運行;

2、 查看有無記憶體泄漏;

3、 查殺病毒;

4、 確定系統管理員沒有進行誤操作;

5、 確定無黑客入侵行爲.

6、 其他不確定因素......



Oracle 內部錯誤/ Bug

如果查看background_dump_dest目錄中的alert.log發現有無ora-600等錯誤,可以到Metalin

k站點上查看具體資訊及其解決方案.一般情況下要打軟體補丁.



特定SQL、PL/SQL引起的錯誤

嘗試把SQL進行分開執行,也可以用SQL_TRACE來進行跟蹤,找到導致問題的SQL語句:

在SQLPlus下:

ALTER SESSION SET SQL_TRACE TRUE;

SQL語句中的非法字元和不合理的處理結果偶爾會帶來問題.



系統空間不夠

任何時侯都要確保資料庫系統有足夠的空間.如果 USER_DUMP_DEST

和BACKGROUND_DUMP_DEST沒有剩餘空間的話,會導致此問題.此外,如果打開了審計,AUDIT目錄要由足夠的空間.如果啟動了Trace的話,Trace目錄要由足夠的空間.

Dave Wotton的文檔表明,在對表進行插入資料的時侯,如果文件超過了2G(而文件系統有2G限制),會導致該問題.



防火牆的問題

如果資料要通過防火牆,請聯繫系統管理員,詢問是否對資料庫資料進行了過濾或者是突然禁

止了通行埠.如本地安裝有個人防火牆,請檢查本地設置.



其他方面說明

導致這個錯誤的原因有很多種,上面列到的只是一些典型情況.經常去一些資料庫技術論壇可

能會有幫助.比如說ITPUB(http://www.itpub.net)、CNOUG(http://www.cnoug.org)等.



參考資訊/更多閱讀

http://Metalink.oracle.com

Oracle的技術支援站點,要有CSI號碼才可以登錄.

參考Note編號:

Note:17613.1

ORA-3113 on Unix - What Information to Collect

NOTE:131207.1

How to Set UNIX Environment Variables

Note:131321.1

How to Relink Oracle Database Software on UNIX

Note:22080.1

http://www.google.com/grphp hl=zh-CN

Google新聞組

http://www.jlcomp.demon.co.uk/faq/ORA-3113.html

技術專家Jonathan Lewis的站點上的一個FAQ

http://home.clara.net/dwotton/dba/ora3113.htm

Dave Wotton總結的一個很經典的文檔.

在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,根據系統設置情況,可能需要在使用機器名時,後面添加功能變數名稱。





原文转自:http://www.ltesting.net