Oracle诊断:在程序的运行中,有时候数据库会断开连接

2023-06-28,,

在程序的运行中,有时候数据库会断开连接,然后报下面错误:

ORA-12519: TNS:no appropriate service handler found  可用的服务处理程序没有找到。

1. 简单解释下什么是service handler,以及service handler是什么时候被调用的?

在客户端和数据库oracle进行通信时,oracle需要进行完成一个过程"服务注册 (service registration)" . 服务注册是将数据库提供的服务名称,实例名,可用服务处理程序,端口号等告知listener 的过程。 当客户端的请求到达listener时,listenser将会选择一个合适的service handlers为之服务。可用的服务处理程序(service handlers)用于调度和派生子程序。

下面是参考的一篇文章http://blog.chinaunix.net/uid-20802110-id-4153116.html

2. 排查和解决

//查看所配置的processes最大连接数量

SQL> show parameter process;

NAME                                 TYPE        VALUE

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

aq_tm_processes                      integer     1

cell_offload_processing              boolean     TRUE

db_writer_processes                  integer     2

gcs_server_processes                 integer     0

global_txn_processes                 integer     1

job_queue_processes                  integer     1000

log_archive_max_processes            integer     4

processes                            integer     550  (配置最大连接进程550)

processor_group_name                 string

SQL> select value from v$parameter where name ='processes';

VALUE

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

550

//查看所配置sessions最大连接数量

SQL> show parameter session;

NAME                                 TYPE        VALUE

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

java_max_sessionspace_size           integer     0

java_soft_sessionspace_limit         integer     0

license_max_sessions                 integer     0

license_sessions_warning             integer     0

session_cached_cursors               integer     50

session_max_open_files               integer     10

sessions                             integer     848  (配置最大连接sessions 550)

shared_server_sessions               integer

//查看实际process的连接数量 (包括oracle自身本地连接进程数和非本地的连接进程数)

SQL> select count(*) from v$process;

COUNT(*)

----------

45

//查看非本地连接数量

oracle@sha-oracle-04:~/export/dmpfiles/temp> ps -ef|grep LOCAL=NO|wc -l

15

oracle连接常见的有带LOCAL=NO参数或带LOCAL=YES的进程。

LOCAL=NO:非本地连接,即网络连接。它是通过Listener 连接到服务器的。客户端的应用通过客户端的监听向服务器的监听发送请求,服务器的监听接收后,在与数据库连接,执行相关操作,在把结果返回给客户端。这是通过监听的流程。 所以在客户端需要配置监听,即配置tnsnames.ora。

LOCAL=YES:本地连接。 本地连接不走监听,所以在服务监听没有启动的情况下,通过本地的sqlplus 还是可以连上数据库的。

//查看处于活动状态的进程列表(用户名和进程名)

SQL> select spid,username,program from v$process;

SPID                     USERNAME

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

PROGRAM

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

PSEUDO

5747                     oracle

oracle@sha-oracle-04 (PMON)

5752                     oracle

oracle@sha-oracle-04 (PSP0

46 rows selected.

//更改最大进程数量

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

System altered.

修改system表的processes字段为550,

Oracle 里面有个叫做spfile的东西,就是动态参数文件,里面设置了Oracle 的各种参数。所谓的动态,就是说你可以在不关闭数据库的情况下,更改数据库参数,记录在spfile里面。更改参数的时候,有4种scope选项。scope就是范围

++ scope=spfile 仅仅更改spfile里面的记载,不更改内存,也就是不立即生效,而是等下次数据库启动生效。有一些参数只允许用这种方法更改

++ scope=memory 仅仅更改内存,不改spfile。也就是下次启动就失效了

++ scope=both 内存和spfile都更改

++ 不指定scope参数,等同于scope=both.

//关闭数据库instance

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

//启动数据库instance

SQL> startup

ORACLE instance started.

Oracle诊断:在程序的运行中,有时候数据库会断开连接的相关教程结束。

《Oracle诊断:在程序的运行中,有时候数据库会断开连接.doc》

下载本文的Word格式文档,以方便收藏与打印。