Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Conexão Mysql


João Paulo Taraciuk

Pergunta

Boa tarde a todos

Estou precisando de ajuda para realizar o seguinte procedimento

No meu projeto tenho que fazer um backup do banco de dados e enviar para um FTP, bom, compactar e enviar não seria problema, o problema é que como o programa vai estar em execução no momento do backup, quando o winzip vai compactar o banco de dados, dá erro, pois o banco está sendo utilizado.

Tem como eu parar o banco ou parar o Mysql para poder realizar o backup tranquilamente ?

eu utilizo o Zeos para conectar-se com o Mysql, Delphi 7, Mysql 3.23

Já tentei fazer ZConnection.disconnect mas não deu certo.

Utilizo esta procedure para compactar o banco

procedure Tform1.compactar;

begin

If winexec(PChar('c:\arquivos de programas\winzip\winzip32.exe -a -s'+edt_passftp.Text+' C:\arquivo.zip' + ' '+

'C:\Arquivo'), sw_show) < 32 then begin

MessageDlg('Não é possível criar o arquivo compactado.', mtError, [mbOk], 0);

end;

Exit;

end;

Se alguém puder me ajudar eu agradeço!!!!

Valeu!!!

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Apenas completando...

Fechar a conexão, deve implicar no fechamento automático de qualquer dataset aberto e ligado a ela.

Mas, acho que o problema pode estar no fato da possibilidade de haverem vários usuários acessando o banco. Neste caso, este procedimento funciona se todos os usuários estiverem desconectados.

Talvez você possa utilizar o programa de linha de comando mysqldump. Veja estes artigos:

- Backup MySQL com mysqldump (ref. )

- A Database Backup Program (ref. MySQL Reference Manual)

- Técnicas de backup e restauração de dados no MySQL (ref. Forum DevMedia)

e por último, talvez este endereço seja o mais útil: Problemas para usar o mysqldump via Delphi. Acompanhe o desenvolvimento dele, no início da segunda página, a solução está próxima.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

O que eu percebi, é que mesmo que o programa esteja em execução, se eu for pelo Windows, eu consigo copiar o banco para outra pasta tranquilamente, sem dar erros, somente com CTRL+c e CTRL+V, então eu penso que se eu fizer um procedimento para fazer a cópia do banco para uma pasta temporária, para depois compactá-lo, poderia dar certo, alguém sabe como eu poderia fazer essa procedure de cópia de pastas do Windows.

Ah, obrigado a todos que responderam.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, João Paulo!

Evite a qualquer custo fazer backup físico de banco de dados. No forum do MySQL comanto sempre que o melhor e mais seguro é utilizar o Mysqldump para backup. Você pode fazer o backup online e não afeta a integridade do banco.

Recentemente desenvolvi em delphi uma ferramenta que gerasse o backup usando uma chamada ao mysqldump, o que facilitou tremendamente o usuário pois o nome do arquivo de saida contem a data e a hora da geração, o que evita sobreposição de versão de backup.

Em seu caso, a rotina que criei poderia ser utilizada:

{$R *.dfm}

function TfrmBackup.CreateProcessSimple(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;

procedure TfrmBackup.btnOKClick(Sender: TObject);
begin
   close;
end;

procedure TfrmBackup.ExecutarBackup;
var aa,mm,dd, hh, mmm, ss, sss: word;
   aux : string;
begin
   aux := 'cmd.exe /c "mysqldump --opt --flush-logs --triggers --port=3306 ';
   aux := aux + '--user=root --result-file=backup.sql --databases sase"';
   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);
         if ss < 10 then
            aux := aux + '0'+ inttostr(ss)
         else
            aux := aux + inttostr(ss);
         aux := aux + '.sql';
         RenameFile('backup.sql', aux);
         lblMensagem.Caption := 'Backup Realizado!';
      end;
   end;
   btnOK.Enabled := True;
end;

divirta-se

att

Denis Courcy

Link para o comentário
Compartilhar em outros sites

  • 0

Denis Courcy, surgiram algumas dúvidas, tipo, onde eu coloco o nome do banco de dados e onde coloco o local destino, e eu tenho que chamar a function CreateProcessSimple em algum button ou somente a procedure ExecutarBackup ?

desculpe a minha ingenuidade, mas se puder me dar um help, eu agradeço.

valeu!!!

Link para o comentário
Compartilhar em outros sites

  • 0
Denis Courcy, surgiram algumas dúvidas, tipo, onde eu coloco o nome do banco de dados e onde coloco o local destino, (...)
se você der uma olhada no 1º link do post #3 (lá em cima), você vai encontrar uma descrição completa dos parâmetros da linha de comando. Assim, lá consta que:

-B, --databases

Para copiar várias bases de dados. Neste caso, não se especificam tabelas. O nome dos argumentos refere-se aos nomes das bases de dados. Incluirá-se USE db_name na saída antes de cada base de dados.

logo, você deverá concatenar o nome do banco após esta "tag". No exemplo do colega Denis, ele utilizou o nome fixo (sase), você deverá substituí-lo ou concatenar um string com o nome do mesmo na posição específica.

(...) e eu tenho que chamar a function CreateProcessSimple em algum button ou somente a procedure ExecutarBackup ?

desculpe a minha ingenuidade, mas se puder me dar um help, eu agradeço.

se você observar, em ExecutarBackup é feita a inicialização da string com o comando e uma chamada à CreateProcessSimple passando este valor, logo...

isto significa que você deverá chamar ExecutarBackup a partir de um botão ou de qualquer lugar que você queira - isto é a seu critério. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...