Eu tenho um banco de dados MySQL decentemente grande (InnoDB) com tamanho de cerca de 400 MB. Assim, despejar todo o banco de dados com mysqldump e restaurá -lo leva uma eternidade (mais de 15 minutos, o que é inaceitável).
Para fins de depuração, preciso executar meu código em uma determinada "versão" do banco de dados e, em seguida, reverter todas as alterações (se houver) e tentar novamente (possivelmente várias vezes). Para reproduzir um bug, preciso sempre iniciar da mesma versão do DB.
Existe alguma maneira de instruir manualmente o banco de dados para criar um instantâneo point-in-time e restaurá-lo de volta sob demanda ? Idealmente, isso deve levar apenas alguns segundos (eu imagino que algum método copy-on-write seria usado).
Estou procurando uma solução independente do aplicativo final. Imagine um aplicativo da Web no qual você precisa executar seus testes de robô (o que inclui vários ciclos de solicitação/resposta). Além disso, se tratarmos o aplicativo como possivelmente com erros, também não podemos confiar nele para gerenciar reversões de transações de maneira confiável.
Acabei de tentar fazer backup /var/lib/mysql
com rsync
. Não é possível nem iniciar o MySQL após a restauração, provavelmente há algum arquivo deixado em algum lugar que quebra a integridade. De qualquer forma, eu estava procurando uma solução de nível mais alto, recorrendo a backups de nível FS apenas como última esperança.
Copiar o diretório de dados, como você mencionou, é uma maneira de realizar o que você precisa. Aqui estão os passos, e se você encontrar algum erro, por favor poste.
FLUSH TABLES WITH READ LOCK
[ Importante: Mantenha o terminal aberto]cp
, oursync
UNLOCK TABLES
chown mysql:mysql dir_name
(acho que échown -r
, então ele é executado recursivamente)Até agora, você tem várias cópias dos dados no momento que precisar.
Para "restaurar" uma cópia, você pode fazer o seguinte:
datadir
em my.cfg (ou my.ini) para um local de uma das cópias de dados e reinicie o servidor; OUEstabeleça o LVM no sistema de arquivos. Em seguida, um instantâneo leva menos de um segundo, independentemente do tamanho do conjunto de dados. Você obtém uma cópia separada do disco , mas com blocos inalterados compartilhados. Os blocos alterados são "copiar na gravação", então você precisa eliminar o instantâneo antes que ele fique muito grande. (Parece que isso não é problema.)
Como não há essencialmente nenhuma cópia de dados (a la mysqldump ou dumps de arquivos), é muito rápido. Você teria duas instâncias em execução na mesma máquina, mas apontando para diferentes "Volumes Lógicos", para que possam ser executadas de forma independente. (Observação: use uma porta diferente para cada instância.)