2013-03-21 3 views
1

postgresql 8.3에서 세션 (특정 세션 또는 모든 세션, 그다지 상관 없음)을 종료하려고하는데 문제가 있습니다. 최신 버전 (8.4 이상)에는 트릭을 수행하는 pg_terminate_backend 명령이 있지만 postgresql 8.3에서는 사용할 수 없다는 것을 알고 있습니다. pg_stat_activity를 사용하면 활성 상태이지만 종료 할 수있는 모든 세션을 볼 수 있습니다.postgresql 8.3 세션을 종료하는 방법은 무엇입니까?

해결책은 반드시 SQL 명령 일 필요는 없지만 사용중인 OS와 독립적 (즉, DOS/UNIX 명령 없음)하고 싶습니다.

windows 서비스에서 postgres 서비스를 중지하고 시작하는 것은 완벽하게 작동하지만 이것은 OS 특정 방식입니다. 'pg_ctl restart -D DATA_DIR'을 사용한다고해서 서비스가 중단되는 것은 아닙니다. 사실 pg_ctl을 사용하여 서비스를 시도하고 재시작하려고 시도 할 때 몇 가지 이상한 동작이 발생합니다. 여하튼 pg_ctl을 사용하여 윈도우를 사용하는 것처럼 프로세스를 강제 종료 할 수있는 방법이 있다면, 아마도 그것을 사용할 수 있습니다.

어쨌든, 특정 플랫폼이 아닌 postgresql 8.3에서 하나 또는 모든 세션을 종료하는 방법을 찾고 있습니다. 어떤 도움이라도 좋을 것입니다!

+2

지원되는 버전으로 업그레이 드하는 것에 대해 정말로 생각해야합니다. 8.3은 정말 오래되었습니다. (btw : Postgres가 "DOS"에서 실행되지 않기 때문에 Postgres를 멈추게하는 DOS 명령이 없습니다) –

+0

@a_horse_with_no_name 이제는 "DOS"를 더 이상 사용하지 않습니다. 나는 주로 윈도우 GUI 접근법과 커맨드 라인 접근법을 구별하기 위해이 용어를 사용한다. 나는 용어를 오용하는 습관을 벗어나서 CMD와 같은 또 다른 간단한 단어 나 그걸 부르는 뭔가를 찾아야한다고 생각합니다. – user972276

답변

6

당신은) (pg_cancel_backend를 사용할 수 있습니다

select pg_cancel_backend(55555); 

당신은 pg_stat_activity에 이것을 사용할 수 있습니다.

select pg_cancel_backend(procpid) 
from pg_stat_activity where current_query='<IDLE>'; 

즉 당신이 시도 할 수 있습니다 작동하지 않는 경우 : 예를 들어

pg_ctl kill -TERM pid 

OS 독립되어야한다. 행동에 실질적인 차이가 있는지 확실하지 않습니다.

그 외의 경우 서버를 중지하고 시작할 수 있지만 이상한 행동을 한 것으로 나타났습니다. (어떤 종류입니까?)

마지막으로, OS 특정 옵션의 경우 Linux에서 물론 kill 명령을 사용해보십시오. kill -15 (SIGTERM)은 안전합니다. 기본적으로 pg_terminate_backend의 용도는 kill -15 <pid>입니다. kill -9 is moderately unsafe and you should use it only as a last resort.

+1

Re'kill -9'는 정말 좋은 생각이 아닌 이유에 대해 http://serverfault.com/questions/415188/kill-9-a-postgres-process를 읽으십시오. 자세한 설명에 연결하지 않고'kill -9' Pg를 사람들에게 조언하지 마십시오. 어리석은 짓을하지 않는 한 꽤 괜찮습니다.하지만 조심해야합니다. 'kill -9'는 항상 PostgreSQL가 충돌하고 다시 시작되도록하여 모든 실행중인 명령문과 커밋되지 않은 트랜잭션을 중단합니다. –

+0

고마워! pg_ctl kill이 나를 위해 일했습니다. 한 가지 지적해야 할 사실은 kill 유형 이전의 대시가 없어야한다는 것입니다. 다음은 수정 된 명령입니다. pg_ctl kill TERM pid – user972276

+0

@CraigRinger : 설명해 주셔서 감사합니다. 내가 죽일 때, 모든 세션은 어쨌든 유휴 상태 여야하므로 재시동이 문제가되지 않습니다. – user972276

0
su - posgres 
psql 


SELECT pg_terminate_backend(pg_stat_activity.procpid) FROM pg_stat_activity WHERE procpid <> pg_backend_pid() AND datname = 'dbname' ; 
drop database "database name"; 
+1

다른 사용자가 대답을 명확하게 이해할 수 있도록 대답에 몇 가지 설명을 추가하는 것이 좋습니다. –

관련 문제