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

rotina de backup para bancos mysql


Denis Courcy

Pergunta

Rotina de backup completa

Prezados,

Atendendo a uma solicitação de um membro deste fórum que pedu para ensiná-lo a fazer uma rotina de backup para seu banco MySQL, e sendo eu adepto a divulgação do conhecimento, disponibilizo abaixo uma rotina (codigo fonte) completo que desenvolvi para resolver o problema de um cliente e que está em pleno funcionamento.

Este programa usa uma chamada ao DOS (prompt de comando) que aciona o utilitário de backup do mysql (o mysqldump), aguarda até o fim da execução do mesmo e entrega um arquivo ‘.sql’ com o backup do banco.

O grande ponto deste programa é a rotina createProcessSimple que consegui na net e que possibilita a chamada de um programa e a espera até que o mesmo tenha terminado.

A rotina utiliza o seguinte caso de uso (UML):

Pré-condição:

A) O usuário utilizado no mysqldump necessita ter plenos direitos para acesso ao banco de dados

B) O programa necessita de direitos de acesso, leitura, escrita e exclusão, na pasta em que será gravado o backup

Pós condição: arquivo de backup com data e hora em que foi gerado.

Requisitos Não Funcionais:

A) O programa necessita ser executado diretamente no console (para evitar tráfego na rede) servidor do banco de dados

B) O servidor do banco de dados deve ter espaço suficiente para armazenar o backup (duas ou três vezes mais que o tamanho do arquivo a ser gerado)

Caso de Uso:

1) Ator aciona programa

2) Sistema Exibe mensagem “Aguarde. Efetuando Backup”.

3) Sistema aciona chamada ao DOS para executar o mysqldump

4) Mysqldump, através da Chamada ao DOS gera arquivo “backup.sql”

5) Chamada ao DOS retorna ao sistema, após fim da execução de mysqldump informando sucesso na operação

6) Sistema renomeia arquivo “backup.sql” para a seguinte configuração: aaaammddhhmnss.sql sendo: aaaa = ano; mm = mês, dd = dia; hh = hora mn = minutos; ss = segundos.

7) Sistema exibe mensagem “Backup Realizado!”

8) Fim do caso de uso.

Fluxo de exceção no item 5

5.1 Chamada ao DOS retorna ao sistema, após fim da execução de mysqldump informando sucesso na operação

5.2 Sistema exibe mensagem “BACKUP NÃO FOI PROCESSADO!”

5.3-Vai para item 8

5.4-Fim do Fluxo de exceção.

Espero que seja útil a todos vocês assim como está sendo útil comigo.

backup.dpr

program backup;

uses
  Forms,
  unitbackup in 'unitbackup.pas' {frmBackup};

{$R *.res}

begin
  Application.Initialize;
  Application.Title := 'Backup';
  Application.CreateForm(TfrmBackup, frmBackup);
  Application.Run;
