Windows Batch Script to backup local MySQL databases & only keep N latest FOLDERS with backup files

后端 未结 2 1559
鱼传尺愫
鱼传尺愫 2020-12-10 00:01

I am using adityasatrio\'s batch file to backup local MySQL dbs and like to be able to only keep the 30 latest backup files. Using root:root for this example.



        
相关标签:
2条回答
  • 2020-12-10 00:41

    This is a little more resilient to spaces in folder names, and the date and time routines have been altered
    - run it and first check that the "dirName"= folder is in the right format
    - and the line at the end should echo the del commands for keeping the lastest 3 backups.

    Test the archiving routine and then
    remove the echo before the del keyword if it all looks right to you.

     @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
    
    0 讨论(0)
  • 2020-12-10 00:51

    With the help of @foxidrive above I managed to get the date of the folders as I wanted them to be, them being YYYY-MM-DD HH-MIN-SEC.

    In these folders are the the gzipped .sql databses stored thanks to adityasatrio's MySQL Backup Batch Script.

    With the help of @Magoo from this answer https://stackoverflow.com/a/17521693/1010918 I managed to get all folders (nameDir) deleted while keeping the latest N folders (nameDir) and also not touching any files that might be in the directory (backupDir).

    Here is the complete working script.

    Feel free to remove any occurrence of pause and and echo to not see what is going on inside the command prompt.

    Additionally add this to Windows Task Scheduler and you have yourself a solid backup solution for a local development environment that makes use of MySQL databases.

    Please thank the people that helped me get this done. Without you guys I would have had to use a costly Windows app only to locally save MySQL databases.

    (..and for our next trick we are going to email an error log to ourselves if there are errors while backing up the .sql files.. but that is another question and story for another day.. )

     @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
    
    0 讨论(0)
提交回复
热议问题