批处理文件用于将每个数据库备份到单独的文件中的mysqldump

20

尝试创建一个批处理(cmd)文件,为每个数据库创建一个单独的备份文件。 由于数据库经常被创建/删除,因此批处理文件需要在每次运行时获取当前数据库名称并备份它们中的每一个。

这是我的期望:

mysql -e "show databases" -u root --password=1234
mysqldump %dbname% -u root --password=1234 > S:\Backup\MySQL\%dbname%.sql

能否在批处理文件中实现该功能?

请帮忙,谢谢。


我刚刚修复了答案中的错误,请现在尝试一下... - RolandoMySQLDBA
1
我的解决方案似乎更简单,但我太晚了 =) - newtover
8个回答

61

这段代码可以直接在命令行中运行(我将代码换了行,但实际上不应该换行):

mysql.exe -uroot -p1234 -s -N -e "SHOW DATABASES" |
  for /F "usebackq" %D in (`findstr /V "information_schema performance_schema"`)
    do mysqldump %D -uroot -p1234 > S:\Backup\MySQL\%D.sql

在批处理文件中,您需要使用额外的百分号来转义百分号,即使用%%D

批处理文件

mysql.exe -uroot -p1234 -s -N -e "SHOW DATABASES" |
  for /F "usebackq" %%D in (`findstr /V "information_schema performance_schema"`)
    do mysqldump %%D -uroot -p1234 > S:\Backup\MySQL\%%D.sql

4
太好了!你之前去过哪里呢?=) - Alex G
1
“not be wrapped” @newtover 的意思是所有代码都必须在同一行,否则会出现语法错误。 - TheFrost
1
@JubinPatel 只需在一行中使用此脚本(不包含换行符) - XandrGuard
1
我爱你。 :) - gramgram
1
@newtover:没有一个好问题,就不会有一个好的答案。=)) - Alex G
显示剩余2条评论

17

这个非常实用

使用information_schema数据库构建DOS批处理文件以并行执行mysqldumps

set MYSQLUSER=root
set MYSQLPASS=1234
set BATCHFILE=S:\Backup\MySQL\Batch_mysqldump.bat 
set DUMPPATH=S:\Backup\MySQL
echo @echo off > %BATCHFILE% 
echo cd %DUMPPATH% >> %BATCHFILE% 
mysql -u%MYSQLUSER% -p%MYSQLPASS% -AN -e"SELECT CONCAT('start mysqldump -u%MYSQLUSER% -p%MYSQLPASS% --routines --triggers ',schema_name,' > ',schema_name,'.sql') FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','performance_schema')" >> %BATCHFILE% 
type %BATCHFILE% 

就像运行任何DOS批处理文件一样运行即可。

确保您有正确的用户名和密码连接到mysql。

我刚刚尝试过,以确保。

C:\>set MYSQLUSER=lwdba

C:\>set MYSQLPASS=<hidden>

C:\>set BATCHFILE=C:\LWDBA\Batch_mysqldump.bat

C:\>set DUMPPATH=C:\LWDBA

C:\>echo @echo off > %BATCHFILE%

C:\>echo cd %DUMPPATH% >> %BATCHFILE%

C:\>mysql -u%MYSQLUSER% -p%MYSQLPASS% -AN -Bse"SELECT CONCAT('start mysqldump -u%MYSQLUSER% -p%MYSQLPASS% --routines --triggers ',schema_nam
e,' > ',schema_name,'.sql') FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','performance_schema')" >> %BATCH
FILE%

