数据库的实时连接数是否稳定是衡量一套IT系统是否稳定的一个指标。
当新系统推出或者在没有严格测试环境下更应该收集和关注这个数据。
我写了一个简单的存储过程采样数据库实时连接数并利用dbms_job来定时,方法如下:
1.在sys用户下建立保存数据库实时连接数结果的表session_num,并建立公有同义词
create table session_num(
num number(6),
username varchar2(30),
machine varchar2(30),
reportdate date )
pctfree 1 pctused 99 tablespace users;
create public synonym session_num for sys.session_num;
2.写一个存储过程select_sessionnum.sql
create or replace procedure select_sessionnum
is
begin
insert into session_num(num,username,machine,reportdate)
select count(*),username,machine,sysdate
from v$session
where username is not null
group by username,machine;
commit;
exception
when others then
rollback;
raise;
end;
/
3.用dbms_job设定每隔一个小时调用select_sessionnum过程采样数据
variable jobno number;
begin
dbms_job.submit(:jobno,'select_sessionnum;', sysdate,'sysdate + 1/24');
commit;
end;
/
关于dbms_job使用和介绍可以参考这篇文章:《在Oracle中实现定时操作》
4.DBA和一般用户都可以不定期检查这些数据:
set pagesize 1000;
set linesize 100;
column username format a15;
column machine format a30;
select * from session_num where num>50;
select * from v$license;
发现异常的问题要用文档记录下来,并发给开发团队参考。
历史数据可以用truncate table session_num;清掉
(这个50是我假设的一个值,不同的应用系统值会不一样)
5.如果系统稳定并没有新的服务添加时,可以从sys用户下删掉这个采样工作:
select job from user_jobs where what='select_sessionnum;';
JOB
----------
1912
exec dbms_job.remove(1912);
后话:这个方法和statspack采样的方式很相象, 但不会增加系统太大的负担。
如果你关注其它参数也可以依葫芦画瓢来采样并跟踪它们。