Mysql
 sql >> Base de données >  >> RDS >> Mysql

Windows Batch Script pour sauvegarder les bases de données MySQL locales et ne conserver que les N derniers DOSSIERS avec les fichiers de sauvegarde

Avec l'aide de @foxidrive ci-dessus, j'ai réussi à obtenir la date des dossiers comme je le voulais, ils étant AAAA-MM-JJ HH-MIN-SEC.

Dans ces dossiers se trouvent les bases de données .sql gzippées grâce au adityasatrio's MySQL Backup Batch Script .

Avec l'aide de @Magoo de cette réponse https://stackoverflow.com/a/17521693/1010918 J'ai réussi à supprimer tous les dossiers (nameDir) tout en conservant les derniers dossiers N (nameDir) et aussi pas touchant tous les fichiers qui pourraient être dans le répertoire (backupDir).

Voici le script de travail complet.

N'hésitez pas à supprimer toute occurrence de pause et et echo pour ne pas voir ce qui se passe à l'intérieur de l'invite de commande.

Ajoutez-le également au planificateur de tâches Windows et vous disposez d'une solution de sauvegarde solide pour un environnement de développement local qui utilise des bases de données MySQL.

Merci de remercier les personnes qui m'ont aidé à le faire. Sans vous, j'aurais dû utiliser une application Windows coûteuse uniquement pour enregistrer localement les bases de données MySQL.

(..et pour notre prochaine astuce, nous allons nous envoyer un journal d'erreurs par e-mail s'il y a des erreurs lors de la sauvegarde des fichiers .sql.. mais c'est une autre question et une autre histoire pour un autre jour..)

 @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