Todos os dados são InnoDB
É isso que lhe dará uma captura instantânea exata dos dados no momento:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
produz um ponto de verificação que permite ao despejo capturar todos os dados anteriores ao ponto de verificação enquanto recebe as alterações recebidas. Essas alterações recebidas não se tornam parte do despejo. Isso garante o mesmo momento para todas as tabelas.
--routines
despeja todos os procedimentos armazenados e funções armazenadas
--triggers
despeja todos os gatilhos para cada tabela que os possui
Todos os dados são MyISAM ou mix de InnoDB / MyISAM
Você precisará impor um bloqueio de leitura global, executar o mysqldump e liberar o bloqueio global
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
De uma chance !!!
UPDATE 2012-06-22 08:12 EDT
Como você tem <50 MB do total de dados, tenho outra opção. Em vez de lançar um comando SLEEP em segundo plano para manter o bloqueio de leitura global por 86400 s (24 horas) apenas para obter o ID do processo e eliminar fora, vamos tentar definir um tempo limite de 5 segundos no mysql e não no SO:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
Essa é uma abordagem mais limpa e simples para bancos de dados muito pequenos.
ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
uma mensagem de erro esperada?--single-transaction
opção, conforme mencionado em outra resposta.--lock-tables
.Veja a documentação oficial aqui
fonte
Se você quiser fazer isso no MyISAM ou em tabelas mistas sem tempo de inatividade para bloquear as tabelas, poderá configurar um banco de dados escravo e tirar suas capturas instantâneas a partir daí. A configuração do banco de dados escravo, infelizmente, causa algum tempo de inatividade para exportar o banco de dados ativo, mas quando estiver em execução, você poderá bloquear suas tabelas e exportar usando os métodos descritos por outros. Quando isso está acontecendo, fica para trás do mestre, mas não impede que o mestre atualize suas tabelas e recupera assim que o backup é concluído.
fonte
Aqui está como eu fiz isso. Deve funcionar em todos os casos, uma vez que usa
FLUSH TABLES WITH READ LOCK
.O
sleep
comando shell é apenas para garantir que a tarefa em segundo plano executando o comando de bloqueio do mysql seja executada antes do início do mysqldump. Você pode reduzi-lo para 1 segundo e ele ainda deve estar bem. Aumente para 30 segundos e tente inserir valores em qualquer tabela de outro cliente durante os 30 segundos em que você verá que está bloqueado.Há duas vantagens em usar esse 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.fonte
A sugestão da documentação oficial do mysql é que você deve ter um banco de dados "M1" mestre e um banco de dados "S1" escravo, descrito em "Cenário 2: Backup com um escravo somente leitura" , fazendo backup de um mestre ou escravo, tornando-o Somente leitura
Você deve definir o banco de dados escravo somente leitura e executar
fonte
se você tiver uma tabela MYISAM muito grande e precisar despejar a tabela sem bloqueio e evitar alta carga do servidor, poderá usar o seguinte script.
fonte