Posso usar o Robocopy do Windows para fazer backup seguro das tabelas do MySQL?

2

Eu tenho um banco de dados MySQL em um servidor executando o Windows 7, e quero criar uma cópia rápida (mas segura!) sem desligar nada. Eu emito FLUSH TABLES WITH READ LOCK, executo o Robocopy e, em seguida, emito UNLOCK TABLES. Aqui está o problema: Se eu usar a opção / B para Robocopy, ele imprime muitas mensagens dizendo "O processo não pode acessar o arquivo porque ele está sendo usado por outro processo." E apenas copia 209 dos 535 arquivos em dados MySql diretório. Se eu deixar a opção / B, o Robocopy relatará que todos os arquivos foram copiados. Mas agora estou inseguro. Eu estou supondo que o MySQL deixa os arquivos da tabela abertos mesmo quando as coisas estão travadas, e o Robocopy / B decide que fazer backup deles não seria seguro. Sem / B, o Robocopy faz seu melhor esforço, o que deve funcionar porque o MySQL não está fazendo nenhuma E / S, mas eu gostaria de ter uma opinião de alguém mais sábio do que eu. Obrigado!

    
por samwyse 04.09.2015 / 23:38

1 resposta

4

MyISAM

Se você tem um banco de dados all-MyISAM, isso pode funcionar porque todas as tabelas MyISAM terão 0 contadores de arquivos em seus cabeçalhos.

InnoDB

Se você tiver alguma tabela InnoDB, FLUSH TABLES WITH READ LOCK; pode não fornecer isolamento adequado para a integridade dos dados. Eu escrevi sobre isso no DBA StackExchange em novembro de 2012 (Como executar um backup frio com o Linux / tar sem desligar o MySQL slave ?)

Dada a Arquitetura InnoDB (Imagem feita por Percona CTO Vadim Tkechenko)

existemquatroobjetosqueaindaestãoemmovimentoapósaemissãodeFLUSHTABLESWITHREADLOCK;:

  • Bufferdegravaçãodupla
  • Inserirbuffer
  • RedoLogs
  • AnularRegistos

SuponhaquevocêexecuteFLUSHTABLESWITHREADLOCK;eRobocopyeleve5minutosparacopiar,oquesignificaqueasalteraçõesfísicasqueestãosendofeitasduranteos5minutosnãoestarãopresentesnobackup.Piorainda,asalteraçõesnoarquivonãoserãodeumúnicopontonotempo.Issosignificaquepodehaveralgunsarquivos.ibdquepodemounãotersidoalterados,masatransaçãoquemantémsuasalteraçõesnãofoitotalmenteconfirmada.

Vocêteriaquecopiarosdadosparaoutramáquina,iniciaroMySQLeverificarsearecuperaçãodefalhas(queocorreduranteainicializaçãodomysqld,lereprocessaressesquatroobjetos)tornaosdadosestáveiseutilizáveis.

Émelhorvocêusarmysqldumpcomaopção--single-transaction.

Paraalgumasideias,vejaminhaspostagensantigasnoDBAStackExchange

por 07.09.2015 / 23:29