Não tenho certeza se isso é verdade, mas lembro de ler se você executar o seguinte comando no linux
mysqldump -u username -p database_name > backup_db.sql
enquanto as leituras e gravações estão sendo feitas em um banco de dados, o dump pode conter erros.
Existem opções específicas no comando mysqldump
para garantir que isso seja feito com segurança em um sistema ativo? Concordo com leituras/gravações sendo desabilitadas para nossos usuários por alguns segundos (o banco de dados <50 MB)
Todos os dados são InnoDB
Isto é o que lhe dará um instantâneo exato do momento dos dados:
--single-transaction
produz um ponto de verificação que permite que o dump capture todos os dados anteriores ao ponto de verificação enquanto recebe as alterações de entrada. Essas alterações recebidas não se tornam parte do dump. Isso garante o mesmo point-in-time para todas as tabelas.--routines
despeja todos os procedimentos armazenados e funções armazenadas--triggers
despeja todos os gatilhos para cada tabela que os possuiTodos os dados são MyISAM ou Mix de InnoDB/MyISAM
Você terá que impor um bloqueio de leitura global, executar o mysqldump e liberar o bloqueio global
De uma chance !!!
ATUALIZAÇÃO 2012-06-22 08:12 EDT
Como você tem menos de 50 MB de dados totais, tenho outra opção. Em vez de lançar um comando SLEEP em segundo plano para manter o bloqueio de leitura global por 86400 segundos (essas 24 horas) apenas para obter o ID do processo e matar fora, vamos tentar definir um tempo limite de 5 segundos no mysql em vez do sistema operacional:
Essa é uma abordagem mais limpa e simples para bancos de dados muito pequenos.
--single-transaction
opção, conforme mencionado em outra resposta.--lock-tables
.Veja a documentação oficial aqui
Aqui está como eu fiz isso. Deve funcionar em todos os casos, uma vez que usa
FLUSH TABLES WITH READ LOCK
.O comando shell
sleep
é apenas para garantir que a tarefa em segundo plano executando o comando de bloqueio mysql seja executada antes do início do mysqldump. Você pode reduzi-lo para 1 segundo e ainda deve estar bem. Aumente para 30 segundos e tente inserir um valor em qualquer tabela de outro cliente durante esses 30 segundos você verá que está bloqueado.Existem 2 vantagens em usar este bloqueio manual em segundo plano, em vez de usar as
mysqldump
opções--single-transaction
e--lock-tables
:mysqldump
durante o mesmo período de bloqueio. É útil, por exemplo, ao configurar a replicação em um nó mestre, porque você precisa obter a posição do log binárioSHOW MASTER STATUS;
no estado exato do dump que você criou (antes de desbloquear o banco de dados), para poder criar um escravo de replicação.Se você quiser fazer isso para MyISAM ou tabelas mistas sem nenhum tempo de inatividade devido ao bloqueio das tabelas, você pode configurar um banco de dados escravo e tirar seus instantâneos de lá. A configuração do banco de dados escravo, infelizmente, causa algum tempo de inatividade para exportar o banco de dados ativo, mas uma vez que esteja em execução, você poderá bloquear suas tabelas e exportar usando os métodos descritos por outros. Quando isso estiver acontecendo, ele ficará para trás do mestre, mas não impedirá o mestre de atualizar suas tabelas e o recuperará assim que o backup for concluído.
A sugestão da documentação oficial do mysql é que você deve ter um banco de dados mestre "M1" e um banco de dados escravo "S1" que é descrito em "Cenário 2: Backup com um escravo somente leitura" Fazendo backup de um mestre ou escravo fazendo-o Somente leitura
Você deve definir o banco de dados escravo somente leitura e executar
se você tiver uma tabela MYISAM muito grande e precisar despejar a tabela sem bloqueio e evitar alta carga do servidor, poderá usar o script a seguir.