restaurar respaldar query para datos comandos bat bases automaticamente mysql windows batch-file wampserver

respaldar - restaurar base de datos mysql



Windows Batch Script para realizar copias de seguridad de las bases de datos locales de MySQL y solo mantener N las Ășltimas CARPETAS con los archivos de copia de seguridad (2)

Esto es un poco más resistente a los espacios en los nombres de las carpetas, y las rutinas de fecha y hora han sido alteradas
- ejecútelo y primero verifique que la "dirName"= esté en el formato correcto
- y la línea al final debe hacer eco de los comandos del para mantener las últimas 3 copias de seguridad.

Pruebe la rutina de archivo y luego
elimine el echo antes de la palabra clave del si todo le parece correcto.

@echo off set dbUser=root set dbPassword=root set "backupDir=D:/MySQLDumps/dbs/" set "mysqldump=C:/wamp/bin/mysql/mysql5.6.17/bin/mysqldump.exe" set "mysqlDataDir=C:/wamp/bin/mysql/mysql5.6.17/data" set "zip=C:/Program Files/7-Zip/7z.exe" rem The four lines below will give you reliable YY DD MM YYYY HH Min Sec MS variables in XP Pro and higher. for /f "tokens=2 delims==" %%a in (''wmic OS Get localdatetime /value'') do set "dt=%%a" set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%" set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%" set "dirname=%YY%%MM%%DD%_%HH%%Min%" echo "dirName"="%dirname%" pause :: switch to the "data" folder pushd "%mysqlDataDir%" :: create backup folder if it doesn''t exist if not exist "%backupDir%/%dirName%/" mkdir "%backupDir%/%dirName%" :: iterate over the folder structure in the "data" folder to get the databases for /d %%f in (*) do ( echo processing folder "%%f" "%mysqldump%" --host="localhost" --user=%dbUser% --password=%dbPassword% --single-transaction --add-drop-table --databases %%f > "%backupDir%/%dirName%/%%~nxf.sql" "%zip%" a -tgzip "%backupDir%/%dirName%/%%~nxf.sql.gz" "%backupDir%/%dirName%/%%~nxf.sql" del "%backupDir%/%dirName%/%%~nxf.sql" ) popd ::keep 3 newest backup *.sql files for /f "skip=3 delims=" %%a in (''dir "%backupDir%/%dirName%/*.sql" /b /o-d /a-d'') do echo del "%backupDir%/%dirName%/%%a" pause

Estoy usando el archivo de proceso por lotes de adityasatrio para hacer una copia de respaldo de los archivos db MySQL locales y me gusta poder mantener solo los 30 últimos archivos de respaldo. Usando root: root para este ejemplo.

@echo off set dbUser=root set dbPassword=root set backupDir="D:/MySQLDumps/dbs/" set mysqldump="C:/wamp/bin/mysql/mysql5.6.17/bin/mysqldump.exe" set mysqlDataDir="C:/wamp/bin/mysql/mysql5.6.17/data" set zip="C:/Program Files/7-Zip/7z.exe" :: get date for /F "tokens=2-4 delims=/ " %%i in (''date /t'') do ( set yy=%%i set mon=%%j set dd=%%k ) :: get time for /F "tokens=5-8 delims=:. " %%i in (''echo.^| time ^| find "current" '') do ( set hh=%%i set min=%%j ) echo dirName=%yy%%mon%%dd%_%hh%%min% set dirName=%yy%%mon%%dd%_%hh%%min% :: switch to the "data" folder pushd %mysqlDataDir% :: iterate over the folder structure in the "data" folder to get the databases for /d %%f in (*) do ( if not exist %backupDir%/%dirName%/ ( mkdir %backupDir%/%dirName% ) %mysqldump% --host="localhost" --user=%dbUser% --password=%dbPassword% --single-transaction --add-drop-table --databases %%f > %backupDir%/%dirName%/%%f.sql %zip% a -tgzip %backupDir%/%dirName%/%%f.sql.gz %backupDir%/%dirName%/%%f.sql del %backupDir%/%dirName%/%%f.sql ) popd

