暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Windows 下 Oracle 进程数超标导致的数据库连接失败

生有可恋 2023-04-23
2102

业务方反馈 PLSQL 无法连接 Oracle。 登录 Windows 查看 Oracle 状态发现进程数超标。

在 Windows cmd 窗口执行 sqlplus 报以下错:

    C:\> sqlplus  as sysdba
    ERROR:
    ORA-00020: maxinum number of proccesses (150) exceeded

    报错信息提示进程数超过当前参数指定的阈值(150),通过 sqlplus 连接数据库出现连接失败的情况。

    在命令行通过 netstat 查看端口为 1521 的会话数和进程数,最后一列为进程ID:

      C:\> netstat -nbo

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

        C:\> lsnrctl status
        C:\> lsnrctl stop
        C:\> 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 sysdba
              SQL> show parameter processes
              SQL> alter system set processes=1000 scope=spfile;
              SQL> shutdown immediate;
              SQL> startup
              SQL> show parameter processes

              最后恢复 Oracle 监听:

                C:\> lsnrctl start
                C:\> 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 session
                        SQL> show parameter process

                        日常使用可以关注一下系统运行状态,通过 count 语句可以检查进程数和会话数,通过这两个值可以反映系统繁忙状态。

                        参考

                          https://blog.csdn.net/zhanggaokai/article/details/9176709
                          https://www.modb.pro/db/12965
                          https://blog.csdn.net/csdn_ingly/article/details/120799590
                          http://www.dba-oracle.com/t_processes_parameter.htm
                          http://www.dba-oracle.com/t_ora_00020_maximum_processes_exceeded.htm
                          https://blog.csdn.net/u012372584/article/details/53453025
                          https://jlhxxxx.github.io/oracle-00020.html


                          全文完。

                          如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

                          文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论