Windows平臺下不能建立資料庫連線出錯分析 (1)

husthxd發表於2004-11-15

Windows平臺下不能建立資料庫連線出錯分析


本文可以任意轉載,轉載時請務必以超連結形式標明文章原始出處和作者資訊及本宣告

http://blog.itpub.net/post/11/5157

1.         簡介

本文簡要介紹了windows平臺下客戶端連線出錯(比如發生TNS-12500錯誤等)的一些可能原因以及相關的解決辦法。

 

.         實驗

平臺:

Windows 2003 Enterprise Edition 32bit

4G記憶體

 

資料庫版本:

Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Prod

PL/SQL Release 10.1.0.2.0 - Production

CORE    10.1.0.2.0      Production

TNS for 32-bit Windows: Version 10.1.0.2.0 - Production

NLSRTL Version 10.1.0.2.0 – Production

 

A. processes引數

 

D:>sqlplus / as sysdba

 

SQL*Plus: Release 10.1.0.2.0 - Production on 星期一 11 15 13:19:54 2004

 

Copyright (c) 1982, 2004, Oracle.  All rights reserved.

 

 

連線到:

Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production

With the Partitioning, OLAP and Data Mining options

 

-- 如果processes設定太低會由於不能啟動後臺程式而使資料庫啟動失敗

SQL> alter system set processes=10 scope=spfile;

 

系統已更改。

 

SQL> shutdown abort

ORACLE 例程已經關閉。

SQL> startup

ORA-00444: background process "CJQ0" failed while starting

ORA-00020: maximum number of processes () exceeded

SQL> shutdown abort

ORACLE 例程已經關閉。

 

-- 設定為20重新生成spfile,重啟資料庫

SQL> create spfile from pfile='c:init.ora';

 

檔案已建立。

 

SQL> startup

ORACLE 例程已經啟動。

 

Total System Global Area 1862270976 bytes

Fixed Size                   791640 bytes

Variable Size             543419304 bytes

Database Buffers         1317011456 bytes

Redo Buffers                1048576 bytes

資料庫裝載完畢。

資料庫已經開啟。

SQL>

 

-- 執行資料庫連線測試指令碼(後臺建立200個連線)

-- 指令碼見:

 

-- 前臺連線出錯

-- 伺服器本地

D:>sqlplus test/test

 

SQL*Plus: Release 10.1.0.2.0 - Production on 星期一 11 15 14:31:14 2004

 

Copyright (c) 1982, 2004, Oracle.  All rights reserved.

 

ERROR:

ORA-00020: 超出最大程式數 (%s)

 

 

請輸入使用者名稱:

 

-- 遠端客戶端出錯資訊

sql> conn test/test@test10gnew

ERROR

ORA-12516: TNS: 監聽程式無法找到匹配協議棧的可用控制程式碼

-- 客戶端與伺服器端出錯資訊截然不同,小心給錯誤資訊誤導

 

B. TNS-12540windows平臺下Oracle的記憶體管理

:假定不對Oracle使用記憶體進行擴充套件/客戶端使用專用伺服器模式連線

 

眾所周知, 對於32位的os,每個程式可以訪問的最大記憶體空間是232次方,4G.每個程式的記憶體由user spacekernal space兩個元件組成.user space可以使用的記憶體空間最大為2g。對於oracle,可使用的記憶體空間大概是1.7G左右。要注意的是:專用會話(以專用資料庫連線建立的會話)的記憶體在sga之外的記憶體空間分配,但仍然在oracle.exe程式之內。如果sga分配過大的話,雖然連線數遠遠還沒有達到初始化引數processes指定的數值,但客戶端仍然不能連線到資料庫。看如下實驗:

 

SQL> show parameter processes

 

NAME                                 TYPE        VALUE

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

aq_tm_processes                      integer     0

db_writer_processes                  integer     1

gcs_server_processes                 integer     0

job_queue_processes                  integer     10

log_archive_max_processes            integer     2

processes                            integer     1000

SQL> show sga

 

Total System Global Area 1862270976 bytes

Fixed Size                   791640 bytes

Variable Size             543419304 bytes

Database Buffers         1317011456 bytes

Redo Buffers                1048576 bytes

SQL>

 

-- 執行連線測試指令碼

-- 檢視session的數目

sql> select server,count(*) from v$session group by server;

 

SERVER      COUNT(*)

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

DEDICATED         76

-- 檢視pga統計資訊

> set heading off

> set linesize 200

> column name format a50

> column unit format a10

> SELECT * FROM V$PGASTAT;

 

aggregate PGA target parameter                     2097152000 bytes

aggregate PGA auto target                          1864074240 bytes

global memory bound                                 104857600 bytes

total PGA inuse                                      24580096 bytes

total PGA allocated                                  69429248 bytes

maximum PGA allocated                                78424064 bytes

total freeable PGA memory                                   0 bytes

PGA memory freed back to OS                                 0 bytes

total PGA used for auto workareas                           0 bytes

maximum PGA used for auto workareas                         0 bytes

total PGA used for manual workareas                         0 bytes

maximum PGA used for manual workareas                       0 bytes

over allocation count                                       0

 

bytes processed                                       3193856 bytes

extra bytes read/written                                    0 bytes

cache hit percentage                                      100 percent

 

已選擇16行。

 

-- 伺服器端連線出錯

SQL> conn test/test

ERROR:

ORA-12560: TNS: 協議介面卡錯誤

 

-- 客戶端連線出錯

sql> conn test/test@test10gnew

ERROR

ORA-12500: TNS: 監聽程式無法啟動專用伺服器程式

 

警告: 您不再連線到 ORACLE

 

-- 猜想當前oracle.exe所能使用的記憶體大小為1862270976(sga)+ 78424064(pga)

> select 1862270976+ 78424064 from dual;

 

1862270976+78424064

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

         1940695040

 

> select 1940695040/1024/1024/1024 from dual;

 

1940695040/1024/1024/1024

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

                1.8074131

-- 大約是1.8G.

-- 為何不是2g而是1.7g左右?可能是因為餘下的0.2-0.3g記憶體由於操作過程中建立連線/斷開連線造成內部記憶體碎片而不能使用.

 

 

-- 在本例中,進一步實驗可以獲得sga_max_size的最大大小

SQL> alter system set sga_max_size=1776m scope=spfile;

 

系統已更改。

 

SQL> shutdown abort

ORACLE 例程已經關閉。

SQL> startup

ORACLE 例程已經啟動。

 

Total System Global Area 1862270976 bytes

Fixed Size                   791640 bytes

Variable Size             543419304 bytes

Database Buffers         1317011456 bytes

Redo Buffers                1048576 bytes

資料庫裝載完畢。

資料庫已經開啟。

SQL> alter system set sga_max_size=1792m scope=spfile;

 

系統已更改。

 

SQL> shutdown abort

ORACLE 例程已經關閉。

SQL> startup

ORA-27102: out of memory

OSD-00022: 附加錯誤資訊

O/S-Error: (OS 8) 儲存空間不足,無法處理此命令。

SQL>

 

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

相關文章