一、连接池爆满
问题现象:
weblogic.jdbc.extensions.PoolLimitSQLException: weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool zh_DS to allocate to applications, please increase the size of the pool and retry..
排查手段:
重启前使用以下脚本排查
--排查当前会话中正在执行次数最多的
select count(*),v.machine,v.SCHEMANAME, v.PREV_SQL_ADDR, v.PREV_HASH_VALUE
from v$session v
where v.SCHEMANAME = 'HSTA3'
group by v.PREV_SQL_ADDR, v.PREV_HASH_VALUE,v.machine,v.SCHEMANAME
order by count(*) desc;
--000007FF3B7368E0 1571443193
select s.* from v$sql s where s.ADDRESS='AA48B878' and s.HASH_VALUE='77069167';
根据SQL找对应的代码观察是否关闭连接
二、AWR报告分析SQL性能
1.首先需要进入oracle用户,linux命令:su oracle,可以看到从root用户改为oracle用户
2.然后进去sql命令行
sqlplus / as sysdba
3.可以再连接,或者再测试一下
conn /as sysdba
4.进入oracle报告选项中
@?/rdbms/admin/awrrpt.sql
5.Enter value for report_type: 这个显示的意思是打印一个报告是以什么格式打印的,要么输入html,要么输入text,如果直接默认回车,这里是html
这里直接默认回车,也就是直接采用默认的html
6.Enter value for num_days: 这里的提示是让我们输出几天的报告,如果写1就输出1天,如果2就是两天
7.Enter value for begin_snap: 出入起始的快照ID,这里指的是打印出来的snap id,后面有snap started开始的时间
输入一个起始的快照,输出一个结束的快照id(本处起始id位3739,结束id位3740,也就是从22:30-22:40,中间10分钟的间隔),这样就将两个时间段内的oracle报告输出
(一般用法,性能测试时,先手工拍摄一张快照,或者调低自动快照的时间,然后执行压测脚本,再手工拍摄之类,取压测前后的快照id,这样既可导出压测期间的结果)
8.Enter value for report_name: 输入一个报告的名字
比如test.html,不输入就是默认的
9.再按exit退出命令行模式,就可以在该目录下生成一个目录报告
把这个html下载下来,用浏览器打开即可看到awr测试报告!
三、SQL执行计划
F5查看SQL执行计划
四、内存溢出
set JAVA_OPTIONS=%JAVA_OPTIONS%
后面加上-verbose:gc -Xloggc:log\gc.log -XX:+PrintGC
java -Xmx800m -jar ha422.jar 查看gc日志
五、网络检查
具体看是前端耗资源还是后端。
六、日志
日志是最有用的排查工具,需要学会看日志分析问题均要习惯从日志入手。
七、锁表
--查看数据库引起锁表的SQL语句:
Select a.Username,
a.Machine,
a.Program,
a.Sid,
a.Serial#,
a.Status,
c.Piece,
c.Sql_Text
From V$session a,
V$sqltext c
Where a.Sid In (Select Distinct T2.Sid
From V$locked_Object T1,
V$session T2
Where T1.Session_Id = T2.Sid)
And a.Sql_Address = c.Address(+)
Order By c.Piece;
--查看被锁的表
SELECT P.SPID,
A.SERIAL#,
C.OBJECT_NAME,
B.SESSION_ID,
B.ORACLE_USERNAME,
B.OS_USER_NAME
FROM V$PROCESS P,
V$SESSION A,
V$LOCKED_OBJECT B,
ALL_OBJECTS C
WHERE P.ADDR = A.PADDR
AND A.PROCESS = B.PROCESS
AND C.OBJECT_ID = B.OBJECT_ID;
八、表空间满
SELECT Upper(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99')
|| '%' "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES,
Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 1;
九、磁盘(应用)
检查web应用磁盘是否满了,也可能导致应用无法使用。