解决办法1(删归档):
--此时已经登录不进库
ps -ef|grep LOCAL --可以看到很多连接
使用os命令kill掉一些进程以释放资源 --head 取前10条
ps -ef|grep LOCAL=NO|grep -v grep|awk '{print $2}'|head|xargs kill -9
登陆后台数据库进一步观察会话使用情况
SELECT EVENT, PROGRAM, COUNT(*)
FROM V$SESSION
GROUP BY EVENT, PROGRAM
ORDER BY 3;
EVENT PROGRAM COUNT(*)
---------------------------------------- ------------------------------ ----------
DIAG idle wait oracle@lf1 (DIAG) 1
class slave wait oracle@lf1 (GCR0) 1
buffer busy waits oracle@lf1 (J004) 1
library cache lock OMS 59
library cache lock OMS 59
从结果输出发现大量的会话处于library cache lock等待事件中,接下来 定位阻塞者是哪个会话
select event,p1raw,p2 from v$session where event ='library cache lock';
EVENT P1RAW P2
-------------------- ---------------- ----------
library cache lock 000000007C384160 1737585656
library cache lock 000000007C384160 1737462296
library cache lock 000000007C384160 1737338936
library cache lock 000000007C384160 1737215576
library cache lock 000000007C384160 1737092216
library cache lock 000000007C384160 1736968856
select event from v$session where saddr=( select kgllkses from x$kgllk where KGLLKhdl ='000000007C384160' and KGLLKMOD>0 );
EVENT
----------------------------------------------------------------
log file switch (archiving needed)
至此已经看到了导致ORA-00020错误的源头,归档满了,删除多余日志问题解决!
解决办法2(修改参数):
在xshell里面登录oracle
# su - oracle
# sqlplus / as sysdba 连接Oracle
提示要输入用户名和密码。
并报错ORA-00020: maximumnumber of processes (300) exceeded
根据报错信息是由于processes进程数达到了最大值。
常规方法无法登录,我们连接时候要加上-prelim参数
# sqlplus -prelim/ as sysdba 这样终于登录进Oracle的SQL界面
SQL> set linesize 1000;
SQL> show parameter processes;
可以看到默认的processes设置的是300. 太小了,稍后我们得改一改。
生产系统,不能重启数据库,好在系统过了一会儿恢复正常了。主要是因为大量数据库的插入修改操作造成的。
解决方案:
在系统空闲时,修改系统processes参数为1000,重启数据库。【processes参数是静态参数,修改后需要启动数据库。】
SQL> alter system set processes=1000 scope=spfile;
SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP;
SQL> show parameter processes;
可以看到现在processes 参数被改成1000了。