ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Windows平台下不能建立数据库连接出错分析 (1)

Windows平台下不能建立数据库连接出错分析 (1)

原创 Linux操作系统 作者:husthxd 时间:2004-11-15 00:00:00 0 删除 编辑

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

请登录后发表评论 登录
全部评论
ITPUB数据库版块资深版主,对Oracle、PostgreSQL有深入研究。

注册时间:2007-12-28

  • 博文量
    1559
  • 访问量
    4231261