Ir al contenido



Foto

Backup automatico mySql


  • Por favor identifícate para responder
2 respuestas en este tema

#1 seoane

seoane

    Advanced Member

  • Administrador
  • 1.249 mensajes
  • LocationEspaña

Escrito 13 septiembre 2012 - 01:01

En realidad el siguiente código se puede utilizar para cualquier base de datos, o similar, que tenga una utilidad como mysqldump ya que el programa permite definir la linea de comandos para hacer la copia.

El código es el siguiente (es una aplicación de consola):


delphi
  1. program mySqlBackup;
  2.  
  3. uses
  4.   Windows,
  5.   SysUtils,
  6.   Classes;
  7.  
  8.  
  9. function Comparar(List: TStringList; Index1, Index2: Integer): Integer;
  10. begin
  11.   Result:= Integer(List.Objects[Index1]) - Integer(List.Objects[Index2]);
  12. end;
  13.  
  14. procedure Buscar(Path,Mask: string; Attr: Integer; Lista: TStringList);
  15. var
  16.   SearchRec: TSearchRec;
  17. begin
  18.   if Copy(Path,Length(Path),1) <> '\' then
  19.     Path:= Path + '\';
  20.   if FindFirst(Path + Mask,Attr,SearchRec) = 0 then
  21.   repeat
  22.     Lista.AddObject(Path + SearchRec.Name, TObject(SearchRec.Time));
  23.   until FindNext(SearchRec) <> 0;
  24.   FindClose(SearchRec);
  25.   Lista.CustomSort(Comparar);
  26. end;
  27.  
  28. // Borra los backups mas antiguos
  29. procedure BorrarAntiguos(Path: String; i: Integer);
  30. var
  31.   Lista: TStringList;
  32. begin
  33.   if i < 1 then i:= 1;
  34.   Lista:= TStringList.Create;
  35.   try
  36.     Buscar(Path,'*.sql',faAnyFile,Lista);
  37.     while Lista.Count > i do
  38.     begin
  39.       DeleteFile(Lista[0]);
  40.       Lista.Delete(0);
  41.     end;
  42.   finally
  43.     Lista.Free;
  44.   end;
  45. end;
  46.  
  47. // Ejecuta un comando y espera a que termine
  48. function EjecutarCmd(Cmd: String): Boolean;
  49. var
  50.   ProcInfo: PROCESS_INFORMATION;
  51.   StartupInfo: TSTARTUPINFO;
  52.   Code: Cardinal;
  53.   ComSpec: String;
  54. begin
  55.   Result:= TRUE;
  56.   FillChar(StartupInfo,Sizeof(StartupInfo),#0);
  57.   StartupInfo.cb:= Sizeof(StartupInfo);
  58.   StartupInfo.wShowWindow:= SW_HIDE;
  59.   StartupInfo.dwFlags:= STARTF_USESHOWWINDOW;
  60.   ComSpec:= Trim(GetEnvironmentVariable('ComSpec'));
  61.   if ComSpec = EmptyStr then
  62.     ComSpec:= 'cmd.exe';
  63.   Cmd:= ComSpec + ' /c ' + Cmd;
  64.   if CreateProcess(nil,PChar(Cmd),nil,nil,FALSE,0,nil,nil,StartupInfo,
  65.     ProcInfo) then
  66.     repeat
  67.       Sleep(10);
  68.       GetExitCodeProcess(ProcInfo.hProcess, Code);
  69.     until (Code <> STILL_ACTIVE);
  70. end;
  71.  
  72. var
  73.   Mutex: THandle;
  74.   Ruta: String;
  75. begin
  76.   // mySqlBackup Cmd Ruta Copias
  77.   if ParamCount <> 3 then
  78.     Exit;
  79.   // Creamos un mutex para impedir que se ejecute mas de una instancia a la vez
  80.   Mutex:= CreateMutex(nil,FALSE,'{37E3183A-38F9-4C66-A259-D4AE512A5CF3}');
  81.   if Mutex <> 0 then
  82.   try
  83.     if GetLastError = 0 then
  84.     begin
  85.       // Le añadimos la '\' al final de la ruta
  86.       Ruta:= IncludeTrailingPathDelimiter(ParamStr(2));
  87.       // Si es necesario creamos el directorio de destino
  88.       ForceDirectories(Ruta);
  89.       // Ejecuatamos el comando "Cmd > Ruta\yyyymmddhhnnsszzz.sql"
  90.       EjecutarCmd(ParamStr(1) + ' > ' +
  91.         Ruta + FormatDateTime('yyyymmddhhnnsszzz',Now) + '.sql');
  92.       // Borramos los backups mas antiguos
  93.       BorrarAntiguos(Ruta,StrToIntDef(ParamStr(3),10));
  94.     end;
  95.   finally
  96.     CloseHandle(Mutex);
  97.   end;
  98. end.



Para hacer una copia usaríamos un comando como este:


delphi
  1. mySqlBackup "mysqldump --opt --user=root --password=clave BaseDeDatos" C:\backup 5


Donde le indicamos que haga las copias de la base "BaseDeDatos" en el directorio "C:\Backup" y que nos deje solo las ultimas 5 copias. Las copias tienes un nombre como este "20120913091746982.sql" donde se guarda la fecha de cuando se realizo el backup.

Ahora solo tenemos que crear una tarea programada y listo, ya tenemos un sistema de copias automático  :)

PD: ¿Le añadirías alguna opción más a la linea de comandos de mysqldump o con "--opt" es suficiente?
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 13 septiembre 2012 - 07:44

Buen aporte amigo mio¡¡¡¡¡¡¡¡¡¡¡ muchas gracias por ello....

Por cierto, mis backups los hago con la herramienta del Mysql Administrator a través de un bacht.... ya os compartiré el código...

Saludox
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.043 mensajes
  • LocationMéxico

Escrito 13 septiembre 2012 - 07:49

El código es el siguiente (es una aplicación de consola):


Demasiado raro en tí :D :D :D

Muy buena alternativa amigo, ya la probaremos (y)

Saludos
  • 0