不能连接Oracle数据库了提示相关的错误
OERR: ORA TNS:no appropriate service handler found
客户端连接间歇性失败报错ORA
Cause: the listener could not find any available service handlers that are
appropriate for the client connection
Action: run lsnrctl services to ensure that the instance(s) have registered
with the listener and are accepting connections 检查lsnrctl service instance已经注册
状态显示ready时可以连接
When the listener believes the current number of connections has reached maximum load
it may set the state of the service handler for an instance to blocked and begin refusing
incoming client connections with either of the following errors: ora or ora
采用服务动态注册的方式由PMON 通过SERVICE_UPDATE 来得到目前连接情况但SERVICE_UPDATE 有时间间隔
所以listener显示的连接数和当前实际的连接数可能不同
查询解决方法:
查看一下数据库现有的进程数是否已经达到参数processes的大小
select count(*) from v$process; 取得数据库目前的进程数
select value from v$parameter where name = processes; 取得进程数的上限
如已达到上限修改initSIDora中的processes的大小
重新启动数据库到nomount状态下执行create spfile from pfile; 并startup open
查询数据库自启动以来最大的并发数量
修改最大连接数:
alter system set processes = scope = spfile;
重启数据库:
shutdown immediate;
startup;
查看当前有哪些用户正在使用数据
SELECT osuser ausernamecpu_time/executions/||s sql_fulltextmachine
from v$session a v$sqlarea b
where asql_address =baddress order by cpu_time/executions desc;
有的时候我们需要调整oracle数据库的最大链接数而这个链接数的调整是在oacle下的dbs目录下initora文件中调整的
ORACLE的连接数(sessions)与其参数文件中的进程数(process)有关它们的关系如下
sessions=(*process+)
但是我们增加process数时往往数据库不能启动了这因为我们还漏调了一个unix系统参数它是核心参数中的semmns这是unix系统的信号量参数每个process会占用一个信号量semmns调整后需要重新启动unix操作系统参数才能生效不过它的大小会受制于硬件的内存或ORACLE SGA范围可从——不等
但是Processes的修改不仅应该调整init<sid>ora文件中的参数而且应该调整OS的内核参数象AIXHPUXSolarisSCOUNIXWare都是这样OS的调整是需要重新启动的而且这个参数的设置不能简单按照多少个终端要连到这个服务器上而定最关键是考虑会有多少同时连上的session(在使用一些共享连接的中间件时一般就不需要太大)当然还要考虑一些Oracle的后台进程还有一些系统维护工作需要多一些连接等
我的atmp大前置机器上对oracle调整的时候其使用的是unixware操作系统在做链接数调整的时候要先对核心参数进行调整
核心主要相关的参数的调整如下
SHMMAX
SHMMIN
SHMMNI
SHMSEG
SEMMNI
SEMMSL
SEMMNS
SEMOPM
其中semmnisemmnssemmsl要加大至少要比processes大
SEMMNI()指定在核心中信号识别的数量这是可以在任意给定时间被激活的唯一信号设置数量缺省值是最大值由系统自动调整产生
SEMMSL()指定每个信号识别中信号量的最大值缺省值是
SEMMNS 除最大db外的所有db 的PROCESSES之和+*最大db的PROCESSES+*
实例数如个实例进程数分别为则=(+)+*+*=
tyle=LINEHEIGHT: %; FONTFAMILY: 宋体>SEMOPM()指定在每个系统调用semop中能够被执行的信号操作量的最大值缺省值是
SHMMAX()指定了共享内存部分大小的最大值等于
× 物理内存字节数
SHMMNI()指定了系统范围内共享内存标识的最大值
SHMSEG()指定了与每个进程相关连的共享内存块(或标识)的数量缺省值是与每个进程相关连的共享内存块的最大值与进程拥有的未使用空间有关因此尽管一个进程拥有少于SHMSEG数值的共享内存块它也有可能因为其有限的空间而不能与其它进程相联系
initora中调整为
processes = # SMALL
#processes = # MEDIUM
# processes = # LARGE
From:!FEFAF!entry
修改oracle 的最大连接数
使用sys以sysdba权限登录
c:sqlplus /nolog
SQL>conn / as sysdba
SQL> show parameter processes;
NAME TYPE VALUE
aq_tm_processes integer
db_writer_processes integer
job_queue_processes integer
log_archive_max_processes integer
processes integer
SQL> alter system set processes= scope = spfile;
系统已更改
SQL> show parameter processes;
NAME TYPE VALUE
aq_tm_processes integer
db_writer_processes integer
job_queue_processes integer
log_archive_max_processes integer
processes integer
SQL> create pfile from spfile;
文件已创建
重启数据库OK!