Ir para o conteúdo

Como faço para encerrar consultas de longa duração em minha instância de banco de dados do Amazon RDS para PostgreSQL ou compatível com o Aurora PostgreSQL?

5 minuto de leitura
0

Quero encerrar um processo de longa execução na minha instância de banco de dados (DB) do Amazon Relational Database Service (Amazon RDS) para PostgreSQL ou da edição do Amazon Aurora compatível com PostgreSQL.

Breve descrição

Dependendo do seu caso de uso, é possível usar a função pg_cacnel_backend(pid) ou pg_terminate_backend(pid).

Use a função pg_cancel_backend(pid) para enviar um sinal SIGINT para um processo de backend específico e cancelar a consulta atual de longa duração. Durante esse processo, a conexão com o banco de dados permanece ativa. O backend pode continuar processando outras consultas ou transações depois que a função encerra a consulta atual ordenadamente.

Use a função pg_terminate_backend(pid) para finalizar uma consulta e fechar a conexão. Use essa função para enviar um sinal SIGTERM para um processo de backend específico e encerrar à força a conexão associada ao processo. Esse processo reverte e libera transações abertas ou bloqueios retidos na conexão.

Para obter mais informações, consulte Server signaling functions (Funções de sinalização do servidor) no site do PostgreSQL.

Observação: algumas versões compatíveis com o Aurora PostgreSQL não podem encerrar um processo de autovacuum, mesmo quando você atende a todos os requisitos do sistema. Ao tentar finalizar um processo de autovacuum nessas versões, você pode receber a seguinte mensagem de erro:

"ERROR: 42501: must be a superuser to terminate superuser process LOCATION: pg_terminate_backend, signalfuncs.c:227."

Algumas versões secundárias permitem que rds_superuser encerre processos de autovacuum que não estão explicitamente associados a um perfil. Para verificar se sua versão permite que o rds_superuser encerre os processos de autovacuum, consulte Atualizações do Amazon Aurora PostgreSQL.

Resolução

Para usar pg_cacnel_backend(pid) ou pg_terminate_backend(pid), você deve ser um dos seguintes usuários:

  • Você é um rds_superuser ou membro do perfil padrão pg_signal_backend.
  • Você está conectado ao banco de dados como o mesmo usuário do banco de dados da sessão que deseja cancelar.

Para finalizar a consulta de longa duração, você deve ter o ID do processo (PID) da transação. Para encontrar o PID, execute a consulta pg_stat_activity e visualize a coluna pid. Para obter mais informações, consulte pg_stat_activity no site do PostgreSQL.

Use a função pg_cancel_backend(pid)

Quando você executa o comando a seguir em outra sessão, a função usa o PID da consulta de longa duração para cancelar a consulta do backend do banco de dados:

SELECT pg_cancel_backend(8121);

Observação: no comando anterior, o PID da consulta é 8121.

Saída esperada:

pg_cancel_backend
 ------------------------
 t

Na saída anterior, o valor t de "true" mostra que a função cancelou a consulta. Se a consulta não existir mais ou não houver conexão ativa com o banco de dados, a saída mostrará um valor f de "false".

Use a função pg_terminate_backend(pid)

Quando você executa o comando a seguir em uma sessão diferente, a função encerra a conexão do banco de dados com pid 8121:

SELECT pg_terminate_backend(8121);

Saída esperada:

pg_terminate_backend
------------------------
 t

A saída anterior mostra t mesmo que a função não tenha cancelado a consulta. A resposta mostra que a função enviou com sucesso o sinal SIGTERM. A função não interrompe imediatamente o processo de backend. Para manter a memória compartilhada em um estado consistente, o comando inicia um processo de desligamento ordenado durante CHECK_FOR_INTERRUPTS.

Cancele um processo de longa duração que não termina

Quando você executa pg_cancel_backend(pid) ou pg_terminate_backend(pid) em uma seção interruptível, as funções não podem cancelar a consulta. Por exemplo, o processo tenta adquirir um bloqueio leve. Ou o processo está aguardando a conclusão de uma chamada de sistema de leitura ou gravação do armazenamento. Nesses casos, o processo de backend não recebe o sinal de cancelamento e é pausado indefinidamente.

Se o processo não responder aos métodos de cancelamento, reinicie todo o mecanismo do banco de dados e encerre o processo pausado à força.

É uma prática recomendada ajustar os parâmetros de tempo limite, como statement_timeout, idle_in_transaction_session_timeout e idle_session_timeout nas versões 14 e posteriores do PostgreSQL. Também é uma prática recomendada configurar tempos limite do lado do cliente e do lado do servidor, como tcp_keepalives_idle, tcp_keepalives_interval e tcp_keepalives_count.

Observação: como esses parâmetros de tempo limite são dinâmicos, você não precisa reinicializar seu banco de dados para que as alterações ocorram.

Configure os parâmetros com base em seus requisitos. Por exemplo, é possível definir os parâmetros nos seguintes níveis:

  • O nível de declaração individual para consultas específicas
  • O nível de usuário para todas as consultas de um usuário específico
  • O nível do banco de dados para controlar o comportamento em um banco de dados inteiro
  • O nível do grupo de parâmetros da instância para estabelecer configurações globais

Observação: como um tempo limite curto cancela consultas intencionais de longa duração, não defina um tempo limite curto em nível de instância ou banco de dados. Se você definir log_min_error_statement como ERROR ou inferior, o Amazon RDS registra em log a declaração que atingiu o tempo limite. Para obter mais informações, consulte Statement behavior (Comportamento da declaração) no site do PostgreSQL.

Informações relacionadas

Como faço para verificar a execução de consultas e diagnosticar problemas de consumo de recursos para minha instância de banco de dados Amazon RDS para PostgreSQL ou Aurora PostgreSQL?

Como identifico e soluciono problemas de desempenho e consultas de execução lenta em minha instância de banco de dados do Amazon RDS para PostgreSQL ou compatível do Aurora PostgreSQL?