end.
unitbackup.dfm
object frmBackup: TfrmBackup
  Left = 335
  Top = 372
  BorderIcons = []
  BorderStyle = bsDialog
  Caption = 'Backup'
  ClientHeight = 129
  ClientWidth = 405
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  Icon.Data = {
    0000010001002020180000000000A80C00001600000028000000200000004000
    00000100180000000000000C0000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000001717175353537A7A7A
    7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7777773B3B3B0000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000002F2F2FA6A6A6F5F5F5
    F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5EEEEEE7777770000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000313131ACACACEBEBEB
    B3B3B3999999D1D1D1F3F3F3BBBBBB929292CACACAF6F6F67B7B7B0000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000313131ACACACD7D7D7
    6464642E2E2EA2A2A2E7E7E77474741F1F1F929292F6F6F67B7B7B0000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000313131ACACACE6E6E6
    9E9E9E7D7D7DC5C5C5F0F0F0A8A8A8737373BBBBBBF6F6F67B7B7B0000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000313131ACACACFAFAFA
    EEEEEEE8E8E8F4F4F4FBFBFBEFEFEFE6E6E6F2F2F2F6F6F67B7B7B0000000000
    002F2F2F5F5F5F62626262626262626262626262626262626262626262626242
    4242121212000000000000000000000000000000000000313131ACACACEEEEEE
    BEBEBEA8A8A8D8D8D8F4F4F4C5C5C5A1A1A1D1D1D1F6F6F67B7B7B0000000000
    006B6B6BD6D6D6DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD95
    95952A2A2A000000000000000000000000000000000000313131ACACACDADADA
    6F6F6F3C3C3CA8A8A8E9E9E97D7D7D2E2E2E999999F6F6F67B7B7B0000000000
    007B7B7BF6F6F6D5D5D5A9A9A9C9C9C9F5F5F5DBDBDBAFAFAFC3C3C3EFEFEFAC
    ACAC313131000000000000000000000000000000000000313131ACACACE3E3E3
    949494696969A3A3A3C5C5C58B8B8B646464B3B3B3F6F6F67B7B7B0000000000
    007B7B7BF6F6F69D9D9D363636818181E9E9E9ABABAB434343747474DBDBDBAC
    ACAC313131000000000000000000000000000000000000313131ACACACF7F7F7
    E3E3E3CCCCCCACACAC999999B8B8B8D7D7D7EBEBEBF6F6F67B7B7B0000000000
    007B7B7BF6F6F6B0B0B05C5C5C999999EDEDEDBBBBBB6767678E8E8EE2E2E2AC
    ACAC313131000000000000000000000000000000000000312121AC7474FEACAC
    FEACACE8A1A19677776262629F9F9FD7D2D2EBBEBEF6A6A67B53530000000000
    007B7B7BF6F6F6E7E7E7CFCFCFE1E1E1F9F9F9EBEBEBD2D2D2DEDEDEF6F6F6AC
    ACAC313131000000000000000000000000000000000000310909AC2121FE3131
    FE3131E12E2E7122222424246262629E9191CF5F5FF62F2F7B17170000000000
    007B7B7BF6F6F6DCDCDCB8B8B8D3D3D3F7F7F7E1E1E1BDBDBDCECECEF2F2F2AC
    ACAC313131000000000000000000000000000000000000310000AC0000FF0000
    FF0000DE0000620000080C0C344A4A6279799F4D4DD223236911110000000000
    007B7B7BF6F6F6A4A4A44545458B8B8BEBEBEBB2B2B25252527F7F7FDEDEDEAC
    ACAC313131000000000000000000000000000000000000310000AC0000FF0000
    FF0000DE0000620000020C0C104A4A247D7D626F6F965F5F4B2F2F0000000000
    007B7B7BF6F6F6A8A8A84D4D4D828282CECECEA1A1A1555555848484DFDFDFAC
    ACAC3131310000000000000000000000000000000000002400007F0000BC0000
    BC0000A40000480000000F0F005C5C059B9B337B7B5B5B5B2D2D2D0000000000
    007B7B7BF6F6F6E0E0E0C0C0C0B0B0B0A2A2A2AAAAAAB8B8B8D3D3D3F3F3F3AC
    ACAC3131310000000000000000000000000000000000000C00002C0000410000
    41000039000019000000141400808002D1D11276761F1F1F0F0F0F0000000000
    007B5F5FF6BEBEFEC4C4FEC4C4BD9B9B716B6B939393D1D1D1EBD7D7F9C9C9AC
    8585312525000000000000000000000000000000000000000000000000000000
    00000000000000000000181800939300F1F1009292003737001B1B0000000000
    007B2323F64747FE4949FE4949A33A3A392828555555939393C38383EF5757AC
    3131310E0E000000000000000000000000000000000000000000000000000000
    00000000000000000000181800939300F9F900D5D500AEAE0057570000000000
    007B0000F60000FF0000FF0000940000180000273131596F6F935A5AD028289B
    10102C0404000000000000000000000000000000000000000000000000000000
    00000000000000000000131300767600D0D000E7E700F6F6007B7B0000000000
    007B0000F60000FF0000FF00009400001800000F3131236F6F567070935C5C71
    3A3A201010000000000000000000000000000000000000000000000000000000
    000000000000000000000707002F2F005C5C00B0B000F6F6007B7B0000000000
    00670000CE0000D50000D500007C000014000000383800808025848459717148
    4848141414000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000D1000748B00CEF70067900000280000
    002B00005700005A00005A000034000008000000505000B6B60F96962647471E
    1E1E080808000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000051000318B0057FB002BCF0000A30000
    0000000000000000000000000000000000000000626200DEDE00AFAF00444400
    1616000606000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000D0000790000DD0000DD0000DD0000
    0000000000000000000000000000000000000000626200DEDE00DBDB00ABAB00
    6969001E1E000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000060000350000620000620000620000
    0000000000000000000000000000000000000000585800C8C800EEEE00FAFA00
    ACAC003131000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000002929005D5D009E9E00E6E600
    ACAC003131000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000545A00C7D500
    A0B1002D3E00000B000003000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000285A0060D500
    4DD80016A100006300001F000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000570000CE00
    00F50000F50000AF000037000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000002B00006700
    007B00007B00005700001B000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000000000FFFF
    C000FFFFC000FFFFC000FFFFC000FFFFC000FFFFC00000030000000300000000
    C0000000C0000003C0000003C0000003C0000003C0000003C0000003C0000003
    C0000003C0000003FF000003FF00000303C0000303C00003C3C00003C3C0FC03
    33F0FC0333F0FF03FFFFFF03FFFFFF03FFFFFF03FFFFFFC3FFFFFFC3FFFF}
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object lblMensagem: TLabel
    Left = 8
    Top = 24
    Width = 393
    Height = 37
    Alignment = taCenter
    AutoSize = False
    Caption = 'Iniciando Backup'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clRed
    Font.Height = -24
    Font.Name = 'MS Sans Serif'
    Font.Style = [fsBold]
    ParentFont = False
  end
  object btnOK: TBitBtn
    Left = 160
    Top = 80
    Width = 75
    Height = 25
    Enabled = False
    Font.Charset = ANSI_CHARSET
    Font.Color = clWindowText
    Font.Height = -21
    Font.Name = 'Arial'
    Font.Style = [fsBold]
    ParentFont = False
    TabOrder = 0
    OnClick = btnOKClick
    Kind = bkOK
  end
  object Timer1: TTimer
    Interval = 2000
    OnTimer = Timer1Timer
  end
