Cómo hacer una copia de seguridad de todas las bases de datos de un servidor MySQL Server, en Windows, cómo programarla para que se ejecute automáticamente cada cierto tiempo y cómo comprimirla. No usaremos software de terceros, sólo la herramienta mysqdump que incluye el propio MySQL Server en su versión gratuita community. El script de copia de seguridad comprimirá la copa con gzip.
Requisitos para hacer copia de seguridad programada de las bases de datos de un servidor MySQL Server en Windows
El único requisito será disponer de un servidor de MySQL Server instalado sobre una máquina con el sistema operativo Microsoft Windows (cualquier versión). Y necesitaremos un usuario y contraseña de acceso al servidor con permisos suficientes para poder hacer backup de todos los catálogos.
En el siguiente artículo explicamos cómo instalar un servidor de MySQL Server en Windows:
Script para la copia de seguridad programada de MySQL Server en Windows
Para hacer el backup de MySQL usaremos un script de MS-DOS. Por lo tanto copiaremos el siguiente script a un fichero de texto plano y lo guardaremos con un nombre en una ubicación determinada, por ejemplo con el nombre backup_mysql.bat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
@echo off ::Carpeta destino de la copia set bkupdir=F:\Backups\MySQL\zprueba ::Carpeta donde está instalado MySQL Server set mysqldir=C:\xampp\mysql ::Carpeta donde están los datos del servidor MySQL Server set datadir=C:\xampp\mysql\data ::Carpeta donde se guardará el fichero de log set logdir=F:\Backups\MySQL\zprueba ::Usuario y contraseña de acceso al servidor MySQL set dbuser=root set dbpass= ::Debe descargar el fichero gzip.exe e indicar su ubicación (http://gnuwin32.sourceforge.net/downlinks/gzip.php) set zip=F:\Backups\MySQL\z_software_copia\gzip.exe set endtime=0 ::Obtenemos el día y la hora para añadir como sufijo al nombre del fichero de backup :GETTIME for /F "tokens=1,2,3 delims=/" %%i in ('echo %date%') do (set dia=%%k%%j%%i) for /F "tokens=1,2,3 delims=:, " %%n in ('echo %time%') do (set hora=%%n%%o%%p) :: Si ha acabado el script y sólo se pide la hora vamos al final if "%endtime%"=="1" goto END set fn=_%dia%_%hora% :: Escribimos en el fichero de log echo Iniciando proceso de backup de MySQL > %logdir%\resultado_%fn%.log echo Hora de inicio = %dia% %hora% >> %logdir%\resultado_%fn%.log echo --------------------------- >> %logdir%\resultado_%fn%.log echo. >> %logdir%\resultado_%fn%.log :: Cambiamos al directorio de datos para enumerar las carpetas pushd %datadir% :: Bucle para obtener las carpetas del directorio de datos una a una :: Creamos el subdirectorio de backup si no existe en el destino indicado :: Uno por cada BD del Servidor de MySQL) for /d %%f in (*) do ( if not exist %bkupdir%\%%f\ ( echo Creando carpeta %%f echo Creando carpeta %%f >> %logdir%\resultado_%fn%.log mkdir %bkupdir%\%%f ) else ( echo La carpeta %%f ya existe echo La carpeta %%f ya existe >> %logdir%\resultado_%fn%.log ) :: Ejecutamos mysqldump para cada base de datos y comprimimos el resultado con gzip echo Haciendo backup de %%f%fn%.sql.gz echo Haciendo backup de %%f%fn%.sql.gz >> %logdir%\resultado_%fn%.log %mysqldir%\bin\mysqldump --user=%dbuser% --password=%dbpass% --databases %%f --opt --quote-names --allow-keywords --complete-insert | %zip% > %bkupdir%\%%f\%%f%fn%.sql.gz echo Finalizado backup... echo Finalizado backup... >> %logdir%\resultado_%fn%.log ) :: Volvemos a la etiqueta GETTIME para obtener la hora de finalización del script :: Ponemos a 1 "endtime" para que no vuelva a ejecutar las copias set endtime=1 goto :GETTIME :END :: Escribimos el resulado en el fichero de log echo. >> %logdir%\resultado_%fn%.log echo --------------------------- >> %logdir%\resultado_%fn%.log echo Proceso de backup de MySQL finalizado >> %logdir%\resultado_%fn%.log echo Hora de finalización = %dia% %hora% >> %logdir%\resultado_%fn%.log echo. >> %logdir%\resultado_%fn%.log :: Volvemos al directorio del script popd |
Teniendo en cuenta que hay que establecer el valor de las siguientes variables al que queramos tener en nuestro equipo Windows:
- bkupdir: indicaremos la unidad y carpeta de destino del backup, donde se creará una carpeta por cada catálogo (base de datos) que tengamos en MySQL y donde se copiará el fichero comprimido gzip con la copia de seguridad de cada base de datos.
- mysqldir: unidad y carpeta donde tengamos instalado MySQL Server en el equipo. En sistemas Windows la carpeta por defecto habitual es C:/Archivos de programa/MySQL/MySQL Server x
- datadir: unidad y carpeta donde estén alojados los datos de los catálogos de MySQL Server, si no se ha especificado otra, en instalaciones estándar de MySQL sobre Windows suele ser una carpeta «data» dentro de la carpeta de instalación. Por ejemplo, en MySQL Community Server 5.6 sería: C:/Archivos de programa/MySQL/MySQL Server 5.6/data. Dicha ubicación se establece en el fichero my.ini, en el parámetro datadir.
- logdir: carpeta de destino del fichero de log que creará el script con el resultado de todas las operaciones de backup.
- dbuser: usuario de MySQL Server con permisos suficientes para hacer copia de seguridad de todas las bases de datos.
- dbpass: contraseña del usuario de MySQL Server anterior.
- zip: indicaremos la ubicación del fichero gzip.exe. En el siguiente punto del artículo explicamos cómo descargarlo e instalarlo.
Lo ideal es que el destino del backup (bkupdir) esté en un disco duro físico diferente al de los datos de MySQL, de esta forma, si se avería el HD de MySQL siempre tendremos la copia de seguridad en lugar seguro. Incluso se puede hacer una copia del script y crear dos programaciones con dos script con destinos de backup diferentes en discos duros separados.
El script, como se puede ver, obtiene el día y la hora actuales para generar un fichero con estos datos, de forma que no reemplazará copias, generará un fichero por cada copia que se programe. De esta forma podremos tener un histórico de cambios en caso de ser necesario recuperar una copia del estado de un catálogo MySQL de días anteriores.
Por otro lado, el script lista las carpetas de la ubicación de los datos de MySQL, dado que cada catálogo contiene una carpeta y genera en la ubicación de destino una carpeta por cada catálogo.
Por último exporta los datos de cada catálogo a un fichero con formato SQL de texto plano y lo comprime con la herramienta gzip.
Descargar el fichero gzip.exe necesario para comprimir los ficheros SQL resultantes del backup
La herramienta mysqldump de MySQL Server creará un fichero de texto plano con extensión .sql para cada copia de seguridad de cada catálogo de la base de datos. Estos ficheros no están comprimidos por defecto y pueden ocupar bastante espacio, en función del tamaño de la base de datos. Para comprimirlos desde el mismo script usaremos la herramienta gratuita gzip.
Descargamos el instalador de gzip desde la URL:
- http://gnuwin32.sourceforge.net/downlinks/gzip.php
(si no está disponible lo buscaremos en la web oficial http://www.gzip.org
Y lo instalaremos siguiendo los pasos del asistente que son muy sencillos (siguiente, siguiente), fijándonos en la carpeta de destino de la instalación. Esto último es importante dado que en el script, en la variable zip, deberemos indicarla. Por defecto suele instarse en: C:\Program Files (x86)\GnuWin32\bin\gzip.exe. Pero podemos copiar el fichero gzip.exe a la ubicación que queramos, indicándola en el parámetro zip del script.
Programar tarea de Windows para que ejecute el script de forma automática cada cierto tiempo
Una vez generado y guardado el fichero de script podremos programarlo con el programador de tareas de Windows, para que se ejecute de forma automática con la periodicidad que le establezcamos. Como ejemplo programaremos la copia una vez al día, todos los días, a partir de las 2 de la madrugada.
Para ello abriremos el programador de tareas de Windows, en el caso de Windows 7 (similar a Windows Vista, Windows 8 y Windows 10), pulsaremos el botón de inicio y escribiremos «programador de tareas»:

Pulsaremos con el botón derecho del ratón sobre «Programador de tareas» y seleccionaremos «Crear tarea básica»:

Introduciremos un nombre para la tarea programada, por ejemplo «Copia MySQL» y una descripción de la tarea, por ejemplo «Copia de seguridad de las bases de datos MySQL del servidor local»:

Especificaremos cada cuanto tiempo queremos que se haga la copia, esto lo elegiremos en función de la criticidad de los datos y de los cambios que se produzcan. Por norma y lo habitual es una vez al día, así que marcaremos «Diariamente»:

Estableceremos la hora de inicio de la copia, en nuestro caso a las 02:00:

En la acción marcaremos «Iniciar un programa»:

Pulsaremos en «Examinar» para seleccionar la ubicación del script .bat:

Seleccionaremos el fichero de script, en nuestro caso backup_mysql.bat:

Marcaremos la opción «Abrir el diálogo Propiedades para esta tarea al hacer clic en Finalizar»:

Marcaremos las opciones «Ejecutar tanto si el usuario inició sesión como si no» y marcharemos también «Ejecutar con los privilegios más altos»:

Una vez configurados todos los parámetros de la tarea programada pulsaremos «Aceptar» en la ventana anterior. Puede que nos solicite usuario y contraseña del equipo Windows con el que se ejecutará la tarea, es conveniente que sea un usuario administrador o con los permisos suficientes para copiar ficheros y ejecutar script:

De esta forma, cuando se ejecute la tarea, se ejecutará el script, que generará una carpeta por cada catálogo de la base de datos del servidor MySQL Server. En nuestro caso:

Generará también un fichero de log por cada ejecución, con el nombre «resultado_…» y la fecha y hora de ejecución. Y dentro de cada carpeta correspondiente a cada catálogo generará un fichero comprimido .gz con el nombre del catálogo y la fecha y la hora de la copia. Dicho fichero, a su vez, contendrá el fichero .sql con los datos del catálogo en formato SQL de texto plano:

Ejemplo de contenido SQL de un fichero comprimido de backup de MySQL con mysqldump:
