orcle:ORA-12520错误
刚开始安装后,经常会有这种问题,就是一边能连上一边连不上,网络上有对于这个问题的起因有两种说法
1)数据库是专用服务器,但是在tnsname.ora配置中设置了连接方式为shared,这种情况下打开tnsname.ora,
把(server = shared) 改成 (server = dedicate)
2)是由于process不够引起的
1、查看当前会话数、processes和sessions值,发现session数和2个参数的值已经非常逼近
SQL> select count(*) from v$session;
COUNT(*)
----------
30
SQL> show parameter sessions;
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
logmnr_max_persistent_sessions integer 1
sessions integer 170
shared_server_sessions integer
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ -----------
------------------------------
aq_tm_processes integer 0
db_writer_processes integer 1
gcs_server_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 2
processes integer 150
2、修改processes和sessions值
SQL> alter system set processes=300 scope=spfile;
System altered.
SQL> alter system set sessions=335 scope=spfile;
System altered.
3、查看processes和sessions参数,但更改并未生效
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ -----------
------------------------------
aq_tm_processes integer 0
db_writer_processes integer 1
gcs_server_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 2
processes integer 150
SQL> show parameter sessions
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
logmnr_max_persistent_sessions integer 1
sessions integer 170
shared_server_sessions integer
4、重启数据库,使更改生效
SQL> conn / as sysdba
Connected.
SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 197132288 bytes
Fixed Size 1218484 bytes
Variable Size 113248332 bytes
Database Buffers 79691776 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ -----------
------------------------------
aq_tm_processes integer 0
db_writer_processes integer 1
gcs_server_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 2
processes integer 300
SQL> show parameter sessions;
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
logmnr_max_persistent_sessions integer 1
sessions integer 335
shared_server_sessions integer
可这里的process、session到底是什么含义?看来有必要理一理oracle连接模式的一些基础概念了:
先来看看oracle建立连接的过程:
Oracle网络命名解析完成以后,一个连接请求从客户端或中间层应用(都被认为是用户进程)传输到Oracle 网络监听器。监听器收到一个CONNECT 包,并且检查请求的服务是否是一个有效的服务名。如果是不需要服务名的连接(如:TNSPING请求),监听器识别出连接请求后什么也不做,如果请求的是非法的服务名,监听器会发送一个错误代码给用户进程;
再来看看Oracle在不同的连接模式下有哪些区别?
【专用模式 】
1、如果CONNECT 包请求的是一个有效的服务名,监听器会建立一个新的进程(即:Server Process ,在windows中对应线程)去处理这个连接。
2、进程创建后,监听器连接该进程,并把初始化信息传给他,包括:用户进程的地址信息。至此,监听器不处理该连接的事务,所有工作都由对应的进程处理。
3、Server Process 传回一个RESEND 包给用户进程;
4、用户进程接收到RESEND 包后,又再次发送一个CONNECT 包(真罗嗦 :p);Server Process开始检查用户进程的身份识别证书(通常就是一个密码),如果验证通过就创建一个Session;
5、Session建立以后,Server Process 就扮演一个服务器端的用户代理角色,主要负责:
• 解析和运行所有该客户端的SQL语句;
• 检查 database buffer cache 用于执行SQL语句的数据块数量;
• 如果SGA中已经没有对应的数据块时,将必须的数据块从磁盘的数据文件中读入到SGA的database buffer cache
中;
• 管理所有的排序操作,在server process 中有一部分叫Program Global Area
(PGA),PGA包含了一块用于排序的内存区块就是the Sort Area;
• 返回结果给用户进程;
Server processes也处理一些特殊的操作,如bitmap 和hash连接。专用服务器进程消耗的内存数量取决于几个初始化参数设置:PGA_AGGREGATE_TARGET 和WORKAREA_SIZE_POLICY ,如果需要更高级的调优,可以对这些参数进行微调;
在专用模式中,server processes 和用户进程的比例是1:1,每个server process都消耗系统资源,包括CPU和内存。
【共享模式】
每一个参与共享服务器架构的服务至少需要一个(通常不止一个)调度进程。当一个连接请求到来的时候,监听器并不创建一个专用服务器进程。取而代之的,监听器根据每个调度器的连接负载(并发连接数)为每个服务名维护一个有效的调度器列表。连接请求被路由到负载最轻的调度器上。在一个session期间,用户的连接都会持续保持在同一个调度器上。
不像专用服务器进程,一个调度器可以管理上百个用户session。调度器实际中并不处理客户端的请求,而是将用户请求放到一个SGA共享池中的公共队列中;共享服务器进程(Shared Server processes),接管了大部分专用服务器进程的工作,将请求从队列中取出,并处理。
由于一个用户session的请求有可能会被多个shared server processes处理,因此原来位于在Program Global Area (PGA)中的存储结构必须放在一个共享内存的地方,在共享模式中,这些存储区块是放在SGA的large pool 中的;
处理请求的过程:
当一个用户连接通过共享服务器架构提交一个数据库请求的时候:
1、用户进程将请求发送给调度器;
2、调度器将请求放入到SGA的公共队列中;
3、下一个空闲的shared server 从队列中取出并处理请求;
4、shared server 将响应(response )放到调度器的响应队列中,每个调度器都有自己的响应队列;
5、调度器从他的响应队列中检索到对应响应。
6、调度器将响应返回给用户;
整个过程结束后,shared server 将被释放,并处理新的用户请求;
关于请求队列:
• 一个请求队列被所有的调度器共享.
• Shared servers 监视着请求队列中是否有新的请求进入.
• 请求是按先进先出 (FIFO)的原则进行处理的.没有优先级设置。
一些相关的参数说明:
• LARGE_POOL_SIZE 指定 large pool的字节数尺寸. oracle共享模式适用large pool 存储session的信息,而在专用模式中通常存储在PGA中。
• SESSIONS 指定系统中能创建的最大session数量。这个参数可以根据实际情况进行调整;
• PROCESSES 控制服务器端进程的数量.
• LOCAL_LISTENER 定义监听器使用的协议和端口号.
如果你的监听器不是使用使用TCP/IP和1521端口,或者你有多个监听器,你必须配置LOCAL_LISTENER,这样调度器才能注册监听器.
什么时候不适合用共享模式
- 数据库管理
- 备份和回复操作
- 批处理和大负载量操作(如果在有大事务和长事务的OLTP系统中,系统会比原来更慢)
- 数据仓库操作