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

RAC11.2.0.4超过最大连接数处理步骤

原创 董小姐 2024-08-15
753

问题描述

同事反馈数据库连接工具不能访问数据库,查看监听正常,sqlplus / as sysdba登录也正常,查看告警日志提示如下报错:

[oracle@icpspnet02 trace]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Wed Aug 14 15:05:59 2024

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

ERROR:
ORA-00020: maximum number of processes (2000) exceeded

不到1分钟的时间,再次sqlplus / as sysdba登录就失败了,也是提示如上。

解决办法

由于业务高峰期间,让现场同事申请紧急停业务窗口,然后停监听释放部分inactive会话。

停止监听

任一节点操作即可,所有节点监听服务都会停止

srvctl stop listener   #-force 视情况加或者不加,本文档没加

查当前会话数和进程数

--查看当前的数据库连接数
select count(*) from v$process; 一直徘徊在1950左右
--查看数据库允许的最大连接数
select value from v$parameter where name ='processes';  返回2000
--查看当前的session连接数
select count(*) from v$session;  一直徘徊在1950左右
--查看当前并发连接数
select count(*) from v$session where status='ACTIVE'; 一直徘徊在1930左右
--查看数据库允许的最大会话数
select value from v$parameter where name ='sessions';  返回1000

更改参数

--备份参数文件
create pfile='/home/oracle/pfile_icpspnet01.ora' from spfile;

--更改参数
alter system set processes = 5000 sid='*' scope = spfile; 
alter system set sessions = 5505 sid='*' scope = spfile; 

杀掉inactive状态的select会话

杀掉inactive状态的select会话,释放inactive连接,避免再次超过连接数无法访问进而无法下一步分析定位。

分类统计当前会话

select  b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b where a.ADDR = b.PADDR and  b.USERNAME is not null   group by  b.MACHINE  , b.PROGRAM order by count(*) desc;

杀掉inactive状态的会话

找到最多的连接数机器名,先杀掉inactive状态的select会话,对非select会话和业务确定无问题后再进行kill。

select 'alter system kill session ''' || s.sid || ',' ||s.serial# || ''' immediate;' sql,s.username,s.program,s.machine,a.sql_text,s.status from v$sqlarea a, v$session s where s.machine ='机器名称' and s.status='INACTIVE' and s.prev_sql_addr = a.address 
--and a.sql_text like 'select%';

查看是否有锁表

杀掉inavtive状态的会话后再次查当前会话数还是挺多。

查看是否有锁表

输出记录数高达1893条记录

set lines 999 pages 999
col  object_name for a30
col  machine for a30
SELECT object_name, machine, s.sid, s.serial# 
FROM gv$locked_object b, dba_objects o, gv$session s WHERE b.object_id=o.object_id
AND b.session_id = s.sid;	

查看具体的锁表sql

select l.session_id sid, 
       s.serial#, 
       l.locked_mode, 
       l.oracle_username, 
       s.user#, 
       l.os_user_name, 
       s.machine, 
       s.terminal, 
       a.sql_text, 
       a.action ,
'alter system kill session ' || '''' || l.session_id || ',' || s.serial# || ''' immediate;'   from v$sqlarea a, v$session s, v$locked_object l 
where l.session_id = s.sid 
   and s.prev_sql_addr = a.address --and a.sql_text like 'select%'
order by sid, s.serial#;

释放数据表锁

逐个释放

// 释放SESSION SQL:
alter system kill session 'sid, serial#';
ALTER system kill session '23, 1647';

//如果上述语句杀不掉提示会话不存在,尝试该语句   如果有ora-00031错误,则在后面加immediate
alter system kill SESSION '399, 14608' immediate;

//
遇到杀不掉的进程,可以根据SID,查找系统中对应的spid,然后kill -9 spid杀掉  不建议
select s.sid, s.serial#, s.username, s.osuser, p.spid, s.machine, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=399
操作系统上操作 (慎重)
ps -ef | grep 上面的spid
kill -9 上面的spid

