如何在Windows上安排MySQL数据库备份,每个文件备份一个表?

4

我正在使用MySQL Server 5.5,并需要安排每日数据库备份。 目前在批处理文件中执行以下操作:

set currdate=%date:~4%
Set FileDate=%currdate:/=_%

mysqldump -u root-proot db > "C:\backup\database\db%FileDate%.sql"

它将所有表格导出到一个文件中。我希望每个表格都能导出到单独的文件中。


mysqldump -T [dir_name] 这个选项对你不起作用吗?你可以得到单独的结构(.sql)和数据(.txt)文件,但仍然很容易导入... - Bart
2个回答

2
以下代码先将所有表名输出到临时文件中,然后遍历每个表,并将其转储到相应的文件中:
@echo off
set currdate=%date:~4%
set filedate=%currdate:/=_%
mysql --skip-column-names -u root -proot db -e "show tables;" > tables.tmp
for /f "skip=3 delims=|" %%t in (tables.tmp) do (
  mysqldump -u root -proot db %%t > "C:\backup\database\db_%%table_%filedate%.sql"
)
del tables.tmp

娜哈,这不够吗?(我想知道为什么要晚些才发放赏金。) - Rick James
我想指出,在循环中,%%table的索引参数名无效,因为循环参数名必须是单个字符。因此,请使用%%t代替%%table。我在Windows Server 2016上确认了这一点。也许其他版本的Windows允许更长的参数名? - Vincent
@Vincent 感谢您指出这个问题 - 我以前没有遇到过,也不确定它适用于哪些 Windows 版本(2018 年我在 Windows 8.1 上工作时可以正常运行)。现在已经更新了答案,使用 %%t 替代。 - Steve Chambers

0

由于您没有指出提供的答案有什么问题,这里提供一个类似的答案(请注意,这完全未经测试)

@Echo Off
Rem modify as necessary
Set "buDest=C:\backup\database"
Set "dbName=db"
Set "dbPass=root"
Set "dbUser=root"
Rem If binaries are not in %CD% or %PATH% modify the Set line below
Rem     Example: Set "sqlBin=C:\Program Files\MySQL\MySQL Server 5.5\bin"
Set "sqlBin=."

Set "dStamp="
For /F "Tokens=1-3 Delims=/ " %%A In ('RoboCopy/NJH /L "\|" Null') Do If Not Defined dStamp Set "dStamp=%%A_%%B_%%C"

If Not Exist "%buDest%\" MD "%buDest%" 2>Nul || Exit /B

"%sqlBin%\mysql" --user=%dbUser% --password=%dbPass% -D %dbName% -Bse "Show Tables";|^
 For /F "Skip=3 Delims=| " %%A In ('FindStr "^|"') Do (
    mysqldump --user=%dbuser% --password=%dbpass% %%A >"%buDest%\%dbName%-%%A-%dStamp%.sql")

请确保需要修改第3456和可能的9行上的值数据


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接