Ahora he tenido un buen vistazo a las siguientes preguntas:

Archivo por lotes para eliminar archivos anteriores a N días

https://serverfault.com/questions/49614/delete-files-older-than-x-days

Archivo por lotes que mantiene los últimos 7 archivos en una carpeta

El archivo por lotes de Windows solo mantiene los últimos 30 archivos

y ahora me pregunto si puedo simplemente agregar ( https://stackoverflow.com/a/14267137/1010918 )

for /f "skip=30 delims=" %%A in (''dir /a:-d /b /o:-d /t:c *.sql ^2^>nul'') do if exist "%%~fA" echo "%%~fA"

(Sí, luego cambiaré echo a del pero antes me gustaría ver qué pasará)

o ( https://stackoverflow.com/a/13368077 )

for /f "skip=30 eol=: delims=" %%F in (''dir /b /o-d *.sql'') do @del "%%F"

al final del archivo por lotes, justo debajo

del %backupDir%/%dirName%/%%f.sql

para hacer que esto suceda?

Nunca he hecho esto antes, pero he buscado aplicaciones de copia de seguridad locales automáticas / scripts php / mysqldump / etc para MySQL dbs, incluso tuve una oportunidad con Workbench solo para descubrir que no se puede establecer ninguna programación en la edición de comunidad (gracias Oracle) .

Todas las otras aplicaciones necesitan que alguien abra la aplicación y presionen "ejecutar ahora" o que paguen por configurar un horario (no, gracias).

Creo que esto se puede hacer con las herramientas disponibles en una máquina con Windows 7 y versiones posteriores. Por favor, ayúdame a agregar esta funcionalidad al script, eso sería genial, gracias.

edit1:

Al agregar los comandos de cita, no sucede nada. Además, el directorio de copia de seguridad creado solo muestra la hora, pero no el año, mes y día. Hacer más investigaciones para descubrir por qué. ¿Algunas ideas?

Este comentario borra todas las carpetas pero X más recientes habla de eliminar las 5 últimas carpetas, aunque cuando lo uso así

for /f "skip=2 delims=" %%a in (''dir %backupDir%/%dirName% /od /b'') do rd /S /Q "%backupDir%/%dirName%/%%a"

el error es el siguiente.

The system cannot find the file specified. The system cannot find the path specified.

edit2: A continuación se muestra el código que con @foxidrive help establece el nombre de la carpeta como me gustaría tenerlo, pero el último bit, tratando de mantener solo las 3 últimas carpetas (para propósitos de prueba solamente 3) y borro el resto de las carpetas en el directorio de copia de seguridad no parece funcionar.

Gracias por cualquier ayuda.

@echo off set dbUser=root set dbPassword=root set "backupDir=D:/MySQLDumps/dbs/" set "mysqldump=C:/wamp/bin/mysql/mysql5.6.17/bin/mysqldump.exe" set "mysqlDataDir=C:/wamp/bin/mysql/mysql5.6.17/data" set "zip=C:/Program Files/7-Zip/7z.exe" rem The four lines below will give you reliable YY DD MM YYYY HH Min Sec MS variables in XP Pro and higher. for /f "tokens=2 delims==" %%a in (''wmic OS Get localdatetime /value'') do set "dt=%%a" set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%" set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%" set "dirname=%YY%-%MM%-%DD% %HH%-%Min%-%Sec%" echo "dirName"="%dirName%" pause :: switch to the "data" folder pushd "%mysqlDataDir%" :: create backup folder if it doesn''t exist if not exist "%backupDir%/%dirName%/" mkdir "%backupDir%/%dirName%" :: iterate over the folder structure in the "data" folder to get the databases for /d %%f in (*) do ( echo processing folder "%%f" "%mysqldump%" --host="localhost" --user=%dbUser% --password=%dbPassword% --single-transaction --add-drop-table --databases %%f > "%backupDir%/%dirName%/%%~nxf.sql" "%zip%" a -tgzip "%backupDir%/%dirName%/%%~nxf.sql.gz" "%backupDir%/%dirName%/%%~nxf.sql" del "%backupDir%/%dirName%/%%~nxf.sql" ) popd :: delete all but the latest 3 folders for /f "skip=3 delims=" %%A in (''dir /b /ad /o-n "%backupDir%/%dirName%/*"'') do @echo rd /s /q "%backupDir%/%dirName%/%%~A" pause


Con la ayuda de @foxidrive anterior logré obtener la fecha de las carpetas como yo quería, siendo YYYY-MM-DD HH-MIN-SEC.

En estas carpetas se encuentran los databses .zq almacenados en gzip almacenados gracias a MySQL Backup Batch Script de adityasatrio .

Con la ayuda de @Magoo de esta respuesta https://.com/a/17521693/1010918 logré eliminar todas las carpetas (nameDir) manteniendo las últimas N carpetas (nameDir) y sin tocar ningún archivo que pudiera estar en el directorio (directorio de copia de seguridad).

Aquí está el guión de trabajo completo.

Siéntase libre de eliminar cualquier aparición de pause y echo para no ver lo que está sucediendo dentro del símbolo del sistema.

Además, agregue esto al Programador de tareas de Windows y usted mismo tiene una solución de respaldo sólida para un entorno de desarrollo local que hace uso de las bases de datos MySQL.

Gracias a las personas que me ayudaron a hacer esto. Sin ustedes, habría tenido que usar una costosa aplicación de Windows solo para guardar localmente bases de datos MySQL.

(... y para nuestro próximo truco vamos a enviar un log de error a nosotros mismos si hay errores al hacer una copia de seguridad de los archivos .sql ... pero esa es otra pregunta e historia para otro día ...)

@echo off set dbUser=root set dbPassword=root set "backupDir=D:/MySQLDumps" set "mysqldump=C:/wamp/bin/mysql/mysql5.6.17/bin/mysqldump.exe" set "mysqlDataDir=C:/wamp/bin/mysql/mysql5.6.17/data" set "zip=C:/Program Files/7-Zip/7z.exe" :: https://.com/a/31789045/1010918 foxidrive''s answer helped me get the folder with the date and time I wanted rem The four lines below will give you reliable YY DD MM YYYY HH Min Sec MS variables in XP Pro and higher. for /f "tokens=2 delims==" %%a in (''wmic OS Get localdatetime /value'') do set "dt=%%a" set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%" set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%" set "dirname=%YYYY%-%MM%-%DD% %HH%-%Min%-%Sec%" :: remove echo here if you like echo "dirName"="%dirName%" :: switch to the "data" folder pushd "%mysqlDataDir%" :: create backup folder if it doesn''t exist if not exist "%backupDir%/%dirName%/" mkdir "%backupDir%/%dirName%" :: iterate over the folder structure in the "data" folder to get the databases for /d %%f in (*) do ( :: remove echo here if you like echo processing folder "%%f" "%mysqldump%" --host="localhost" --user=%dbUser% --password=%dbPassword% --single-transaction --add-drop-table --databases %%f > "%backupDir%/%dirName%/%%~nxf.sql" "%zip%" a -tgzip "%backupDir%/%dirName%/%%~nxf.sql.gz" "%backupDir%/%dirName%/%%~nxf.sql" del "%backupDir%/%dirName%/%%~nxf.sql" ) popd :: delete all folders but the latest 2 :: https://.com/a/17521693/1010918 Magoo''s answer helped me get what I wanted to do with the folders :: for /f "skip=2 delims=" %G in (''dir /B /ad-h /o-d'') DO echo going to delete %G :: below following my version with rd (remove dir) command and /s and /q :: remove echo before rd to really delete the folders in question!! :: attention they will be deleted with content in them!! :: change the value after skip= to what you like, this is the amount of latest folders to keep in your backup directory for /f "skip=2 delims=" %%a in ('' dir "%backupDir%/" /b /ad-h /o-d'') do echo rd /s /q "%backupDir%/%%a" :: remove pause here if you like and add the file to Windows Task Manager pause