批量释放

复制粘贴并执行“查看具体的锁表sql”中的"alter system kill session "开头的sql。

如果有非select开头的sql 和业务确认释放可以手动kill,如果不可以时间允许的场景下等执行完锁释放。

启动监听

任一节点操作即可,所有节点监听服务都会启动

srvctl start listener   

重启数据库

--停止所有节点的数据库
srvctl stop database -d icpspnet

--启动所有节点的数据库
srvctl start database -d icpspnet

补充

处理思路

停止监听

sqlplus / as sysdba 登录查参数

更改参数

启动监听

重启数据库

11G RAC 下SRVCTL命令详解

SRVCTL是ORACLE RAC集群配置管理的工具

SRVCTL add命令

添加数据库或实例的配置信息。在增加实例中,与-i一起指定的名字应该与INSTANCE_NAME 和 ORACLE_SID参数匹配。

语法
srvctl add database -d  [-m domain_name] -o  -p 
srvctl add instance -d  -i <instance 1 name> -n <node 1 name >
srvctl add instance -d  -i <instance 2 name> -n <node 2 name >
参数说明
-m   数据库域名 格式如”us.oracle.com”
指定的数据库域名必须匹配数据库INIT.ORA或者SPFILE中DB_DOMAIN 和DB_NAME参数。在增加数据库时,-d指定的数据库名必须与DB_NAME参数匹配
-i     实例名
-n   实例节点名
-o   $ORACLE_HOME(用来确定lsnrctl和Oracle等命令路径)
-p   SPFILE 文件名
示例
--添加一个新的数据库
srvctl add database -d mydb -o /ora/ora9
srvctl  add database -d RAC -o /u01/oracle/product/10.2.0/db_1 -p +RAC_DISK/rac/spfilerac.ora

--向数据库添加实例
srvctl  add  instance  -d RAC  -i rac1  -n node1
srvctl  add  instance  -d RAC  -i rac2  -n node2

SRVCTL config命令

srvctl config database --显示保存在SRVM配置文件中的配置信息

srvctl config database -d database_name --显示指定数据库的配置列表

示例:

[root@orcl01:/root]$ srvctl config database
topnet
[root@orcl01:/root]$ srvctl config database -d topnet
Database unique name: topnet
Database name: topnet
Oracle home: /u01/app/oracle/product/11.2.0/db
Oracle user: oracle
Spfile: +DATA/topnet/spfiletopnet.ora
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: topnet
Database instances: topnet1,topnet2
Disk Groups: DATA
Mount point paths:
Services:
Type: RAC
Database is administrator managed

SRVCTL modify命令

修改实例的节点配置信息,这些修改会在程序下次重新启动后生效,修改后的信息将永久保存。

srvctl modify instance -d database_name -i instance_name -n node_name

示例:

srvctl modify instance -d rac -n new_node

SRVCTL remove命令

这是用来删除SRVM库中配置信息的命令,对象相关的环境设置也同样删除,如果你未使用强制标志(-f),ORACLE将提示你确认是否删除。

使用强制选项(-f),删除操作将不进行提示

srvctl remove database -d database_name [-f]
srvctl remove instance -d database_name -i instance_name [-f]

命令参数:
-f 强制删除应用时不进行确认提示

示例:

srvctl remove database -d rac
srvctl remove instance -d rac -i rac1
srvctl remove instance -d rac -i rac2

SRVCTL start命令

启动数据库,所有实例或指定的实例,及启动所有相关未启动的监听。

注:对于start命令和其它一些可以使用连接字符串的操作,如果你不提供连接字符串,那么ORACLE会使用”/ as sysdba”在实例上执行相关的操作。另外,要执行类似的操作,你必须是OSDBA组的成员。

srvctl start database -d database_name [-o start_options] [-c connect_string]
srvctl start instance -d database_name -i instance_name [,instance_name-list] [-o start_options][-c connect_string]

命令参数:
-o   在SQL*Plus直接传递的startup命令选项,可以包括PFILE
-c   使用SQL*Plus连接数据库实例的连接字符串

