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-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
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/,如需转载,请注明出处,否则将追究法律责任。