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.
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.
Pergunta
Denis Courcy
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.dfmobject 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 endunitbackup.pasunit 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
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.