BACKUP AND RESTORE

MySQL

Delphi

Banco de Dados

29/03/2018

Bom pesquisei muito sobre como fazer backup do mysql e o restore cheguei no seguinte código:

procedure TfrmBackup.ExecutarBackup;
var aa,mm,dd, hh, mmm, ss, sss: word;
   aux : string;
begin
   aux := 'cmd.exe /c "C:\\wamp64\\bin\\mysql\\mysql5.7.19\\bin\\mysqldump --opt --flush-logs --triggers --port=3306 ';
   aux := aux + '--user=admin --password=admin --result-file=backup.sql --databases comercio"';
   lblMensagem.Caption := 'Aguarde. Efetuando Backup';
   lblMensagem.Refresh;
   if not createProcessSimple(aux) then
      lblMensagem.Caption := 'BACKUP NÃO FOI PROCESSADO!'
   else
   begin
      decodedate(date, aa, mm, dd);
      decodetime(time, hh, mmm, ss, sss);
      if FileExists('BACKUP.SQL') then
      begin
         aux := inttostr(aa) + '-';
         if mm < 10 then
            aux := aux + '0' + inttostr(mm) + '-'
         else
            aux := aux + inttostr(mm);
         if dd < 10 then
            aux := aux + '0' + inttostr(dd) + '-'
         else
            aux := aux + inttostr(dd) + '-';
         if hh < 10 then
            aux := aux + '0'+ inttostr(hh) + '.'
         else
            aux := aux + inttostr(hh) + '.';
         if mmm < 10 then
            aux := aux + '0' + inttostr(mmm)
         else
            aux := aux + inttostr(mmm);
         aux := aux + '.sql';
         RenameFile('BACKUP.SQL', aux);
         lblMensagem.Caption := 'Backup Realizado!';
      end;
   end;
end;


Ele faz o backup perfeito o problema é que eu não consigo mudar o diretório de saída do arquivo backup.sql eu até consigo gera-lo em outra pasta com:

--result-file=C:\\BACKUP\\backup.sql

só que ele salva no Directory do meu programa também e não salva com o nome data e hora no C:\\BACKUP\\. ele só salva com o nome data e hora no Directory do meu programa, alguém sabe porque ?

-----------------
Michel

Michel

Curtidas 0

Melhor post

Ilano Frota

Ilano Frota

10/04/2018

Olá Michel,

Eu faço da seguinte maneira:
No DataModule (DMDados), na seção PUBLIC crio uma variável que vai pegar o diretório da aplicação:

public
DiretorioAtual : String;


Ainda na DMDados, no evento OnCreate faço:

DiretorioAtual := ExtractFilePath(Application.ExeName);


Depois, numa Unit global, implemento a função:

function CriarArquivoBat(pDiretorio : String) : String;
{
Cria um arquivo BAT que faz o backup do banco MySQL
}
Var
  vlDia, vlData, vlBase : String;
begin
  vlDia:=IntToStr(DayOfWeek(Now()));
  vlData:=FormatDateTime('dddd', Now());
  If Trim(DMDados.pBase) = '' Then vlBase:=DMDados.DADOS.Database Else vlBase:=DMDados.pBase;
  
  DMDados.Lista.Clear;
  DMDados.Lista.Add('mysqldump.exe -B -c --single-transaction ' +
                    '--default-character-set=latin1 ' + vlBase +
                    ' -u ' + DMDados.DADOS.User + ' --password="' + DMDados.DADOS.Password +
                    '" --port=' + IntToStr(DMDados.DADOS.Port) +
                    ' -h ' + DMDados.DADOS.HostName + ' > ' + vlDia + '_BKP_' + vlBase + '_' + vlData + '.sql');
  DMDados.Lista.SaveToFile(pDiretorio + 'backupMySQL.bat');

end;


No evento OnClick do botão, por exemplo, crio o seguinte comando:

procedure TFrmMenuPrincipal.BtnBackupClick(Sender: TObject);
Var
  pDiretorio : String;
begin
  pDiretorio:=DMDados.DiretorioAtual + 'backupMySQL.bat';

  If Not FileExists(pDiretorio) Then
  CriarArquivoBat(DMDados.DiretorioAtual);

  If FileExists(DMDados.DiretorioAtual + 'mysqldump.exe') Then
  Begin
    ShellExecute(Handle, 'open',PChar(pDiretorio) , nil, nil, SW_HIDE); //SW_MINIMIZE);
  End
  Else
    If Not FileExists(DMDados.DiretorioAtual + 'mysqldump.exe') Then
    Begin
      ShowMessage('Não foi encontrado o arquivo mysqldump.exe' + #13 + #13 +
                                 'Favor entrar em contato com seu desenvolvedor..');
    End;
end;


A estrutura do bat deverá ficar:

mysqldump.exe -B -c --single-transaction --default-character-set=latin1 SUBA_TABELA -u USUARIO_DO_BANCO --password="SENHA_DO_BANCO" --port=PORTA_DO_BANCO -h SERVIDOR_DO_BANCO > NOME_DO_ARQUIVO.sql


Espero ter ajudado.
GOSTEI 1

Mais Respostas

Ilano Frota

Ilano Frota

29/03/2018

Opa! Ia me esquecendo. Lá na função CriarArquivoBat tem as linhas contendo DMDados.Lista. é que lá no DMDados, também inclui na cláusula PUBLIC a linha:
Lista : TStringList;


E no OnCreate do DataModule, também adicionei a linha

Lista:=TStringList.Create;


Acho que não esqueci mais nada rrrssss...
GOSTEI 1
POSTAR