【问题标题】:Batch-file for mysqldump to backup each database into a separate filemysqldump 的批处理文件,用于将每个数据库备份到单独的文件中
【发布时间】:2012-03-17 09:15:08
【问题描述】:

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

这是我想要的样子:

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

可以在批处理文件中做吗?

请帮忙。谢谢。

【问题讨论】:

  • 我刚刚修复了答案中的错误。请立即尝试...
  • 我的解决方案似乎稍微简单一些,但我来得太晚了 =)

标签: mysql windows batch-file windows-server-2008 mysqldump


【解决方案1】:

这个可以直接在cmd中运行(我换行了但是不应该换行):

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

【讨论】:

  • 太棒了!你以前去过哪里? =)
  • “不被包装”@newtover 表示所有行必须在一行中,否则会出现语法错误。
  • @JubinPatel 只需在一行中使用此脚本(无需换行)
  • 我爱上了你。 :)
  • @newtover:如果不先提出一个好的问题,就不可能有好的答案。 =))
【解决方案2】:

你会喜欢这个的

让 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) at line 1: You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以获取在“.sql”附近​​使用的正确语法) FROM information_schema.schemata WHERE schema_name NOT IN(第 1 行的“information_s”
  • 好一个!有几件事我需要改变,比如 \\ 而不是 \,也没有必要在每个命令的单独窗口中“启动 mysqldump”......我会发布我的答案并接受你的答案。非常感谢。
  • @RolandoMySQLDBA 你先生,真是个坏蛋。
【解决方案3】:

嘿,rolando,我将您的代码与互联网上的其他一些代码结合起来,将所有数据库转储到不同的文件中,并将其压缩到一个带有日期时间戳的文件中,最后删除超过 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%!

【讨论】:

    【解决方案4】:

    好的,首先...我可能使用的 SQL 版本与您不同,如果是这种情况,我很抱歉,您没有在问题中列出您的版本,所以我将给出你什么都适合我。

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

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

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

    我认为我必须为此做的是在批处理脚本中创建一个文件,我将进一步调用该文件将逐行发送命令行,类似于在 FTP 过程中所做的使用批处理脚本。

    我收到后会更新。

    【讨论】:

    • 您使用哪个版本的 MySQL 并不重要。 mysqldump 在所有版本上的工作方式相同。如果我正在运行批处理文件 - 哦,是的,我在本地机器上。 127.0.0.1 - 是一个本地主机,你是对的。
    • @Radio - 你否决了我,因为你问我是否使用了不同版本的 SQL?您的命令不适用于我的 SQL 版本...mysqldump 不适用于我正在使用的 MSSQL,尽管命令应该非常相似。我正在运行 MSSQL,这是最常见的 SQL 版本。
    • 您没有阅读我的问题。它与 MSSQL 或任何其他数据库无关。它仅与 MySQL 有关。请阅读。
    • 你应该学会更好地口头表达自己......这里没有人是读心术的。请确保您遵守正确的问题格式,并从常见问题解答中寻求一些指导。 [stackoverflow.com/faq]
    • 首先,我们在网上聊天,这与VERBAL术语无关。其次,我的原始帖子清楚地显示:主题中的mysql标签和mysqldump。你有什么问题?
    【解决方案5】:

    我已经尝试了答案,但没有一个按预期工作,这是我的备份解决方案,但它会为 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 {hostname} -u {usernamne} -p{password} {dbName} > path/to/store/sql/file.
    • @SumanEStatic 该脚本现在运行良好,完美转储数据库... MySQL Server 5.5
    【解决方案6】:

    这个脚本更“专业”一点,因为它会在一个 DB 转储失败以及哪一个失败时通知某人。不过,我没有备份所有数据库,而只备份了选定的数据库。这可以通过获取所有数据库的命令更改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
    

    【讨论】:

      【解决方案7】:

      我不是 DOS 黑客,但是如果时间在上午 10 点之前,我在批处理文件的副本中添加了一个更正以说明 curtime 变量中的空白字符。 我在 for 循环之后将此行添加到我的批处理文件中:

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

      【讨论】:

        【解决方案8】:

        您可以尝试这种直接的方法:

        mysqldump databaseName -u root --password=rootPass >  "path\myDBbackup.sql"
        

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

        【讨论】:

        • 这不是问题所在
        猜你喜欢
        • 2018-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多