Estou olhando para alterar como os backups são feitos e estou imaginando se existe uma maneira de determinar quais bancos de dados em um cluster postgreql não foram alterados recentemente?
Em vez de usar o pg_dumpall, eu gostaria de usar o 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 seja bom.
Alguém sabe como 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 (sem falar na criação de objetos db em um banco de dados).
Indo além, 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.
Saindo do princípio, acho que o segundo campo do arquivo pg_database é o oid 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 está 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á uma maneira melhor?
Obrigado novamente...
fonte
Respostas:
Embora o uso
select datname, xact_commit from pg_stat_database;
sugerido por @Jack Douglas não funcione (aparentemente devido ao vácuo automático),select datname, tup_inserted, tup_updated, tup_deleted from pg_stat_database
ele parece funcionar. As alterações no DML e no DDL alteram os valores das colunas tup_ * enquanto avacuum
não (vacuum analyze
por outro lado ...).Na hipótese de isso ser útil para outras pessoas, estou incluindo o script de backup que coloquei em prática. Isso funciona na página 8.4.x, mas não na 8.2.x-- YMMV, dependendo da versão da página usada.
Atualização: o script foi colocado no github aqui .
fonte
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 você pode considerar improvável o suficiente que isso aconteça, seguido pelo número exato de transações para corresponder à sua última leitura.--EDITAR
consulte esta pergunta para saber por que isso pode não funcionar. Não sei por que isso pode acontecer, mas ativar o log pode lançar alguma luz ....
fonte
pg_stat_reset
, a probabilidade do valor xact_commit correspondente ao anterior seria bastante baixa, não? Portanto, isso certamente captura a existência de alterações no DML. Agora tudo o que preciso é capturar se houve alterações no DDL.create table ...
teste rápido parece aumentar o xact_commit.Ao pesquisar os documentos e grupos de notícias do postgres:
txid_current()
fornecerá um novoxid
- se você chamar a função novamente em uma data posterior, se vocêxid
aumentar um, você sabe que nenhuma transação foi confirmada entre as duas chamadas. Você pode obter falsos positivos - por exemplo, se alguém ligartxid_current()
fonte
Lembre-se do carimbo de data / hora nos arquivos que contêm os dados do banco de dados e verifique se eles foram alterados. Se eles fizeram houve uma gravação.
Editar após a dica do WAL: você deve fazer isso somente após liberar as gravações pendentes.
fonte
O Postgresql 9.5 permite rastrear o carimbo de data / hora da última modificação modificado neste link https://thirumal-opensource.blogspot.in/2017/03/to-track-last-modified-commit-or-get.html
fonte