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