Estou procurando alterar como os backups são feitos e estou me perguntando se existe uma maneira de determinar quais bancos de dados em um cluster postgreql não foram alterados recentemente?
Em vez de usar pg_dumpall, gostaria de usar pg_dump e despejar apenas os bancos de dados que foram alterados desde o último backup (alguns bancos de dados não são atualizados com muita frequência) - a ideia é que, se nada mudou, o backup atual deve ainda ser bom.
Alguém conhece uma maneira de determinar quando um banco de dados específico foi atualizado/alterado pela última vez?
Obrigado...
Atualizar:
Eu esperava não ter que escrever gatilhos em todo o lugar, pois não tenho controle sobre a criação de bancos de dados em um cluster específico (muito menos a criação de objetos de banco de dados em um banco de dados).
Indo mais fundo, parece que há uma correlação entre o conteúdo do arquivo $PGDATA/global/pg_database (especificamente o segundo campo) e os nomes de diretório em $PGDATA/base.
Indo em um membro, eu acho que o segundo campo do arquivo pg_database é o id do banco de dados e que cada banco de dados tem seu próprio subdiretório em $PGDATA/base (com o oid para o nome do subdiretório). Isso é correto? Em caso afirmativo, é razoável usar os registros de data e hora dos arquivos em $PGDATA/base/* como o gatilho para a necessidade de um backup?
...Ou há um modo melhor?
Obrigado novamente...
Embora o uso
select datname, xact_commit from pg_stat_database;
sugerido por @Jack Douglas não funcione (aparentemente devido ao autovacuum),select datname, tup_inserted, tup_updated, tup_deleted from pg_stat_database
parece funcionar. As alterações DML e DDL alterarão os valores das colunas tup_* enquanto avacuum
não (vacuum analyze
por outro lado...).Na chance de que isso possa ser útil para outras pessoas, estou incluindo o script de backup que coloquei em prática. Isso funciona para Pg 8.4.x, mas não para 8.2.x-- YMMV, dependendo da versão do Pg usada.
Atualização: o script foi colocado no github aqui .
Parece que você pode usar
pg_stat_database
para obter uma contagem de transações e verificar se isso muda de uma execução de backup para a seguinte:Se alguém ligou,
pg_stat_reset
você não pode ter certeza se um banco de dados mudou ou não, mas pode considerar bastante improvável que isso aconteça, seguido pelo número exato de transações para corresponder à sua última leitura.--EDITAR
veja esta pergunta SO para saber por que isso pode não funcionar. Não sei por que isso pode acontecer, mas habilitar o log pode lançar alguma luz ....
De vasculhar os documentos e grupos de notícias do postgres:
txid_current()
lhe dará um novoxid
- se você chamar a função novamente em uma data posterior, se você obtiverxid
um maior, você saberá que nenhuma transação foi confirmada entre as duas chamadas. Você pode obter falsos positivos - por exemplo, se outra pessoa ligartxid_current()
Lembre-se do carimbo de data/hora em seus arquivos contendo os dados do banco de dados e verifique se eles foram alterados. Se o fizessem, havia uma gravação.
Editar após dica do WAL: Você deve fazer isso somente após liberar as gravações pendentes.
O Postgresql 9.5 nos permite rastrear o registro de data e hora da última modificação, confira este link https://thirumal-opensource.blogspot.in/2017/03/to-track-last-modified-commit-or-get.html