Em primeiro lugar, sou um desenvolvedor, não um DBA ou administrador de sistemas; por favor, seja gentil :)
Estou trabalhando em um fluxo de trabalho de aplicativo 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 outras, etc. Ao todo, cerca de 12 tabelas (de ~ 100 ) são tocados por esta ação. Devido à complexidade, é muito difícil para mim reverter manualmente todas as alterações antes de poder 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 coisa real.
Eu tenho uma cópia local do banco de dados de produção para trabalhar. No meu caso, despejar e restaurar entre os 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 é ~ 100 MB quando tar'ed e gzip'ed. A versão do PostgreSQL é 8.3.
Agradecemos antecipadamente por quaisquer idéias úteis.
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, especialmente em laptops antigos. ;-)
Que tal você criar seu estado base como um banco de dados e, em seguida, criar um novo banco de dados a partir dele para sua execução de teste, usando a
CREATE DATABASE ... TEMPLATE
funcionalidade. Após o teste, você joga esse banco de dados fora. 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 que você obterá sem a mágica do instantâneo do sistema de arquivos.Use Stellar , é como git para bancos de dados:
Se seu banco de dados é executado no Virtualbox , você pode facilmente salvar instantâneos e restaurar instantâneos do estado do banco de dados e do próprio sistema operacional em alguns segundos (ou 1-2 minutos se você realmente tiver muitos dados no banco de dados ou no sistema operacional ou muito pouca memória alocada para a máquina virtual) gratuitamente.
Na maioria dos casos, seria melhor instalar um linux leve (do que um servidor Windows) para executar a máquina virtual onde o banco de dados está hospedado, desde que você mencione que tem poucos recursos disponíveis em seu laptop.
No site de produção, eu uso os backups de instantâneos do MediaTemple para obter o mesmo resultado (mas são 20$ por slot de backup e específico para esse serviço de hospedagem, então isso pode não servir para você).
Provavelmente não é a resposta que você está esperando, mas você considerou algum nível mais baixo de instantâneo - LVM, por exemplo?
Encontrei esta pergunta ao tentar fazer o mesmo e acabei usando o git no diretório de dados do postgresql. Descartar as alterações é tão fácil quanto:
Embora eu tenha que dizer que
Stellar
egit reset --hard
é uma solução 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.Assim, TENHO que mencionar
ZFS
como um sistema de arquivos a ser considerado no futuro pelas seguintes razões que @Peter Eisentraut também mencionou:para fazer um teste, logo antes do teste, faça uma parada postgresql como acima,
zfs snapshot $SNAPSHOT
inicie o postgresql, depois faça o rollback, pare o postgresql e apenaszfs rollback $SNAPSHOT
Compactação - O Postgresql obtém uma compactação típica de 3:1 em meus bancos de dados, para que você possa fazer muito mais testes;)
Seguindo a
TEMPLATE
resposta de Peter, estes são os comandos que eu uso:Listar bancos de dados:
Copiar banco de dados:
Excluir banco de dados:
Com estes comandos podemos fazer snapshots:
Crie um instantâneo para
mydb
db:Restaurar
mydb
a partir do instantâneo:Ainda outra opção que poderia ser experimentada seria salvar uma cópia do diretório de dados postgresql, então 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 de modelo, portanto, seria uma boa ideia fazer alguns testes primeiro.