El código es el siguiente (es una aplicación de consola):
delphi
program mySqlBackup; uses Windows, SysUtils, Classes; function Comparar(List: TStringList; Index1, Index2: Integer): Integer; begin Result:= Integer(List.Objects[Index1]) - Integer(List.Objects[Index2]); end; procedure Buscar(Path,Mask: string; Attr: Integer; Lista: TStringList); var SearchRec: TSearchRec; begin if Copy(Path,Length(Path),1) <> '\' then Path:= Path + '\'; if FindFirst(Path + Mask,Attr,SearchRec) = 0 then repeat Lista.AddObject(Path + SearchRec.Name, TObject(SearchRec.Time)); until FindNext(SearchRec) <> 0; FindClose(SearchRec); Lista.CustomSort(Comparar); end; // Borra los backups mas antiguos procedure BorrarAntiguos(Path: String; i: Integer); var Lista: TStringList; begin if i < 1 then i:= 1; Lista:= TStringList.Create; try Buscar(Path,'*.sql',faAnyFile,Lista); while Lista.Count > i do begin DeleteFile(Lista[0]); Lista.Delete(0); end; finally Lista.Free; end; end; // Ejecuta un comando y espera a que termine function EjecutarCmd(Cmd: String): Boolean; var ProcInfo: PROCESS_INFORMATION; StartupInfo: TSTARTUPINFO; Code: Cardinal; ComSpec: String; begin Result:= TRUE; FillChar(StartupInfo,Sizeof(StartupInfo),#0); StartupInfo.cb:= Sizeof(StartupInfo); StartupInfo.wShowWindow:= SW_HIDE; StartupInfo.dwFlags:= STARTF_USESHOWWINDOW; ComSpec:= Trim(GetEnvironmentVariable('ComSpec')); if ComSpec = EmptyStr then ComSpec:= 'cmd.exe'; Cmd:= ComSpec + ' /c ' + Cmd; if CreateProcess(nil,PChar(Cmd),nil,nil,FALSE,0,nil,nil,StartupInfo, ProcInfo) then repeat Sleep(10); GetExitCodeProcess(ProcInfo.hProcess, Code); until (Code <> STILL_ACTIVE); end; var Mutex: THandle; Ruta: String; begin // mySqlBackup Cmd Ruta Copias if ParamCount <> 3 then Exit; // Creamos un mutex para impedir que se ejecute mas de una instancia a la vez Mutex:= CreateMutex(nil,FALSE,'{37E3183A-38F9-4C66-A259-D4AE512A5CF3}'); if Mutex <> 0 then try if GetLastError = 0 then begin // Le añadimos la '\' al final de la ruta Ruta:= IncludeTrailingPathDelimiter(ParamStr(2)); // Si es necesario creamos el directorio de destino ForceDirectories(Ruta); // Ejecuatamos el comando "Cmd > Ruta\yyyymmddhhnnsszzz.sql" EjecutarCmd(ParamStr(1) + ' > ' + Ruta + FormatDateTime('yyyymmddhhnnsszzz',Now) + '.sql'); // Borramos los backups mas antiguos BorrarAntiguos(Ruta,StrToIntDef(ParamStr(3),10)); end; finally CloseHandle(Mutex); end; end.
Para hacer una copia usaríamos un comando como este:
delphi
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?