Primeiro de tudo, eu sou um desenvolvedor, não um DBA ou administrador de sistemas; por favor, seja gentil :)
Estou trabalhando em um fluxo de trabalho de aplicativos em que uma única ação do usuário acionará alterações complexas no banco de dados - criando centenas de registros em algumas tabelas, atualizando centenas de registros em outros, etc. No total, cerca de 12 tabelas ) são tocados por esta ação. Devido à complexidade, é muito difícil reverter manualmente todas as alterações antes que eu possa executar outro teste. Durante a maior parte do meu tempo de desenvolvimento, posso simplesmente inserir uma instrução "ROLLBACK" perto do final do fluxo de trabalho, mas quando chego perto de confirmar minhas alterações, preciso testar a realidade.
Eu tenho uma cópia local do banco de dados de produção para trabalhar. No meu caso, despejar e restaurar entre testes é mais rápido do que escrever um script para desfazer todas as alterações. É mais rápido, mas ainda está me deixando muito lento (a restauração leva cerca de 20 minutos no meu laptop antigo). Existe alguma maneira de salvar um instantâneo do estado atual do banco de dados e restaurá-lo rapidamente?
Tenho a garantia de ser o único usuário no sistema e tenho acesso root. O dump do banco de dados tem ~ 100 MB quando tar'ed e gzip'ed. A versão do PostgreSQL é 8.3.
Agradecemos antecipadamente por quaisquer idéias úteis.
fonte
Respostas:
Você pode usar instantâneos no nível do sistema de arquivos, mas isso geralmente é bastante complicado, precisa de sistemas de arquivos especiais e nem sempre está disponível, principalmente em laptops antigos. ;-)
Que tal criar seu estado base como um banco de dados e depois criar um novo banco de dados para sua execução de teste, usando a
CREATE DATABASE ... TEMPLATE
funcionalidade Após o teste, você joga fora esse banco de dados. Então sua restrição de velocidade é essencialmente apenas o tempo paracp -R
o diretório do banco de dados. Isso é o mais rápido possível sem a mágica do instantâneo do sistema de arquivos.fonte
Use Stellar , é como o git para bancos de dados:
fonte
Se seu banco de dados for executado no Virtualbox , você poderá facilmente salvar instantâneos e restaurar instantâneos do estado do banco de dados e do próprio SO em alguns segundos (ou 1-2 minutos se você realmente tiver muitos dados no banco de dados ou no SO ou muito pouca memória alocada para a máquina virtual) gratuitamente.
Na sua maioria dos casos, seria melhor instalar um linux leve (que um servidor Windows) para executar a máquina virtual em que o banco de dados está hospedado, desde que você mencione que você tem poucos recursos disponíveis no seu laptop.
No site de produção, eu uso os backups de captura instantânea do MediaTemple para obter o mesmo resultado (mas custa 20 $ por slot de backup e é específico para esse serviço de hospedagem na web , para que não seja adequado a você).
fonte
Provavelmente não é a resposta que você está esperando, mas você considerou um nível mais baixo de captura de imagem - LVM, por exemplo?
fonte
Encontrei essa pergunta ao tentar fazer o mesmo e acabou usando o git no diretório de dados do postgresql. Descartar as alterações é tão fácil quanto:
fonte
Ainda outra opção que poderia ser experimentada seria realmente salvar uma cópia do diretório de dados do postgresql e apenas reescrever o diretório existente com a cópia quando você quiser restaurá-lo. Isso exigirá mais espaço no disco, mas definitivamente será mais rápido do que restaurar a partir de um backup. Não tenho certeza se isso seria mais rápido que o método do modelo, portanto, seria uma boa ideia fazer alguns testes primeiro.
fonte
Embora eu tenha que dizer a solução
Stellar
egit reset --hard
seja interessante, terei um problema com bancos de dados e testes maiores e uso asVirtualbox
soluções etc., no entanto, em testes maiores, elas se tornam um pouco mais "problemáticas" quando você estão usando soluções bare metal etc.Portanto, tenho que mencionar
ZFS
como um sistema de arquivos a considerar para estes no futuro pelas seguintes razões que @ Peter Eisentraut também mencionou:para fazer um teste, logo antes do teste, o postgresql pára como acima,
zfs snapshot $SNAPSHOT
inicie o postgresql e, em seguida, faça o rollback, pare o postgresql e apenaszfs rollback $SNAPSHOT
Compactação - O Postgresql recebe uma compactação típica de 3: 1 em meus bancos de dados, para que você possa fazer muitos testes;)
fonte