설정 : Postgres 8.3.6을 실행하는 공유 DB에 연결하는 mod_wsgi, Apache 및 pgbouncer를 실행하는 여러 웹 서버가 있습니다. 응용 프로그램이 장고를 실행 중입니다.PostgreSQL 유휴 트랜잭션 진단 및 읽기 pg_locks
오랫동안 놀고있는 DB의 '유휴 트랜잭션'쿼리. 물론
SELECT query_start, procpid, client_addr, current_query FROM pg_stat_activity
WHERE query_start < NOW() - interval '5 minutes';
대부분의 결과를 사용하기 위해 개방 유지하고있다 pgbouncer 단지 IDLE 연결입니다,하지만 때로는 쿼리이 된 '거래 IDLE'가있을 것입니다 : 그들을보기 위해, 나는 이런 식으로 뭔가를 실행하겠습니다 . 나는 이것이 뭔가를 기다리고있는 쿼리 트랜잭션이 있거나 BEGIN이 있지만 COMMIT 또는 ROLLBACK에 도달하지 않은 트랜잭션을 의미한다는 것을 이해합니다. 결과는 내가 그렇게 같은 외모를 얻을
select pg_class.relname, pg_locks.transactionid, pg_locks.mode,
pg_locks.granted as "g", pg_stat_activity.current_query,
pg_stat_activity.query_start,
age(now(),pg_stat_activity.query_start) as "age",
pg_stat_activity.procpid
from pg_stat_activity,pg_locks
left outer join pg_class on (pg_locks.relation = pg_class.oid)
where pg_locks.pid=pg_stat_activity.procpid
and pg_stat_activity.procpid = <AN IDLE TRANSACTION PROCESS>
order by query_start;
많은 시간을 :
relname | transactionid | mode | g | current_query | query_start | age | client_addr | procpid
---------+---------------+-----------------+---+-----------------------+------------------------------+-----------------+----------------+---------
| | AccessShareLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
| | AccessShareLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
| | AccessShareLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
| | AccessShareLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
| | AccessShareLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
| | AccessShareLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
| | AccessShareLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
| | AccessShareLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
| | ExclusiveLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
| | AccessShareLock | t | <IDLE> in transaction | 2010-07-22 15:33:11.48136-04 | 00:23:35.029045 | 192.168.100.99 | 1991
(10 rows)
I를
내 다음 단계는 프로세스가 기다리고 무엇을 결정하기 위해 pg_locks를 사용하려고했다 이 글을 읽는 방법을 모르겠다. (실제로 pg_locks를 이해하지 못했기 때문이다.) 이름이 없으니 아무 것도 기다리지 않는다고 말하는 겁니까? 나는 그것이 '사실'이라고 인정한다면, 그것은 자물쇠를 가지고 있다고 생각했다. 이 모든 결과가 주어지기 때문에, pg_locks는 기다리고있는 것보다 내가 가지고있는 잠금을 보여 줍니까?
지금 당장은 아파치를 재시작하여 '수정'하고 있는데, 이는 트랜잭션을 느슨하게하는 것처럼 보입니다.하지만 분명히 실제 해결책은 아닙니다. 나는 Postgres가 나를 찾아 낼 곳을 찾고 있는데, 특히 장고는 연결과 트랜잭션을 자동으로 관리해야하기 때문에. 이 문제를 볼 이유
장고를 들어
성 (姓)에 아무것도 표시되지 않는 데는 잘못된 데이터베이스에 연결되어있는 것 같습니다. 쿼리를 실행하는 연결은 관계가있는 동일한 db에 연결되어야합니다. 그렇지 않으면 이름을 제공 할 수 없습니다. 나는 당신이 "postgres"데이터베이스에 연결되어있는 것 같아서 쿼리를 실행할 때 ... –