No Derby (um banco de dados embutido escrito em Java que é usado principalmente para teste ou prototipagem) existem os comandos "congelar" e "descongelar" que podem ser usados durante um backup online . "Congelar" simplesmente faz com que todos os acessos ao banco de dados sejam bloqueados até que "descongelar" seja chamado. Isso é útil para fazer backup usando um programa externo, o que você pode fazer se o programa externo for muito mais rápido do que usar a solução de backup interno do Derby. Para meu caso de uso, posso tirar um instantâneo quase instantaneamente usando alguns utilitários de sistema de arquivos integrados, portanto, é uma operação de tempo constante (não O(length of DB files)
).
Estou migrando um aplicativo que superou o Derby para o PostgreSQL e gostaria de saber se há algo comparável que eu possa usar para desativar todas as conexões. Além disso, prefiro saber qual é o meu ponto de serialização de dentro do meu aplicativo para não ser pego em algum estado estranho, portanto, ser capaz de pausar/retomar todos os outros acessos é muito bom para mim.
Como o PostgreSQL tem um log de transações, eu poderia apenas tirar um instantâneo sem "congelar", mas o instantâneo precisaria ser executado pelo mecanismo de recuperação do PostgreSQL antes que eu pudesse usá-lo, porque, caso contrário, o que está armazenado no disco seria o mesmo que se eu puxasse o plugue em um sistema de arquivos normal. Esta solução não é a ideal.
EDIT Aprendi que pg_start_backup()
está próximo, mas não faz com que as transações recebidas sejam bloqueadas até que uma chamada correspondente para pg_stop_backup()
, forçando-me a fazer uma recuperação pontual de volta ao id da transação pg_start_backup()
retorna de um instantâneo do sistema de arquivos. Seria bom não ter que realmente desligar o PostgreSQL para obter isso (talvez haja um pseudo-comando de desligamento que mantém as conexões abertas?).
Não há um equivalente exato para o que você deseja. As opções incluem:
Instantâneo do sistema de arquivos atômico
Se você estiver usando um instantâneo do sistema de arquivos atômico, não precisará congelar o banco de dados. Pode tornar a recuperação um pouco mais rápida se você forçar um
CHECKPOINT
primeiro, mas é isso. Quando você tira um instantâneo do sistema de arquivos e o copia e, em seguida, inicia a cópia, para o PostgreSQL, é como se ele travasse e estivesse reiniciando. Isso está perfeitamente bem, é seguro contra acidentes e projetado para funcionar dessa maneira.Essa abordagem só é válida se o instantâneo for atômico - tudo no mesmo instante virtual. Você não pode obter um instantâneo atômico em vários sistemas de arquivos (pelo menos no Linux);
pg_start_backup
/pg_stop_backup
Se você não pode fazer um instantâneo atômico, pode habilitar o arquivamento WAL, executar
pg_start_backup
, copiar o banco de dados, executarpg_stop_backup
e capturar os últimos arquivos WAL gerados.É um pouco mais complicado, mas oferece um backup consistente sem interromper as gravações e sem precisar de instantâneos atômicos no nível do sistema de arquivos.
pg_basebackup
Uma alternativa para usar
pg_start_backup
epg_stop_backup
é usarpg_basebackup
para fazer uma cópia de streaming do banco de dados sobre o protocolo de replicação PostgreSQL com--xlog-method=stream
. Isso requer apenas uma conexão de replicação do PostgreSQL, não requer que o banco de dados seja interrompido e é bastante contínuo.--xlog-method=stream
foi adicionado apenas em versões bastante recentes epg_basebackup
é relativamente novo.pg_dump
Não mencionei inicialmente porque você estava procurando por ferramentas externas, mas sempre há
pg_dump
, que obtém umSERIALIZABLE
instantâneo do banco de dados e o despeja. O banco de dados continua funcionando normalmente (ainda pode aceitar gravações) e o despejo é totalmente consistente internamente desde o momento em que você iniciou o despejo.Quiescência de gravação
Interromper todas as transações recebidas não interromperá a gravação do PostgreSQL. Ainda terá
VACUUM
trabalho a fazer com autovacuum, checkpoints a realizar, estatísticas a escrever, etc.Não há nenhum recurso no Pg para interromper todas as gravações neste ponto. Pode ser bom adicionar, mas não tenho conhecimento de ninguém trabalhando nisso.
Alguns sistemas de arquivos, como o XFS, oferecem suporte ao congelamento de gravação no nível do sistema de arquivos; isso faz com que todas as gravações sejam bloqueadas até que o congelamento seja liberado. É seguro congelar todos os sistemas de arquivos e copiar todos os sistemas de arquivos.