Análise de instruções SQL que estão sendo executadas
Durante o desenvolvimento, os desenvolvedores geralmente encontram problemas como conexões SQL excessivas, tempo de consulta SQL longo e bloqueio de consulta SQL. Você pode usar as exibições PG_STAT_ACTIVITY and PGXC_THREAD_WAIT_STATUS para analisar e localizar problemas de SQL. Esta seção descreve alguns métodos comuns de localização.
Nome |
Tipo |
Descrição |
---|---|---|
usename |
name |
Nome do usuário que efetua logon no back-end |
client_addr |
inet |
O endereço IP do cliente conectado ao back-end null indica que o cliente está conectado por meio de um soquete Unix na máquina do servidor ou que este é um processo interno, como autovacuum. |
application_name |
text |
Nome da aplicação conectada ao back-end |
state |
text |
Estado geral do back-end. Os valores são:
NOTA:
Os usuários comuns podem visualizar apenas o status da sessão de suas próprias contas. Ou seja, as informações de estado de outras contas estão vazias. |
waiting |
boolean |
Se o back-end estiver atualmente esperando por um bloqueio, o valor será t. Caso contrário, o valor é f.
|
enqueue |
text |
Status de enfileiramento de uma instrução. Seu valor pode ser:
|
pid |
bigint |
ID do thread de back-end. |
Exibir informações de conexão
- Defina track_activities como on.
SET track_activities = on;
O banco de dados coleta as informações em execução sobre consultas ativas somente se esse parâmetro está definido como on.
- Você pode executar as seguintes instruções SQL para verificar o usuário de conexão atual, o endereço de conexão, a aplicação de conexão, o status, a espera de um bloqueio, o status do enfileiramento e o ID do thread.
1
SELECT usename,client_addr,application_name,state,waiting,enqueue,pid FROM PG_STAT_ACTIVITY WHERE DATNAME='database name';
A seguinte saída de comando é exibida:
1 2 3 4 5 6
usename | client_addr | application_name | state | waiting | enqueue | pid ---------+---------------+------------------+--------+---------+---------+----------------- leo | 192.168.0.133 | gsql | idle | f | | 139666091022080 dbadmin | 192.168.0.133 | gsql | active | f | | 139666212681472 joe | 192.168.0.133 | | idle | f | | 139665671489280 (3 rows)
- Encerre uma sessão (somente o administrador do sistema tem a permissão).
1
SELECT PG_TERMINATE_BACKEND(pid);
Exibir informações de execução de SQL
- Execute o seguinte comando para obter todas as informações SQL que o usuário atual tem permissão para exibir (se o usuário atual tiver permissão de administrador ou função predefinida, todas as informações de consulta do usuário poderão ser exibidas):
1
SELECT usename,state,query FROM PG_STAT_ACTIVITY WHERE DATNAME='database name';
Se o valor de state estiver active, a coluna de consulta indicará a instrução SQL que está sendo executada. Em outros casos, a coluna de consulta indica a instrução de consulta anterior. Se o valor de state for idle, a conexão ficará ociosa e aguardará que o usuário insira um comando. A seguinte saída de comando é exibida:1 2 3 4 5 6
usename | state | query ---------+--------+--------------------------------------------------------------------------- leo | idle | select * from joe.mytable; dbadmin | active | SELECT usename,state,query FROM PG_STAT_ACTIVITY WHERE DATNAME='gaussdb'; joe | idle | GRANT SELECT ON TABLE mytable to leo; (3 rows)
- Execute o seguinte comando para exibir as informações sobre as instruções SQL que não estão no estado ocioso:
1
SELECT datname,usename,query FROM PG_STAT_ACTIVITY WHERE state != 'idle' ;
Exibir instruções que consomem muito tempo
- Verifique as instruções SQL que levam muito tempo para serem executadas.
1
SELECT current_timestamp - query_start as runtime, datname, usename, query FROM PG_STAT_ACTIVITY WHERE state != 'idle' order by 1 desc;
As instruções de consulta são retornadas e classificadas por duração de tempo de execução em ordem decrescente. O primeiro registro é a instrução de consulta que leva mais tempo para ser executada.
1 2 3 4 5
runtime | datname | usename | query -----------------+----------+---------+----------------------------------------------------------------------------------------------------------------------------------------- 00:04:47.054958 | gaussdb | leo | insert into mytable1 select generate_series(1, 10000000); 00:00:01.72789 | gaussdb | dbadmin | SELECT current_timestamp - query_start as runtime, datname, usename, query FROM PG_STAT_ACTIVITY WHERE state != 'idle' order by 1 desc; (2 rows)
- Como alternativa, você pode definir current_timestamp - query_start para ser maior que um limite para identificar instruções de consulta que são executadas por um período maior que esse limite.
1
SELECT query from PG_STAT_ACTIVITY WHERE current_timestamp - query_start > interval '2 days';
Consultar instruções bloqueadas
- Execute o seguinte comando para exibir instruções de consulta bloqueadas:
1
SELECT pid, datname, usename, state, query FROM PG_STAT_ACTIVITY WHERE state <> 'idle' and waiting=true;
Execute a instrução a seguir para encerrar a sessão SQL bloqueada:1
SELECT PG_TERMINATE_BACKEND(pid);
- Na maioria dos casos, o bloqueio é causado por bloqueios internos e waiting=true é exibido. Você pode ver o bloqueio na exibição pg_stat_activity.
- As instruções bloqueadas sobre a gravação de arquivos e agendadores de eventos não podem ser visualizadas na exibição pg_stat_activity.
- Exiba informações sobre as instruções de consulta bloqueadas, tabelas e esquemas.
1 2 3 4 5 6 7 8 9 10 11
SELECT w.query as waiting_query, w.pid as w_pid, w.usename as w_user, l.query as locking_query, l.pid as l_pid, l.usename as l_user, t.schemaname || '.' || t.relname as tablename from pg_stat_activity w join pg_locks l1 on w.pid = l1.pid and not l1.granted join pg_locks l2 on l1.relation = l2.relation and l2.granted join pg_stat_activity l on l2.pid = l.pid join pg_stat_user_tables t on l1.relation = t.relid where w.waiting;
A saída do comando inclui um ID de sessão, informações do usuário, status da consulta e tabela ou esquema que causou o bloqueio.
Depois de encontrar a tabela bloqueada ou informações de esquema, encerre a sessão defeituosa.
1
SELECT PG_TERMINATE_BACKEND(pid);
Se informações semelhantes às seguintes forem exibidas, a sessão será encerrada com êxito:
PG_TERMINATE_BACKEND ---------------------- t (1 row)
Se informações semelhantes às seguintes forem exibidas, o usuário está tentando encerrar a sessão, mas a sessão será reconectada em vez de encerrada.
FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command The connection to the server was lost. Attempting reset: Succeeded.
Se a função PG_TERMINATE_BACKEND for usada pelo cliente de gsql para encerrar os threads em segundo plano da sessão, o cliente será reconectado automaticamente em vez de ser encerrado.