示例

--启动数据库及所有的实例
srvctl start database -d rac
srvctl stop database -d rac -c "SYS/SYS_password as SYSDBA"

--启动指定的实例 
srvctl start instance -d rac -i rac1,rac2

srvctl start listener -n node1
srvctl stop listener -n node2
srvctl stop listener -n node [-l listenername]

完整示例:

srvctl start nodeapps -n rac1
srvctl start nodeapps -n rac2
srvctl start asm -n rac1
srvctl start asm -n rac2
srvctl start database -d rac
srvctl start service -d rac
crs_stat -t

今天发现一个SRVCTL命令的小bug。(http://yangtingkun.itpub.net/post/468/275571)

如果用srvctl关闭监听后,再用lsnrctl start打开监听。这时srvctl仍然认为监听已经关闭。因此,再次使用srvctl关闭监听,似乎srvctl根本没有去执行。如果希望srvctl可以关闭监听,那么需要先用srvctl启动监听,然后再关闭。搜索了一下metalink,没有发现关于这个问题的说明。而且,这个问题只在关闭监听时出现,启动监听则没有问题。svrctl显然只记录它自己的操作,而不去检查listener真正的状态。

##############################################################

SRVCTL status命令

显示指定数据库的当前状态

--显示数据和所有实例状态
srvctl status database -d database_name

--显示指定实例的状态
srvctl status instance -d database_name -i instance_name [,instance_name-list]

示例:

srvctl status database -d rac
srvctl status instance -d rac -i rac1,rac2

SRVCTL stop命令

停止数据库所有实例,可指定实例

srvctl stop database -d database_name [-o stop_options] [-c connect_string]
srvctl stop instance -d database_name -i instance_name [,instance_name_list] [-o stop_options][-c connect_string]

命令参数:
-c   使用SQL*Plus连接数据库实例的连接字符串
-o   在SQL*Plus直接传递的shutdown命令选项

示例

--停止数据库所有的实例
srvctl stop database -d rac

--停止指定实例
srvctl stop instance -d rac -i rac2
srvctl stop service -d db_name [-s service_name_list [-i inst_name]]
srvctl stop asm -n node

完整示例:

srvctl stop service -d rac
srvctl stop database -d rac
srvctl stop asm -n rac2
srvctl stop asm -n rac1
srvctl stop nodeapps -n rac2
srvctl stop nodeapps -n rac1
crs_stat -t

使用SRVCONFIG导入和导出RAW设备配置信息

你可使用SRVCONFIG导入和导出RAW设备配置信息,不管配置文件是在集群文件系统上还是在RAW设备上。你可以使用这种方法来备份与恢复SRVM配置信息。

示例

下面的命令用来导出配置信息的内容到你指定文件名的文本文件中。

srvconfig -exp file_name

下面的命令用来从指定文本文件中导入配置信息到到你运行命令的RAC环境配置信息库。

srvconfig -imp file_name

SRVCTL getenv命令

getenv操作用来从SRVM配置文件中获取与显示环境变量

srvctl getenv database -d database_name [-t name[,name,……]]
srvctl getenv instance -d database_name -i instance_name [-t name[,name,……]]

示例:

srvctl getenv database -d rac

SRVCTL setenv命令

设置SRVM配置文件中的环境变量值。

srvctl setenv database -d database_name -t [,name=value,……]
srvctl setenv instance -d database_name [-i instance_name] -t [,name=value,……]

示例:

srvctl setenv database -d rac -t LANG=en

SRVCTL unsetenv命令

取消SRVM配置文件中环境变量定义值,回到缺省值

srvctl unsetenv database -d database_name-t name[,name,……]
srvctl unsetenv instance -d database_name[-i instance_name] -t name[,name,……]

示例:

srvctl unsetenv database -d rac -t CLASSPATH



srvctl 命令详解 - 大地爱老虎油 - 博客园 (cnblogs.com)

最后修改时间:2024-08-15 09:56:44
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论