end
unitbackup.pas
unit unitbackup;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Shellapi, Buttons, ExtCtrls;

type
  TfrmBackup = class(TForm)
    lblMensagem: TLabel;
    btnOK: TBitBtn;
    Timer1: TTimer;
    procedure btnOKClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    function CreateProcessSimple(cmd: string):boolean;
    procedure ExecutarBackup;
  public
    { Public declarations }
  end;

var
  frmBackup: TfrmBackup;

implementation

{$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;

procedure TfrmBackup.Timer1Timer(Sender: TObject);
begin
   ExecutarBackup;
   Timer1.Enabled := False;
end;

end.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Obrigado cara :D

Meu antigo tópico se tratava de um problema com rotina de back para firebird... usado em determinado cliente...

nessa semana um novo cliente solicitou exatamente oque você postou...

me ajudo pra caramba! :D

vlws msmu!

Link para o comentário
Compartilhar em outros sites

  • 0

Pelo que vi o arquivo de backup é exportado no formato sql...

Não estou muito certo, pelos programas de gerenciamento de banco você faria sem problemas, mas pelo delphi acho meio dificil,o que você poderia tentar é fazer uma query e ir adicionando linha por linha do arquivo sql e executar, tipo um for, mais ou menos assim:

var
f : textfile;
line : string;
begin
AssignFile(f, 'C:\backup.sql');
Reset(f);

while not Eof(f) do
begin
Readln(f, line);
Query1.close;
Query1.Sql.clear;
Query1.Sql.Add(line);
Query1.ExecSql;
end;

end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Eu já Tentei fazer o Backup desta forma mas demora muito e não faz nada, tem que esta em um local especifico.

Eu observei um detalhe, o arquivo Mysqldump.exe, não esta abrindo eu fui na pasta "C:\Arquivos de programas\MySQL\MySQL Server 5.0\bin\mysqldump.exe" ao clicar ele abre bem rápido e depois fecha. tem algo a ver ou é assim mesmo?

Editado por Pirambu!
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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...