业务方反馈 PLSQL 无法连接 Oracle。 登录 Windows 查看 Oracle 状态发现进程数超标。
在 Windows cmd 窗口执行 sqlplus 报以下错:
C:\> sqlplus as sysdbaERROR:ORA-00020: maxinum number of proccesses (150) exceeded

报错信息提示进程数超过当前参数指定的阈值(150),通过 sqlplus 连接数据库出现连接失败的情况。
在命令行通过 netstat 查看端口为 1521 的会话数和进程数,最后一列为进程ID:
C:\> netstat -nbo

显示的大量连接端口 1521 的进程 ID 为 1920,进程名称为“系统”。通过 taskkill 杀进程提示没有找到该进程。
C:\> lsnrctl statusC:\> lsnrctl stopC:\> taskkill pid 1920

在 netstat 显示的网络会话信息中有可能会出现进程 ID 不存在但会话仍然存在的情况。试过了停监听、停掉端口 1521 的防火墙入站策略、断网等方式都无法清除已经存在的会话,并且会话状态一直为 ESTABLISHED。此时无法通过 sqlplus 登录数据库进行正常的停库操作,于是通过系统服务 services.msc 停掉 OracleServiceXXX 服务。
C:\> services.msc

除了通过图形界面方式重启 Oracle 服务,在命令行也可以查看服务状态:
C:\> net start

当 Oracle 服务通过系统服务正常重启后,此时可以通过 sqlplus 正常连接数据库。下一步就可以修改 Oracle 参数 processes,重启数据库后新的参数即可生效。Oracle processes 默认参数为 150,可以根据系统业务量进行调整,此处设置为 1000。
C:\> sqlplus as sysdbaSQL> show parameter processesSQL> alter system set processes=1000 scope=spfile;SQL> shutdown immediate;SQL> startupSQL> show parameter processes

最后恢复 Oracle 监听:
C:\> lsnrctl startC:\> lsnrctl status
额外再补充一点,在修改 Oracle 参数时要检查一下是使用的 pfile 还是 spfile。通过执行 show parameter spfile 可以查看是否使用 spfile。
SQL> show parameter spfile

如果使用 pfile 启动数据库,参数是保存在内存中的,下次使用 pfile 启动参数并不会生效。推荐使用 spfile 启动数据库,如果 spfile 丢失或不存在可以通过 create 语句创建,将当前内存中的参数保存至 spfile。
SQL> create spfile from memory;

当 spfile 存在时,create 语句会失败,也可以用来验证 spfile 文件正被当前实例使用。通过内存参数创建 spfile 是 Oracle 11g 的新特性,在早期版本此命令无法执行。
最后再补充一点,pfile 和 spfile 可相互转换。pfile 是纯文件文件可读可编辑,spfile 是二进制文件只能在命令中修改。pfile 一般用在指定参数文件启动 Oracle 的场景:
SQL> create pfile='c:\pfile.ora' from spfile;SQL> shutdown immeidate;SQL> startup pfile='c:\pfile.ora'
总结
当 Windows 下的 Oracle 出现 ORA-00020 报错导致无法访问时,此时无法正常启停 Oracle 。如果是其它进程连接 1521 的进程过多导致的无法访问数据库,可以通过 taskkill 杀进程的方式降低会话数。如果是无效进程ID,此时只能通过重启 Oracle 服务解决。重启之后通过修改启动参数调整进程数。
Oracle 有两个参数可能会影响用户连接,除了 processes 参数,session 参数一样会导致超标时无法连接。
SQL> show parameter sessionSQL> show parameter process
日常使用可以关注一下系统运行状态,通过 count 语句可以检查进程数和会话数,通过这两个值可以反映系统繁忙状态。

参考
https://blog.csdn.net/zhanggaokai/article/details/9176709https://www.modb.pro/db/12965https://blog.csdn.net/csdn_ingly/article/details/120799590http://www.dba-oracle.com/t_processes_parameter.htmhttp://www.dba-oracle.com/t_ora_00020_maximum_processes_exceeded.htmhttps://blog.csdn.net/u012372584/article/details/53453025https://jlhxxxx.github.io/oracle-00020.html
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。




