O Mysql é uma ótima ferramenta para gerenciamento de banco de dados e funciona muito bem com Delphi, mas sinto falta de um componente simples para execução do backup.
Seria muito fácil fazer um backup apenas copiando os arquivos da pasta “Data” do banco mysql, como se faz com programas e pastas do computador, porem nos temos um problema quando tentamos copiar a pasta de dados, pois os arquivos estão em uso pelo servido do banco, para copiar os arquivos, poderíamos usar os comandos net use, parar o serviço, copiar o banco e iniciar o serviço novamente.
Esse tipo de backup tem que ser feito em horários em que o sistema não esteja em funcionamento, pois o banco fica indisponível.
Mas nossos sistema também devem ter rotinas que permitam que o backup seja feito a qualquer momento. para isso recomendo a leitura de um post anterior de como usar o utilitário MyDump.exe antes de prosseguir.
https://soprogramando.wordpress.com/2008/08/01/backup-no-mysql/
lembrando que o MyDump.exe está nos binários da instalação do Mysql e deve ser copiado onde o executável está instalado, e deve ser executado por parâmetros via comando.
veja um exemplo de uma função do backup.
private { Private declarations } procedure ExecutaBackupBD(); function ExecutarProcesso(cmd: string): Boolean; implementation procedure TFrmManBackup.ExecutaBackupBD; var strBanco, strHost, strUsuario, strSenha, strComando, strCaminho, strArquivo: string; begin try strCaminho := ExtractFilePath(Application.ExeName) + 'backup\'; if not DirectoryExists(strCaminho) then begin CreateDir(strCaminho); end; if FileExists(ExtractFilePath(Application.ExeName) + 'mysqldump.exe') then begin strArquivo := strCaminho + 'BD_' + FormatDateTime('YYYY-mm-dd_hhnnss', Now) + '.sql'; strHost := 'Servidor'; strUsuario :='Usuario'; strSenha := 'Senha'; strBanco := 'Banco'; strComando := 'cmd.exe /c ""' + ExtractFilePath(Application.ExeName) + '\mysqldump.exe" ' + strBanco + ' -h' + strHost + ' -u' + strUsuario + ' -p' + strSenha + ' --databases --opt -c -e ' + '>' + '"' + strArquivo + '""'; ExecutarProcesso(strComando); end else begin ShowMessage('Atenção o aplicativo auxiliar mysqldump não se encontra no diretório, ' + 'solicite o mesmo ao suporte do sistema '); end; finally FreeAndNil(Ini); end; end; function TFrmManBackup.ExecutarProcesso(cmd: string): Boolean; var SUInfo : TStartupInfo; ProcInfo: TProcessInformation; begin FillChar(SUInfo, SizeOf(SUInfo), #0); SUInfo.cb := SizeOf(SUInfo); SUInfo.dwFlags := STARTF_USESHOWWINDOW; SUInfo.wShowWindow := SW_HIDE; Result := CreateProcess(nil, PChar(cmd), nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, SUInfo, ProcInfo); if (Result) then begin WaitForSingleObject(ProcInfo.hProcess, INFINITE); CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); end; end; Colaboração Andre Langner
MUITO BOM MESMO VELHO! vlw!
olá excelente post.
porém, quando crio o arquivo ele cria a cópia do banco de dados zerada com 0kb.
a parametrização e a forma que você executa o mysqlDump.exe podem estar gerando erros, como estamos invocando um executável sem interface windows os erros não são exibidos.
recomendo que você execute o dump via prompt e observe os erros que ele vai lhe apresentar.
esse erro ocorre quando o programa não consegue executar corretamente os caminhos dos arquivos ou a autenticação com mysql falha,
envia ai ctrlC + ctrlV do teu codigo
Amigo, bom dia!
o script funcionou direitinho pelo cmd, porém a minha senha é em branco e mesmo colocando -p ” ” ele pede senha… acho que é por isso que o arquivo está sendo criado com 0bytes… sabe como resolver isso?
Mais uma dúvida: o que significa essa linha?
FreeAndNil(Ini);
FreeAndNil(NomeObjeto)
No Delphi usamos free para destruir um objeto em memória, nil e nil para colocar o valor nulo no endereço da memória.
no mysql se voce não usar senha, remova o parametro -p[senha] usando apenas -u
Funcionou mesmo. Parabéns!