You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理脚本备份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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:10:25