Desejo verificar quais tabelas foram atualizadas em um determinado período, por exemplo, em ordem decrescente de tempo de acesso por tabela.
Como posso obter isso para o PostgreSQL?
Desejo verificar quais tabelas foram atualizadas em um determinado período, por exemplo, em ordem decrescente de tempo de acesso por tabela.
Como posso obter isso para o PostgreSQL?
Você pode obter algumas informações sobre a última alteração em uma tabela com
xmin
, por exemplo:Mas você precisa estar ciente de muitas advertências , incluindo modulo, wraparound e frozen xids .
banco de ensaio:
método:
limpar:
Uma instalação básica do PostgreSQL não registra o acesso às tabelas.
Se você precisar disso, terá que implementá-lo sozinho. Eu usaria gatilhos para isso. Eu uso uma configuração como esta para muitas das minhas tabelas. Eu adiciono uma coluna nomeada
log_up
às tabelas para as quais desejo rastrear atualizações:Use
timestamptz
(timestamp with time zone
) que funciona em fusos horários:Função de gatilho:
Acionar:
Existem alguns parâmetros de registro relacionados nos quais você pode estar interessado adicionalmente. Gostar
log_connections
oulog_statement
.Atualização: Considere também "commit timestamps" adicionados no Postgres 9.5 :
Adicionar gatilho a todas as tabelas
Você pode criar um script para todas as tabelas existentes consultando o catálogo do banco de dados. Por exemplo, para gerar as instruções DDL para todas as tabelas no esquema
public
:Retorna:
Claro, todos eles precisam ter uma coluna
log_up
do tipotimestamptz
primeiro. Você pode criar um script DDL para adicionar a coluna a todas as tabelas de maneira semelhante.Log apenas por último
UPDATE
por tabelaSe você estiver interessado apenas no último
UPDATE
por tabela, uma solução mais simples servirá. Aqui está uma demonstração de como acompanhar em uma tabela centralizada:Acionar. Consulte o manual sobre as variáveis especiais que utilizo:
Tabela fictícia para testes:
Digite a linha para a tabela na tabela de log:
Acionar. Observe que eu uso um
AFTER
gatilhoFOR EACH STATEMENT
(mais barato). Mais no manual aqui.Teste:
Voilá:
Ou , se você deseja excluir atualizações vazias (nada alterado), mas a um custo mais alto porque várias linhas atualizadas acionam várias atualizações de log:
Para criar gatilhos para todas as tabelas que você deseja incluir neste regime, use um script de criação de DDL semelhante ao acima.