sql >> Base de Datos >  >> RDS >> Mysql

Windows Batch Script para hacer una copia de seguridad de las bases de datos MySQL locales y solo mantener las N últimas CARPETAS con archivos de copia de seguridad

Con la ayuda de @foxidrive arriba, logré obtener la fecha de las carpetas como quería que fueran, siendo AAAA-MM-DD HH-MIN-SEC.

En estas carpetas se almacenan las bases de datos .sql comprimidas gracias a secuencia de comandos por lotes de copia de seguridad MySQL de adityasatrio .

Con la ayuda de @Magoo de esta respuesta https://stackoverflow.com/a/17521693/1010918 Logré eliminar todas las carpetas (nameDir) manteniendo las últimas N carpetas (nameDir) y también no tocando cualquier archivo que pueda estar en el directorio (backupDir).

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

Siéntase libre de eliminar cualquier ocurrencia de pause y y echo a no ver lo que está pasando dentro de la línea de comandos.

Además, agregue esto al Programador de tareas de Windows y tendrá una solución de copia de seguridad sólida para un entorno de desarrollo local que utiliza bases de datos MySQL.

Por favor, agradezca 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 las bases de datos MySQL.

(... y para nuestro próximo truco, nos enviaremos por correo electrónico un registro de errores 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://stackoverflow.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://stackoverflow.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