C:\>type %BATCHFILE%
@echo off
cd C:\LWDBA
start mysqldump -ulwdba -phidden  --routines --triggers a1ex07 > a1ex07.sql
start mysqldump -ulwdba -phidden  --routines --triggers annarbor > annarbor.sql
start mysqldump -ulwdba -phidden  --routines --triggers dilyan_kn > dilyan_kn.sql
start mysqldump -ulwdba -phidden  --routines --triggers dtest > dtest.sql
start mysqldump -ulwdba -phidden  --routines --triggers dude > dude.sql
start mysqldump -ulwdba -phidden  --routines --triggers example > example.sql
start mysqldump -ulwdba -phidden  --routines --triggers fed > fed.sql
start mysqldump -ulwdba -phidden  --routines --triggers friends > friends.sql
start mysqldump -ulwdba -phidden  --routines --triggers giannosfor > giannosfor.sql
start mysqldump -ulwdba -phidden  --routines --triggers javier > javier.sql
start mysqldump -ulwdba -phidden  --routines --triggers johnlocke > johnlocke.sql
start mysqldump -ulwdba -phidden  --routines --triggers junk > junk.sql
start mysqldump -ulwdba -phidden  --routines --triggers lovesh > lovesh.sql
start mysqldump -ulwdba -phidden  --routines --triggers mysql > mysql.sql
start mysqldump -ulwdba -phidden  --routines --triggers nwwatson > nwwatson.sql
start mysqldump -ulwdba -phidden  --routines --triggers part > part.sql
start mysqldump -ulwdba -phidden  --routines --triggers preeti > preeti.sql
start mysqldump -ulwdba -phidden  --routines --triggers prefixdb > prefixdb.sql
start mysqldump -ulwdba -phidden  --routines --triggers replagdb > replagdb.sql
start mysqldump -ulwdba -phidden  --routines --triggers rollup_test > rollup_test.sql
start mysqldump -ulwdba -phidden  --routines --triggers sample > sample.sql
start mysqldump -ulwdba -phidden  --routines --triggers stuff > stuff.sql
start mysqldump -ulwdba -phidden  --routines --triggers table_test > table_test.sql
start mysqldump -ulwdba -phidden  --routines --triggers tagmediatest > tagmediatest.sql
start mysqldump -ulwdba -phidden  --routines --triggers targetdb > targetdb.sql
start mysqldump -ulwdba -phidden  --routines --triggers test > test.sql
start mysqldump -ulwdba -phidden  --routines --triggers test_mysqldb > test_mysqldb.sql
start mysqldump -ulwdba -phidden  --routines --triggers tostinni > tostinni.sql
start mysqldump -ulwdba -phidden  --routines --triggers user1267617 > user1267617.sql
start mysqldump -ulwdba -phidden  --routines --triggers user391986 > user391986.sql
start mysqldump -ulwdba -phidden  --routines --triggers utility > utility.sql
start mysqldump -ulwdba -phidden  --routines --triggers veto > veto.sql
start mysqldump -ulwdba -phidden  --routines --triggers vito > vito.sql
start mysqldump -ulwdba -phidden  --routines --triggers zipcodes > zipcodes.sql

