Windows平台下不能建立数据库连接出错分析
本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
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
CORE10.1.0.2.0Production
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 Size791640 bytes
Variable Size543419304 bytes
Database Buffers1317011456 bytes
Redo Buffers1048576 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-12540与windows平台下Oracle的内存管理
注:假定不对Oracle使用内存进行扩展/客户端使用专用服务器模式连接
众所周知,对于32位的os,每个进程可以访问的最大内存空间是2的32次方,即4G.每个进程的内存由user space和kernal space两个组件组成.user space可以使用的内存空间最大为2g。对于oracle,可使用的内存空间大概是1.7G左右。要注意的是:专用会话(以专用数据库连接建立的会话)的内存在sga之外的内存空间分配,但仍然在oracle.exe进程之内。如果sga分配过大的话,虽然连接数远远还没有达到初始化参数processes指定的数值,但客户端仍然不能连接到数据库。看如下实验:
SQL> show parameter processes
NAMETYPEVALUE
------------------------------------ ----------- ------------------------------
aq_tm_processesinteger0
db_writer_processesinteger1
gcs_server_processesinteger0
job_queue_processesinteger10
log_archive_max_processesinteger2
processesinteger1000
SQL> show sga
Total System Global Area 1862270976 bytes
Fixed Size791640 bytes
Variable Size543419304 bytes
Database Buffers1317011456 bytes
Redo Buffers1048576 bytes
SQL>
--运行连接测试脚本
--查看session的数目
sql> select server,count(*) from v$session group by server;
SERVERCOUNT(*)
--------- ----------
DEDICATED76
--查看pga统计信息
> set heading off
> set linesize 200
> column name format a50
> column unit format a10
> SELECT * FROM V$PGASTAT;
aggregate PGA target parameter2097152000 bytes
aggregate PGA auto target1864074240 bytes
global memory bound104857600 bytes
total PGA inuse24580096 bytes
total PGA allocated69429248 bytes
maximum PGA allocated78424064 bytes
total freeable PGA memory0 bytes
PGA memory freed back to OS0 bytes
total PGA used for auto workareas0 bytes
maximum PGA used for auto workareas0 bytes
total PGA used for manual workareas0 bytes
maximum PGA used for manual workareas0 bytes
over allocation count0
bytes processed3193856 bytes
extra bytes read/written0 bytes
cache hit percentage100 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 Size791640 bytes
Variable Size543419304 bytes
Database Buffers1317011456 bytes
Redo Buffers1048576 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>