Windows 备份本地 MySQL 数据库的批处理脚本 & 只保留 N 个最新的文件夹和备份文件
Windows Batch Script to backup local MySQL databases & only keep N latest FOLDERS with backup files
我正在使用 adityasatrio's batch file 备份本地 MySQL 数据库并且希望能够只保留 30 个最新的备份文件。本例使用 root:root。
@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-Zipz.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
现在我已经很好地了解了以下问题:
Batch file to delete files older than N days
https://serverfault.com/questions/49614/delete-files-older-than-x-days
Batch file that keeps the 7 latest files in a folder
Windows batch file only keeping the last 30 files
我现在想知道我是否可以简单地添加 ()
for /f "skip=30 delims=" %%A in ('dir /a:-d /b /o:-d /t:c *.sql ^2^>nul') do if exist "%%~fA" echo "%%~fA"
(是的,我稍后会将 echo 更改为 del,但首先我想看看会发生什么)
或()
for /f "skip=30 eol=: delims=" %%F in ('dir /b /o-d *.sql') do @del "%%F"
在批处理文件的末尾,正下方
del %backupDir%\%dirName%\%%f.sql
要做到这一点?
我以前从未这样做过,但已经搜索了自动本地备份 apps/php scripts/mysqldump commands/etc for MySQL dbs,甚至尝试过 Workbench 才发现社区版不能设置排程(感谢Oracle)
所有其他应用要么需要有人打开应用并点击 "run now",要么需要您为设置日程付费(不用谢)。
我认为这可以在 Windows 7 和更高版本的机器上使用手边的工具来完成。请帮我把这个功能添加到脚本中,那太好了,谢谢。
edit1:
添加引号命令时没有任何反应。
另外创建的备份目录只显示时间,不显示年月日。做进一步的研究找出原因。有什么想法吗?
此评论delete all but X most recent folders 谈到删除 5 个最新的文件夹,虽然当我这样使用它时
for /f "skip=2 delims=" %%a in ('dir %backupDir%\%dirName% /o-d /b') do rd /S /Q "%backupDir%\%dirName%\%%a"
错误如下。
The system cannot find the file specified.
The system cannot find the path specified.
edit2:
下面是使用@foxidrive 帮助设置文件夹名称的代码,但最后一点,尝试只保留 3 个最新文件夹(仅用于测试目的 3)并删除 backupDir 中的其余文件夹好像不行。
感谢您的帮助。
@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-Zipz.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
这对文件夹名称中的空格更具弹性,日期和时间例程已更改
- 运行 然后首先检查 "dirName"=
文件夹的格式是否正确
- 最后一行应回显 del
命令以保留最新的 3 个备份。
测试归档例程然后
如果您觉得合适,请删除 del
关键字前的 echo
。
@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-Zipz.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
在上面@foxidrive 的帮助下,我设法获得了我想要的文件夹日期,它们是 YYYY-MM-DD HH-MIN-SEC。
在这些文件夹中是 gzip 压缩的 .sql 数据库,感谢 adityasatrio's MySQL Backup Batch Script。
在@Magoo 的帮助下,这个答案 我设法删除了所有文件夹 (nameDir) ,同时保留 最新的 N 个文件夹 (nameDir) 以及不 接触目录 (backupDir) 中可能存在的任何文件。
这是完整的工作脚本。
随意删除任何出现的 pause
和 echo
到 不 看看命令提示符里面发生了什么。
另外将此添加到 Windows Task Scheduler,您将拥有一个可靠的本地开发环境备份解决方案,该环境使用 MySQL 数据库。
请感谢帮助我完成这项工作的人们。如果没有你们,我将不得不使用昂贵的 Windows 应用程序来本地保存 MySQL 数据库。
(..对于我们的下一个技巧,如果在备份 .sql 文件时出现错误,我们将通过电子邮件将错误日志发送给我们自己..但这是另一个问题和另一天的故事..)
@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-Zipz.exe"
:: 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
:: 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
我正在使用 adityasatrio's batch file 备份本地 MySQL 数据库并且希望能够只保留 30 个最新的备份文件。本例使用 root:root。
@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-Zipz.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
现在我已经很好地了解了以下问题:
Batch file to delete files older than N days
https://serverfault.com/questions/49614/delete-files-older-than-x-days
Batch file that keeps the 7 latest files in a folder
Windows batch file only keeping the last 30 files
我现在想知道我是否可以简单地添加 ()
for /f "skip=30 delims=" %%A in ('dir /a:-d /b /o:-d /t:c *.sql ^2^>nul') do if exist "%%~fA" echo "%%~fA"
(是的,我稍后会将 echo 更改为 del,但首先我想看看会发生什么)
或()
for /f "skip=30 eol=: delims=" %%F in ('dir /b /o-d *.sql') do @del "%%F"
在批处理文件的末尾,正下方
del %backupDir%\%dirName%\%%f.sql
要做到这一点?
我以前从未这样做过,但已经搜索了自动本地备份 apps/php scripts/mysqldump commands/etc for MySQL dbs,甚至尝试过 Workbench 才发现社区版不能设置排程(感谢Oracle)
所有其他应用要么需要有人打开应用并点击 "run now",要么需要您为设置日程付费(不用谢)。
我认为这可以在 Windows 7 和更高版本的机器上使用手边的工具来完成。请帮我把这个功能添加到脚本中,那太好了,谢谢。
edit1:
添加引号命令时没有任何反应。 另外创建的备份目录只显示时间,不显示年月日。做进一步的研究找出原因。有什么想法吗?
此评论delete all but X most recent folders 谈到删除 5 个最新的文件夹,虽然当我这样使用它时
for /f "skip=2 delims=" %%a in ('dir %backupDir%\%dirName% /o-d /b') do rd /S /Q "%backupDir%\%dirName%\%%a"
错误如下。
The system cannot find the file specified.
The system cannot find the path specified.
edit2: 下面是使用@foxidrive 帮助设置文件夹名称的代码,但最后一点,尝试只保留 3 个最新文件夹(仅用于测试目的 3)并删除 backupDir 中的其余文件夹好像不行。
感谢您的帮助。
@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-Zipz.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
这对文件夹名称中的空格更具弹性,日期和时间例程已更改
- 运行 然后首先检查 "dirName"=
文件夹的格式是否正确
- 最后一行应回显 del
命令以保留最新的 3 个备份。
测试归档例程然后
如果您觉得合适,请删除 del
关键字前的 echo
。
@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-Zipz.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
在上面@foxidrive 的帮助下,我设法获得了我想要的文件夹日期,它们是 YYYY-MM-DD HH-MIN-SEC。
在这些文件夹中是 gzip 压缩的 .sql 数据库,感谢 adityasatrio's MySQL Backup Batch Script。
在@Magoo 的帮助下,这个答案 我设法删除了所有文件夹 (nameDir) ,同时保留 最新的 N 个文件夹 (nameDir) 以及不 接触目录 (backupDir) 中可能存在的任何文件。
这是完整的工作脚本。
随意删除任何出现的 pause
和 echo
到 不 看看命令提示符里面发生了什么。
另外将此添加到 Windows Task Scheduler,您将拥有一个可靠的本地开发环境备份解决方案,该环境使用 MySQL 数据库。
请感谢帮助我完成这项工作的人们。如果没有你们,我将不得不使用昂贵的 Windows 应用程序来本地保存 MySQL 数据库。
(..对于我们的下一个技巧,如果在备份 .sql 文件时出现错误,我们将通过电子邮件将错误日志发送给我们自己..但这是另一个问题和另一天的故事..)
@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-Zipz.exe"
:: 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
:: 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