这是一个有趣的问题。但我收到了一个错误信息:ERROR 1064 (42000) 在第1行:您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册以获取正确的语法,位于'.sql') FROM information_schema.schemata WHERE schema_name NOT IN ('information_s'附近。 - Alex G
很好!有几个东西我需要改变,比如使用“\”而不是“\”,另外每个命令都不需要在单独的窗口中“启动mysqldump”... 我会发布我的答案并接受你的。非常感谢。 - Alex G
@RolandoMySQLDBA 先生,您是一个彻头彻尾的坏蛋。 - Angel S. Moreno

2

嘿,罗兰多,我结合了你的代码和从互联网上获取的其他代码,用于将所有数据库转储到不同文件中,并在一个带有日期时间戳的文件中压缩它,最后删除 60 天前的文件。 干杯

@echo off
CLS
cd c:\temp
set MYSQLUSER=root
set MYSQLPASS=PassWord
set BATCHFILE=c:\temp\Batch_mysqldump.bat 
set DUMPPATH=c:\temp
SET backuptime=%DATE:~4,2%-%DATE:~7,2%-%DATE:~10,4%-%TIME:~0,2%-%TIME:~3,2%
SET backuptimelog=%DATE:~4,2%-%DATE:~7,2%-%DATE:~10,4% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
echo starting MySqlDump at %backuptime%
echo ------ starting MySqlDump at %backuptimelog% ------   >> "Z:\-=macine backup=-\sqldump\sqldump.log"
echo Running dump...   
set 7zip_path=
mkdir "%backuptime%" >> "Z:\-=macine backup=-\sqldump\sqldump.log"
cd "c:\Program Files\MySQL\MySQL Server 5.6\bin"
echo @echo off > %BATCHFILE% 
echo cd %DUMPPATH% >> %BATCHFILE% 
echo copy "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqldump.exe" "c:\temp\%backuptime%" >> %BATCHFILE% 
echo cd "%backuptime%" >> %BATCHFILE% 
mysql -u%MYSQLUSER% -p%MYSQLPASS% -AN -e"SELECT CONCAT('mysqldump -u%MYSQLUSER% -p%MYSQLPASS% ' ,schema_name,' --result-file=',schema_name,'.sql') FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','performance_schema')" >> %BATCHFILE% 
echo exit >> %BATCHFILE%
start /wait %BATCHFILE% 
echo Compressing bk_%backuptime%.sql...
SET ziptime=%DATE:~4,2%-%DATE:~7,2%-%DATE:~10,4% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
echo starting 7zip compression at %ziptime%
echo starting 7zip compression at %ziptime% >> "Z:\-=macine backup=-\sqldump\sqldump.log"
"C:\Program Files\7-Zip\7z.exe" a -t7z -m0=PPMd "Z:\-=macine backup=-\sqldump\bk_%backuptime%.7z" "c:\temp\%backuptime%" >> "Z:\-=macine backup=-\sqldump\sqldump.log"
 echo Deleting the SQL file ...   
 rmdir /s /q "c:\temp\%backuptime%" >> "Z:\-=macine backup=-\sqldump\sqldump.log"
 echo deleting files older than 60 days
 echo deleting files older than 60 days >> "Z:\-=macine backup=-\sqldump\sqldump.log"
 forfiles -p "Z:\-=macine backup=-\sqldump" -s -m *.* /D -60 /C "cmd /c del @path" >> "Z:\-=macine backup=-\sqldump\sqldump.log"
 SET finishtime=%DATE:~4,2%-%DATE:~7,2%-%DATE:~10,4% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
 echo ------ Done at %finishtime%! ------ >> "Z:\-=macine backup=-\sqldump\sqldump.log"
 echo Done at %finishtime%!

0

这个脚本在某种程度上更加“专业”,因为它会在一个数据库备份失败时通知某人,并指出哪个数据库备份失败了。不过,我没有让它备份所有的数据库,而是只选择了一些。通过将SET DBS=的内容更改为获取所有数据库的命令,可以轻松解决这个问题。

编辑:新版本已删除警告消息

@ECHO OFF

:: Configuration part
SET BACKUP_PATH=Backup-MySQL8
SET PHP=C:\Program Files (x86)\PHP\v5.6\php.exe
SET MAIL_TO=to_an_email@domain.com
SET MAIL_FROM=from_an_email@domain.com

SET MYSQL_PATH=C:\Program Files\MySQL\MySQL Server 5.6\bin
SET MYSQL_USER=root
SET MYSQL_PASS=mypassword
SET DBS=database_name1 database_name2


:: Software part
if not exist %BACKUP_PATH% md %BACKUP_PATH%

setlocal EnableDelayedExpansion
SET hasError=0
SET dbsInError=
SET CONFIG_FILE=backup-mysql.cnf

DEL /F /Q %BACKUP_PATH%\* 

echo [mysqldump] > %CONFIG_FILE%
echo user=%MYSQL_USER% >> %CONFIG_FILE%
echo password=%MYSQL_PASS% >> %CONFIG_FILE%

(for %%a in (%DBS%) do (
    "%MYSQL_PATH%\mysqldump.exe" --defaults-extra-file=%CONFIG_FILE% --routines --triggers %%a > %BACKUP_PATH%\%%a.sql
    IF NOT !ERRORLEVEL! == 0 (
        SET hasError=1
        DEL %BACKUP_PATH%\%%a.sql
        SET dbsInError=!dbsInError! %%a
    )
))

DEL %CONFIG_FILE%

IF !hasError! == 1 (
    echo Error... sending email
    "%PHP%" -r "echo (mail('%MAIL_TO%', 'Backup MySQL failed', 'The following database dump failed:!dbsInError!', 'From: %MAIL_FROM%') ? 'Sent' : 'Failed:' . print_r(error_get_last()));"
    echo.
)

echo Backup ended

0

我尝试了这些答案,但是它们都没有按预期工作,这里是我的备份解决方案,但它将为MySQL和其他用户数据库创建一个单独的文件。

set USERNAME=root
set PASSWORD=1234
set TIMESTAMP=%DATE:~10,4%.%DATE:~4,2%.%DATE:~7,2%-%TIME:~0,2%.%TIME:~3,2%.%TIME:~6,2%
set BACKUPPATH=D:\Backup\MySql\

if not exist %BACKUPPATH% md %BACKUPPATH%

mysqldump --all-databases --result-file="%BACKUPPATH%%TIMESTAMP%.sql" --user=%USERNAME% --password=%PASSWORD%

对于mysqldump,你提到的语法是不起作用的,因为我们必须遵循顺序。mysqldump -h {主机名} -u {用户名} -p{密码} {数据库名} > 存储SQL文件的路径。 - Suman EStatic
1
@SumanEStatic 目前脚本运行良好,完美地转储了数据库... MySQL Server 5.5。 - HasanG

0

好的,首先... 可能我使用的SQL版本与你不同,如果是这种情况,我很抱歉,因为你在问题中没有列出你的版本,所以我只会给你适用于我的版本的解决方案。

我已经完成了第一部分,但我仍在努力备份数据库。

sqlcmd -U %USER% -P %PASSWORD% -Q"SELECT name FROM sys.databases" > c:\JHA\Synergy\SQL_db_list.txt

还有其他可以使用的触发器,但听起来你将在安装了SQL的实际机器上,对吗?如果是这种情况,它应该默认将IP连接到SQL设置为127.0.0.1或localhost等。

我认为我需要在批处理脚本中创建一个文件,然后在稍后调用该文件,以逐行发送命令,类似于使用批处理脚本进行FTP过程时所做的操作。

我会在拿到结果后更新此内容。


无论您使用哪个版本的MySQL,mysqldump在所有版本上的工作方式都是相同的。如果我正在运行批处理文件 - 是的,我在本地机器上。 127.0.0.1 - 是本地主机,您对此是正确的。 - Alex G
@Radio - 你因为我问你是否使用了不同版本的SQL而将我的评分降低了吗?你的命令在我的SQL版本上无法运行... mysqldump不能与我正在使用的MSSQL一起使用,尽管这些命令应该非常相似。我正在运行MSSQL,这是最常见的SQL版本。 - rud3y
你没有认真阅读我的问题。它与MSSQL或任何其他数据库无关,只与MySQL有关。请仔细阅读。 - Alex G
你应该学会更好地口头表达自己...这里没有人能读懂你的想法。请确保你遵循正确的问题格式,并从常见问题解答中寻求一些指导。[http://stackoverflow.com/faq] - rud3y
1
首先,我们是在线聊天,这与口头术语无关。其次,我的原始帖子清楚地显示了:主题中有mysql标签和mysqldump。你有什么问题? - Alex G

-1
你可以尝试这种直接的方法:
mysqldump databaseName -u root --password=rootPass >  "path\myDBbackup.sql"

步骤:
1. 在文本编辑器中键入上述代码,并将其保存为批处理文件,例如mybatch.bat
2. 从命令提示符中更改目录(cd)到您保存批处理文件的位置
3. 键入批处理文件的名称并按Enter键,例如mybatch.bat
4. 检查您的DB模式即路径的位置


这不是问题所在。 - Alex G

-1

虽然我不是DOS黑客,但我在批处理文件的副本中添加了一条更正,以便在时间早于上午10点时考虑curtime变量中的空格字符。 在for循环之后,我向批处理文件中添加了这行:

if "%curtime:~0,1%"==" " set curtime=0%curtime:~1,3%

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