Ao mexer com o sistema de arquivos do MySQL, você precisa parar o servidor MySQL. Para evitar o tempo de inatividade em sua máquina ativa, use uma máquina de backup / virtualizada com a mesma versão do servidor MySQL. Enquanto o servidor MySQL BACKUP está parado, copie as tabelas (eu suponho .FRM, .MYI etc?) Para o sistema de arquivos em / var / lib / mysql / BACKUP_DB (o diretório correspondente do BACKUP_DB).
Inicie o servidor MySQL BACKUP e assegure-se de que os dados foram carregados corretamente usando scripts ou CLI. Quando verificado, mysqldump o banco de dados BACKUP_DB para que possa ser carregado no servidor live:
mysqldump --extended-insert BACKUP_DB > /root/sql/BACKUP_DB.sql
Você agora converteu seus dados de backup brutos em instruções SQL que podem ser carregadas no MySQL sem tempo de inatividade (ao contrário dos dados brutos). Mova BACKUP_DB.sql
para a máquina ativa.
Importe BACKUP_DB.sql
para sua instância do LIVE MySQL como um banco de dados diferente:
mysql BACKUP_DB < /root/sql/BACKUP_DB.sql
Agora você deve ter o banco de dados de backup carregado no MySQL como BACKUP_DB.
Agora, depende das instruções INSERT IGNORE ou REPLACE INTO (você sobrescreve dados antigos ou "preenche os espaços em branco" em seus índices?):
mysqldump --no-create-db
--no-create-info --extended-insert --insert-ignore MERGE_SOURCE | mysql BACKUP_DB
Ou, para a ação REPLACE INTO:
mysqldump --no-create-db --no-create-info --extended-insert MERGE_SOURCE | sed 's/INSERT INTO/REPLACE INTO/g' | mysql BACKUP_DB
Como alternativa, em vez de direcionar a saída de volta para o MySQL, envie para um arquivo e revise as instruções SQL.
mysqldump --no-create-db --no-create-info --extended-insert --insert-ignore MERGE_SOURCE > /root/sql/merge.sql
mysqldump --no-create-db --no-create-info --extended-insert MERGE_SOURCE | sed 's/INSERT INTO/REPLACE INTO/g' > /root/sql/merge.sql
Por fim, para evitar o tempo de inatividade, despeje o primeiro banco de dados ao longo do segundo:
mysqldump BACKUP_DB | mysql CURRENT_DB
Você sempre pode bloquear o banco de dados primeiro para evitar que os dados sejam gravados (por exemplo) na tabela z com uma chave estrangeira na tabela (que já foi gravada):
FLUSH TABLES WITH READ LOCK;
(executa o despejo como etapa anterior)
UNLOCK TABLES;
Adicione o comando FLUSH ao início de seu arquivo .sql de despejo e UNLOCK até o final.
Certifique-se de quadruplicar verificar seus nomes de banco de dados neste cenário! Faça qualquer pergunta de acompanhamento que você não tenha certeza, pois este é um dado de alto risco. Execute (e anote em detalhes) as etapas exatas necessárias em um servidor de desenvolvimento, se possível, ou virtualize seu teste ou crie um teste em pequena escala. Apenas teste. E, claro, faça backups suficientes para cobrir qualquer eventualidade de perda de dados.