4 de noviembre de 2013

Copias de seguridad de bases de datos MySQL / MariaDB con VFP

Autor: Antonio L. Montagut
www.ontarioxb.es

El tema de las copias de seguridad se ha comentado bastante, e incluso he visto varias soluciones muy funcionales creando archivos (.BAT). Y ejecutarlos a una hora determinada con el programador de tareas de Windows.

La solución que aquí voy a proponer, es el poder realizar las copias de seguridad bajo entorno de desarrollo de VFPx. Que nuestros ejecutables tengan esa posible opción de menú.

Para este propósito necesitamos dos archivos ejecutables que van a hacer posible este hecho:
  • mysqldump.exe Este ejecutable va incluido en la subcarpeta (bin) de la instalación de nuestro servidor de base de datos MySQL / MariaDB
  • gzip.exe Un compresor tipo 7zip, winrar, que proviene del mundo Linux, pero que existe una versión para Windows y se puede descargar del siguiente link:http://gnuwin32.sourceforge.net/downlinks/gzip-bin-zip.php
El procedimiento va a ser el siguiente:

Haremos que nuestro programa cree un archivo (.BAT), que se ejecute, e incluso vaya marcando el tiempo que dura la copia de seguridad. Para eso utilizaremos la técnica del switch con dos ficheros de texto que también crearemos nosotros a nuestra conveniencia. Serán los archivos NO.sw y Si.sw.

Daremos por sentado algunos parámetros:
  • C:\ - Es la unidad donde tenemos instalada nuestra aplicación.
  • C:\MIAPP - El directorio donde está instalada nuestra aplicación
  • C:\MIAPP\MYSQL - El Directorio donde tenemos copiados los archivos: mysqldump.exe y gzip.exe
Empezamos con el proceso:

- Primer paso: Eliminar los archivos de switch SI.sw y No.sw y crear el archivo NO.sw.
DELETE FILE C:\MIAPP\SI.sw
DELETE FILE C:\MIAPP\NO.sw
STRTOFILE("000","C:\MIAPP\NO.sw")
- Segundo Paso: Crear nuestro archivo (.BAT) con macro sustitución:
RELEASE chost, cuser,cpass, cport, cbasedat, cdirdest, cfiledest, ccadena
LOCAL chost, cuser, cpass, cport, cbasedat, cdirdest, cfiledest
LOCAL ccadena as MEMO

chost="127.0.0.1"  && local
cuser="usuario"   && Usuario de MySQL con los privilegios adecuados
cpass="password"  && Password del Usuario de MySQL.
cport="3306"   && Puerto por defecto del servidor MySQL
cbasedat="mibd"   && Nombre de la base de datos MySQL que vamos a realizar backup
cdirdest="C:\DIRBKP\"  && Directorio de destino del Backup
cfiledest="BKP_"+DTOS(DATE()) && Nombre del archivo de destino
TEXT TO ccadena TEXTMERGE NOSHOW
C:
CD\MIAPP\MYSQL
mysqldump -h <<chost>> -u <<cuser>>  –p<<cpass>> -P <<cport>> -F -f -B --order-by-primary --opt <<cbasedat>> | gzip -v -9 > <<cdirdest>><<cfiledest>>.sql.gz
C::
CD\MIAPP
COPY NO.sw SI.sw
ENDTEXT     

STRTOFILE(ALLTRIM(ccadena),"C:\MIAPP\BKP.BAT")

DECLARE INTEGER ShellExecute IN Shell32.dll ;
INTEGER hndWin, STRING cAaction, STRING cFileName, STRING cParams, STRING cDir, INTEGER nShowWin
ShellExecute(0,"","C:\MIAPP\BKP.BAT","","",0)

nSEG=SECONDS()
DO WHILE .T.
 WAIT WINDOW "Transcurridos :  "+ALLTRIM(STR(SECONDS()-nSEG,06,00))+"  Segundos" TIMEOUT 01
IF FILE("C:\MIAPP\SI.sw")=.T.
  EXIT
 ENDIF   
ENDDO
WAIT WINDOW "Transcurridos :  "+ALLTRIM(STR(SECONDS()-NSECONDS,06,00))+"  Segundos" NOWAIT
El truco es el siguiente:

Creamos un archivo (.BAT), pasamos unos parámetros que podemos capturar de un formulario.
Lo lanzamos con el ShellExecute pero sin espera, eso quiere decir que nuestra aplicación VFPx se sigue ejecutando, pero la "encerramos" dentro de un DO ... ENDDO, donde cada segundo va marcando el tiempo transcurrido hasta que existe el archivo SI.sw , y provocamos la salida del bucle. Esto solo se va a producir cuando se llegue a la última orden del fichero (.BAT).

Quería utilizar el 7za.exe como compresor de copia, pero no admite recibir órdenes en "tubería |". Como si ocurre con el gzip.exe

Recomiendo encarecidamente leer tanto la ayuda del mysqldump.exe así como la ayuda del gzip.exe.

Así es como quedaría sustituyendo el WAIT WINDOW por un label en el _SCREEN:


Antonio L. Montagut

1 comentario :

  1. Hay un error en el bat, con la variable -NSECONDS dice que no se encuentra. Puedes enviar el codigo con el formulario completo. Gracias.

    ResponderEliminar