Windows环境下如何按单表文件计划MySQL数据库备份?
实现MySQL 5.5单表单文件每日备份
没问题!要把你的备份从整库单文件改成单表单文件,只需要在批处理里加个循环逻辑,先获取数据库里的所有表名,再逐个导出就行。我帮你调整了脚本,还修复了原脚本里的一个小细节(原脚本里-u root-proot应该是-u root -proot,用户名和密码参数之间的空格不能丢哦):
@echo off setlocal enabledelayedexpansion :: 配置备份相关参数 set DB_USER=root set DB_PASS=proot set DB_NAME=db set BACKUP_BASE_PATH=C:\backup\database set DATE_STR=%date:~4% set FILE_DATE=!DATE_STR:/=_! :: 确保备份目录存在,不存在则自动创建 if not exist "%BACKUP_BASE_PATH%" mkdir "%BACKUP_BASE_PATH%" if not exist "%BACKUP_BASE_PATH%\%FILE_DATE%" mkdir "%BACKUP_BASE_PATH%\%FILE_DATE%" :: 查询数据库内所有表名,保存到临时文件(-N参数去掉表头,只留表名) mysql -u%DB_USER% -p%DB_PASS% -N -e "SHOW TABLES FROM %DB_NAME%" > "%BACKUP_BASE_PATH%\temp_tables.txt" :: 循环遍历每个表,逐个导出为单独文件 for /f "tokens=*" %%t in (%BACKUP_BASE_PATH%\temp_tables.txt) do ( echo 正在备份表:%%t mysqldump -u%DB_USER% -p%DB_PASS% %DB_NAME% %%t > "%BACKUP_BASE_PATH%\%FILE_DATE%\db_%%t_%FILE_DATE%.sql" ) :: 清理临时表名文件 del "%BACKUP_BASE_PATH%\temp_tables.txt" echo 所有表备份完成!备份存储路径:%BACKUP_BASE_PATH%\%FILE_DATE% endlocal
关键细节说明:
enabledelayedexpansion:启用延迟变量扩展,避免日期格式处理时出现变量解析异常- 按日期创建子目录:每个表的备份文件会归类到当日的子文件夹中,比如
C:\backup\database\2024_05_20\db_users_2024_05_20.sql,方便后续查找和管理 - 如果你的mysql/mysqldump命令不在系统PATH环境变量里,记得把命令改成完整安装路径,比如
"C:\Program Files\MySQL\MySQL Server 5.5\bin\mysql.exe"
额外优化建议:
- 密码安全优化:明文写密码在脚本里有风险,你可以创建一个
my.ini配置文件(放在脚本同目录),内容如下:
然后把脚本里的[mysqldump] user=root password=proot-u%DB_USER% -p%DB_PASS%替换成--defaults-extra-file=my.ini,避免密码暴露 - 自动清理旧备份:可以添加命令自动删除N天前的备份,防止磁盘空间被占满,比如用
forfiles命令删除7天前的备份目录:forfiles /p "%BACKUP_BASE_PATH%" /s /m *.* /d -7 /c "cmd /c rd /s /q @path" - 备份日志记录:把备份过程输出到日志文件,方便排查问题,比如在脚本末尾添加:
echo %date% %time% - 每日备份执行完成 >> "%BACKUP_BASE_PATH%\backup_history.log"
调整好脚本后,你还是像之前一样把它添加到Windows任务计划里,就能实现每日自动单表备份啦!
内容的提问来源于stack exchange,提问作者Neha Shettar
相关产品推荐
相关产品推荐

