O ‘pg_stat_activity’ é uma das views do PostgreSQL a ser usada quando se trata de monitoramento de sessões e diagnóstico. Ela fornece informações das atividades correntes no banco de dados, mostrando uma linha por sessão ou conexão com detalhes como o estado da consulta, o tempo de início e a consulta atual.
Como utilizar a query pg_stat_activity ?
Para obter informações sobre todas as sessões atualmente sendo executadas, você pode executar a seguinte consulta:
SELECT * FROM pg_stat_activity;
Para facilitar sua análise, você pode filtrar pelos seguintes campos no lugar do ( * ) asterisco:
Campos úteis e suas descrições |
---|
datid e datname | ID e nome do banco de dados ao qual a sessão está conectada, respectivamente. |
pid | ID do processo do sistema operacional associado à sessão. |
usesysid e usename | ID e nome do usuário do banco de dados. |
application_name | Nome da aplicação que iniciou a sessão. |
client_addr | Endereço IP do cliente. |
state | Estado atual da sessão, como 'active', 'idle', 'idle in transaction' etc. |
query_start | Timestamp de quando a consulta atual foi iniciada. |
query | Texto da última consulta executada ou atualmente em execução pela sessão. |
Exemplos de uso da view pg_stat_activity
Identificando sessões inativas
Conexões "idle in transaction" podem ser problemáticas, pois indicam transações que foram iniciadas, mas ainda não foram confirmadas nem revertidas:
SELECT * FROM pg_stat_activity WHERE state = 'idle in transaction';
Identificando consultas demoradas
Para encontrar consultas que estão sendo executadas há mais de 5 minutos, por exemplo, você pode usar:
SELECT * FROM pg_stat_activity
WHERE state = 'active'
AND now() - query_start > interval '5 minutes';
Identificando sessões ativas
Consultando sessões em estado ativas, ou seja, sessões que estão executando uma query.
SELECT * FROM pg_stat_activity WHERE state = 'active';
Identificando sessões que estão bloqueadas por outras
SELECT
blocking.pid AS blocking_pid,
blocking.query AS blocking_query,
blocked.pid AS blocked_pid,
blocked.query AS blocked_query
FROM
pg_stat_activity AS blocked
JOIN
pg_stat_activity AS blocking ON blocked.waiting_pid = blocking.pid
WHERE
blocked.wait_event IS NOT NULL;