批处理脚本备份MySQL/MariaDB:含点数据库名转义问题求助
解决批处理脚本中MariaDB带点号数据库的备份问题
问题原因
当数据库名称包含点号(如data.2023),MariaDB会将点号转义为URL编码的@002e作为数据文件夹名。直接使用%%~ni传递给mysqldump时,实际传递的是转义后的名称,而非真实数据库名,导致备份出空文件。
解决方法
批处理循环内的字符串替换需要启用延迟变量扩展才能生效,修改后的完整脚本如下:
@echo off setlocal enabledelayedexpansion SET SOURCEDIR="C:\Program Files\MariaDB\data\" set now=%DATE:~-4%-%DATE:~3,2%-%DATE:~0,2% :: 提前创建备份目录,避免7-Zip因目录不存在报错 if not exist "D:\backup\SQL\%now%" mkdir "D:\backup\SQL\%now%" for /d %%i in (%SOURCEDIR%\*) do ( set "db_folder_name=%%~ni" :: 将转义后的@002e还原为真实的点号 set "db_name=!db_folder_name:@002e=.!" if not "!db_folder_name!"=="temp" ( "C:\Program Files\MariaDB\bin\mysqldump.exe" -uroot -h127.0.0.1 -c -e -q --single-transaction=TRUE "!db_name!" ^ | "c:\Program Files\7-Zip\7z.exe" a -si"!db_name!_%now%.sql" "D:\backup\SQL\%now%\!db_name!.sql.7z" ) ) endlocal exit
关键要点
setlocal enabledelayedexpansion:启用延迟变量扩展,让循环内的变量替换逻辑生效,这是解决问题的核心!db_folder_name:@002e=.!:使用延迟变量语法!变量:原字符串=新字符串!完成转义字符的替换- 给数据库名添加双引号
"!db_name!":避免数据库名包含特殊字符时出现解析错误 - 新增
mkdir命令:确保备份目录存在,防止7-Zip执行失败
内容的提问来源于stack exchange,提问作者Vlad-i-Slav
相关产品推荐
相关产品推荐

