转自:
https://blog.csdn.net/weixin_42163563/article/details/90294916
背景:在日常运维工作中,各种各样的问题,真是千奇百怪。今天遇到这个问题了,查了一些解决办法,做了一个汇总,今天就分享一下。
错误:ORA-12519, TNS:no appropriate service handler found
[oracle@localhost ~]$ oerr ora 12519
12519, 00000, “TNS:no appropriate service handler found”
// *Cause: The listener could not find any available service handlers that
// are appropriate for the client connection.
// *Action: Run “lsnrctl services” to ensure that the instance(s) have
// registered with the listener, and are accepting connections.
主要从两个方面来考虑这件事,从程序方面来看:
1.进行数据库连接操作后未释放连接;
2.若使用了数据库连接池,则考虑连接池的超时设置。
从数据库本身来看:
1.可以增加数据库的最大连接数;
2.可以定时清理数据库中INACTIVE的会话。
对运维人员来说,只能从数据库本身入手:
select count(*) from v$process; –目前的会话
select value from v$parameter where name = ‘processes’ ; –最大会话 一般生产环境processes参数设置为2000,如果应用特别多的,可以设置为3000.
查看从哪里连接的Oracle链接数:
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会话需要创建一个存储过程找出超过2小时(根据需求设定)的会话,然后断开会话,具体如下:
CREATE OR REPLACE PROCEDURE DB_KILL_IDLE_CLIENTS AUTHID DEFINER AS–AUTHID DEFINER可省略。
job_no number := 0;
num_of_kills number := 0;
BEGIN
FOR REC IN (SELECT SID, SERIAL#, INST_ID, MODULE, STATUS
FROM gv$session S
WHERE S.USERNAME IS NOT NULL
AND S.LAST_CALL_ET >= 2 * 60 * 60
AND S.STATUS = ‘INACTIVE’
ORDER BY INST_ID ASC) LOOP
DBMS_OUTPUT.PUT(‘LOCAL SID ‘ || rec.sid || ‘(‘ || rec.module || ‘)’);
execute immediate ‘alter system disconnect session ”’ || rec.sid || ‘, ‘ ||
rec.serial# || ”’immediate’;
DBMS_OUTPUT.PUT_LINE(‘. killed locally ‘ || job_no);
num_of_kills := num_of_kills + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(‘Number of killed system sessions: ‘ || num_of_kills);
END DB_KILL_IDLE_CLIENTS;
创建定时任务执行这个存储过程:
begin
sys.dbms_job.submit(job => :job,
what => ‘SYS.DB_KILL_IDLE_CLIENTS;’,
next_date => to_date(’25-05-2018 17:00:00′,
‘dd-mm-yyyy hh24:mi:ss’),
interval => ‘TRUNC(sysdate,”hh”) + 1/(24)’);
commit;
end;
注意以sys角色登录操作
–单次使用:
SELECT ‘alter system disconnect session ”’ || sid || ‘,’ || serial# ||
”’ immediate;’
FROM (SELECT SID, SERIAL#, INST_ID, MODULE, STATUS
FROM gv$session S
WHERE S.USERNAME IS NOT NULL
AND S.LAST_CALL_ET >= 2 * 60 * 60
AND S.STATUS = ‘INACTIVE’
ORDER BY INST_ID ASC)
查出来的语句执行即可。