domingo, 31 de agosto de 2008

/backup y restore desde aplicación Delphi



Hace poco el requerimiento de una aplicación era restaurar/respaldar una base de datos MySQL desde una aplicación Delphi.

De las opciones open source como interfaz entre MySQL y Delphi, los componentes Zeos me parecen los mejores, pero no tienen implementada la opción de backup/restore.

Personalmente recomiendo, además, un administrador externo para estas tareas por la independencia de la base de datos respecto a la aplicación que la utiliza.
De hecho el que viene con el motor MySQL es muy eficiente y gratuito: http://www.mysql.com/products/tools/administrator/. Permite hacer respaldos automáticos (mediante script FTP), o bien de forma manual.
Alternativamente MySQL ya provee algunas características incorporadas para respaldos en cada versión: http://www.mysql.com/products/backup/.

En definitiva cubrí las tareas de respaldo/restauración en los dos frentes, desde la aplicación, y un administrador externo.


Componentes:

Hay componentes que pueden incorporarse a Delphi para realizar esta tarea.
MyDAC, no es gratuito, solo versión de prueba. (Y no lo probé, total, no se iba a comprar)
ZlawMySQLBackup, gratis, para Delphi 7 al menos, no pude conseguirlo, por lo que leí está en fase de prueba. Por lo tanto no es aconsejable para producción.
Aun así, por las características que describe parece interesante, aunque engorroso de instalar (si es que lo encuentran).
MySQL BackUp Component, probado para Delphi 5, funciona también para Delphi 7.

Desaconsejo cualquier copia desde un simple administrador de archivos, el administrador de la base de datos, sabe qué estructuras copiar, y como modificarlas en caso que sea necesario.

Programación:
Otra forma es hacerlo desde código, sin usar componentes, que es por la que opté (de momento). Simplemente por simplicidad.
(Doy por hecho que el path del motor está en la variable de entorno PATH del sistema)

Respaldo

procedure TFormBackUpRestore.btnBackUpClick(Sender: TObject);
begin
ShellExecute(handle,'open', 'cmd.exe',
Pchar('/c "C:\MySql\Bin\mysqldump.exe" -h localhost -R
-u username -ppassword databasename > mibackup.sql ')
,nil,
SW_SHOW );
end;

Restaurar (cambio el redireccionamiento "<")

procedure TFormBackUpRestore.btnRestoreClick(Sender: TObject);
begin
ShellExecute(handle,'open', 'cmd.exe',
Pchar('/c "C:\MySql\Bin\mysqldump.exe" -h localhost -R
-u username -ppassword databasename < mibackup.sql ')
,nil,
SW_SHOW );
end;


ShellExecute, de la unidad ShellAPI se sigue usando por motivos de compatibilidad, lo invocado corre como una aplicación (arquitectura de 16 bits) y no de proceso.
Pero funciona.

Para arquitectura de 32 bits, debería usarse CreateProcess (unidad WinAPI), pero hay que adaptar su sintaxis a Delphi, en el help el ejemplo aun viene para C, lo que muchas veces ahuyenta a los que programan en Delphi.
En Delphi Corner hay un ejemplo de CreateProcess.







No hay comentarios.: