세션을 kill할때 클라이언트의 IP와 port를 이용하여 세션 ID를 찾아서 kill 할 수 있나요.?
가능하다면 ASE, ASIQ 나눠서 방법을 좀 알려 주세요..
초보라서 어떤 정보를 어떻게 보는 잘 모릅니다. 고수님들의 조언 부탁드립니다..
ASE에서는 sp_who라는 명령으로
사용자의 프로세스를 확인 할 수 있습니다.
해당하는 사용자의 프로세스를 어떻게 구별하느냐가 문제이지요.
프로세스가 running중이라면 running 중인 것 중에서 찾으면 됩니다.
sp_lock을 이용하여 lock을 잡고 있는 프로세스를 확인 할 수도 있습니다.
사용자의 IP와 Port를 이용해서 세션ID를 찾는다는 것은 불가능합니다.
사용자가 ASE에 연결되어 있다면,
select @@spid를 이용해여 프로세스 번호를 알 수 있을 텐데 말이죠.
몇가지 팁을 드리자면,
Application을 개발하여 사용하는 경우 Application에서 DB 연결시 프로그램명을 구분할 수 있도록 명칭을 주도록 하는 것이 좋습니다.
select * from master..sysprocesses를 하시면
program_name 으로 확인할 수 있습니다.
또한 Windows 플랫폼을 사용하는 사용자의 컴퓨터이름을 구분이 되도록 관리하는 것입니다.
그러면 sp_who에서 hostname이 컴퓨터이름으로 나타나게 되지요.
세션을 죽이는 방법은 sa_role을 가진 계정(대부분 sa)의 사용자가
kill @spid 하시면 됩니다.
Syntax Help------------------------------------------------------------- Transact-SQL kill - Kills a process. kill spid
IQ에서는 DBA가 sp_iqconnection 명령으로 사용자IP를 찾을 수 있습니다.
NodeAddr 항목에서 사용자 IP를 확인하셔서 ConnHandle 번호의 해당 세션을 cancel 요청하시면 됩니다.
명령은
drop connection @ConnHandle
입니다.
IQ에서는 해당 세션이 많은 자원을 이용하여 진행중이었다면, 해당 자원을 다시 서버에 반환하거나 rollback 수행으로 인해 세션이 끊어지는데 시간이 오래 걸리는 경우가 있습니다. drop connection으로 취소요청을 한 후에 sp_iqconnection으로 확인해 보면 여전히 나타나는 경우가 그런 경우입니다. 이러한 경우에는 시간이 오래 걸리더라도 기다리시거나, 사용자가 없거나 서버를 재 시작해도 무방한 경우에는 IQ 서버를 다시 시작해 주시면 됩니다.
사용자의 세션을 강제로 끊는 것은 함부로 하면 안됩니다.
DBA나 담당자라 하더라도 세션을 강제로 끊음으로서 발생하는
장애나 피해에 대해서는 자신이 책임을 져야할 만큼
중요한 사항이 될 수 있습니다.
또한 DBA는 sa등의 관리자 계정에 대한 패스워드를 함부로 유출시킴으로써 예상하지 못할 문제를 방조하게 되는 일이 없도록
패스워드 관리와 보안에 항상 신경을 써야 합니다.
ASE에서도 가능 합니다.
버젼이 12.5.1인가 이후 부터(정확치 않음, 원래 되던가?)
master..sysprocesses 에 ipaddr이라는 항목이 있어서
clinet의 ip를 알수가 있습니다.
아님 sp_client_addr이라는 procedure를 호출 해도 되고요..
수고하세요