在Windows下备份MySQL数据库专门的软件较少,也不是很方便,所以网上基本上都是批处理脚本+Windows计划任务自动备份。

    当然本文也是这样的文章,只是备份脚本容错性更好,也比较灵活。我比较笨,这个脚本的这个版本就折腾了我好几天。所以希望对大家有所帮助。我会把脚本的原理和一些重要代码贴出来,如果想自己尝试,可以自己写一写,不过还是要多多调试才能写出自己的脚本。如果不想写,可以下载我打包好的,希望大家支持,赚点积分。

    我们首先需要编写脚本,然后将脚本添加到Windows的任务计划。

完整脚本:下载地址

一、编写MySQL自动备份脚本

该脚本的目标:

1.      将数据库包括系统数据库备份到指定目录,每个数据库一个文件。

2.      多次备份产生不同的目录,不能覆盖曾经的备份。

3.      可以删除N次以前的备份,比如说30次以前的备份。可以开启备份存在错误时不删除历史备份。最大限度的保证了数据的可追溯性。

4.      绿色支持CAB压缩备份MySQL数据库,保证在没有安装压缩软件的电脑上也能使用压缩备份MySQL数据库。

5.      支持WinRAR压缩备份MySQL数据库,可以启用压缩密码,保证备份的MySQL数据库更加安全。

6.      支持压缩包分卷,便于保存。

7.      可以通过日志查看数据库备份日志。

8.      提供完善的环境和配置参数校验,给出尽可能详细的错误提示,降低使用难度。

注:本文用到的mysql和mysqldump命令,需要安装了mysql数据库的电脑上才能使用这两个命令。这两个可执行文件在mysql安装目录的bin目录中,可以复制出来单独使用。

 

备份MySQL数据库的方法选择

在Windows下备份MySQL数据库,我知道两种方法。第一种,直接复制MySQL的数据库目录。第二种,通过mysqldump导出MySQL数据,以SQL文本方式保存。这两种方法应该选择哪种方法更好呢?我们来分析一下。

 1.复制备份方法

该方法备份简单,速度迅速。这是主要优点。但是该方法存在两个致命下问题:第一个缺陷,数据完整性问题,在复制数据库时,可能其他用户在修改数据库,那么数据可能存在不一致的情况。解决的方法是,复制数据时,关闭MySQL服务,但是这样就导致了用户无法访问数据的情况,如果是很多数据库运行在一个服务中,那么所有用户都将无法连接。第二个缺陷,MySQL数据库现在有两种存储引擎,MyISAM和InnoDB。MyISAM是传统的存储引擎扩展,在创建表的时候如果选择MyISAM存储引擎,那么就会在数据库文件夹下创建3个文件,数据也会写入到相应的文件中,这时用复制目录方法备份数据库没有问题。如果创建表时选择的是InnoDB引擎,这时在数据库目录下只会创建表的结构文件,并不会创建数据文件,这个表的数据被保存到另外一个独立数据库的文件中了,所以这时就算复制数据库目录,却复制不到数据,备份的数据库也无法复制到新的环境中使用。

2.Mysqldump命令导出数据方法

 

    通过该方法备份需要在备份的机器上安装MySQL数据库。该方法的备份速度比直接复制目录慢一些。但是他却能解决直接复制目录所带来的缺点。该方法是在线备份,不需要停止数据库引擎。也就不会终断其他用户的连接。就算启动了事务,也只会锁定正在备份的数据库。该方法不区分存储引擎的类型,一视同仁的导出SQL文本文件。

    所以我们选择mysqldump方法类备份我们的数据库。

 

一个最简单的MYSQL备份脚本

[plain] view plain copy

 print?

  1. mysqldump 数据库名 –h主机 –u用户名 –p密码 > 备份文件名.SQL

这条命令就是将“数据库名”所指定的数据库,备份成“备份文件名.SQL”备份文件。如果你就备份一个数据库,也没有其他要求,就这一条命令就可以了。如果需要自动备份,那么请使用windows的任务计划,将脚本添加进去。如何使用任务计划完成MySQL的自动备份,请参看后面的说明。

 如果我们需要一个更加完备的备份脚本,还需要进一步完善。

一、备份所有数据库

Mysqldump命令有一个参数-A可以直接备份所有的数据库,但是他只能将所有数据库备份到一个文件中,不能让每个数据库保存在一个独立文件中。这样不方便恢复一个数据库,也不方便管理。

我们备份的数据库需要在一个单独目录下,一个数据库一个备份文件的方式来备份所有的数据库。备份文件的名称就用数据库的名称来命名。

    我们应该如何做呢?我们应该先获取数据库的列表,然后循环这个列表,逐个备份。

1. 获取所有的数据库

用mysql的 show databases命令就可以获取所有的数据库,包括系统数据库。在批处理中这样输入:

[plain] view plain copy

 print?

  1. echo show databases; | mysql-hlocalhost -uroot –p123456

    这条语句中包含了 两条命令,通过|将其分开。|后面的指令是通过mysql命令连接到mysql数据库,连接成功后,可以在其中输入MySQL的SQL语句。如果直接执行这个语句,连接成功后,输入show database,那么就会显示数据库的列表。echo show database; 就是输出show database;因此需要通过 | 直接将命令 show database 传递给 mysql 命令,mysql执行传来的命令后并且会自动退出。|这个称之为管道命令,可以将左边命令的结果传递给右边的命令。并且完成之后,右边的命令会退出。

这条语句得到如下结果:

[plain] view plain copy

 print?

  1. Database
  2. information_schema
  3. mysql
  4. performance_schema
  5. test
  6. wordpress

    第一行是标题,其他就是数据库。列表获取之后,我们就可以通过循环来备份了。

2.逐个备份每个数据库

    要逐个备份数据库,需要使用for语句。For语句可以从文件中读取内容,然后循环处理每一行。for也可以直接循环处理命令的输出结果。因为输出数据库列表的指令比较复杂,怕影响for语句的正常运行,所以这里选择先输出到文件,然后for语句从文件中读取结果处理。

[plain] view plain copy

 print?

  1. Set backupPath=F:\dbbackup
  2. Set dbhost=localhost
  3. Set dbuser=root
  4. set dbpwd=123456
  5. set dblist=%temp%\dblist.txt
  6. echo showdatabases; | mysql -h”%dbhost%” -u”%dbuser%” -p”%dbpwd%” > ”%dblist%”
  7. for /f ” usebackq skip=1 tokens=*” %%i in (“%dblist%”) do mysqldump–single-transaction ”%%i” -h”%dbhost%” -u”%dbuser%” -p”%dbpwd%” > ”%backupPath%\%%i.sql”

    说明:先通过SET命令设置变量。然后在零时目录生成数据库列表文件。

    重点是for语句,For语句将%%i作为变量,然后循环匹配括号里提供的内容,每匹配成功一次就执行一次do后面的命令,并且会把匹配成功的结果保存在%%i中,可以在do后面的命令中使用。

    参数/F 表示读取 in 后面括号里提供的内容。

    这个括号里提供的内容可以是字符串、文件名和命令。

    如果是字符串使用双引号括起来,如:in (“字符串”)。
如果是命令使用单引号括起来,如:in (‘dir c:\’)

    如果是文件就直接写入,如:in (file.txt)

    但是这里读取文件却使用双引号括了起来,那不是字符串吗?当然不是,在配置参数相中使用usebackq,那么括号中双引号括起来的就是文件。为什么要使用双引号呢?因为在文件夹命名中经常会有空格,如果不用双引号括起来,那么命令将空格前后视为不同的两个文件,所以必须使用引号括起来。

    skip=1是跳过第一行。第一行Database是标题所以跳过。

    tokens=* 获取整行的数据。

    mysqldump 多了一个–single-transaction,该参数保证了在InnoDB存贮引擎下,启动事务,保证数据完整性。”%%i”为了保证数据名在存在空格下也能正确识别。其他引号也是同样的道理。

    至此我们第一个任务完成了。

二、为每次备份生成独立的文件夹

    每备份一次都在指定备份目录中创建一个独立的文件夹来保存。
文件夹的命名可以采用:自定义前缀+时间+日期的方式命令。如:MyBackup_2013-04-25 12.00.50.33

    创建文件夹名的脚本如下:

[plain] view plain copy

 print?

  1. REM 备份文件夹前缀。
  2. SET backupFolderPrefix=MyBackup_
  3. for /f ”tokens=1,2* delims= ” %%i in (‘echo %date:/=-%’) do set myDate =%%i
  4. SET myTime=%time::=.%
  5. SET myTime=%myTime: =0%
  6. MD  %backupFolderPrefix%%myDate% %myTime%

说明:

      %date%返回当前系统日期,后面可能跟星期几也可能没有。日期格式可能是斜线分隔,也可能横线分割。如可能的格式(不含引号):“2013-04-25 星期四”,“2013/04/25 星期四”, “2013-04-25”,“13/04/25”等。因为文件夹或文件命名中不能有“/”符号,所以必须把”/”替换掉。%date:/=-%就是返回将日期中的“/”替换为“-”后的结果。我们也不需要后面的星期几,通过for语句获取空格前面部分的日期(之前的版本由于没有考虑到“/”问题,导致有些环境只能创建文件夹,不能正常备份)。
%time%返回当前系统时间。如: “14:50:33.92”,“ 3:23:30.90”。同样文件夹或文件名中不能有“:”号,所以需要替换掉。%time::=.%用“.”替换“:”。时间在0到9点,我们在前面加0,让格式更加统一。0到9点前面没有0但是是有空格的,我们个空格替换成“0”就可以了。%myTime: =0%

     至此我们已经完成了目标1和2.接下来我们处理压缩备份。

三、压缩备份MySQL数据库

     数据库如果直接备份处理会占用很大空间,通过压缩备份好的.SQL文件,可以节省备份空间。现在很多朋友备份好数据库,把数据文件同步到网盘,这样数据就会更加安全一些。如果数据库被压缩了保存,就能节省网盘的空间。有些网盘对单个文件大小有限制,所以,能多压缩包进行分卷(也就是分包)那就更好了。

    对备份好的数据库进行压缩,本文主要采取两种方法。一种系统内置的MakeCab,用来产生CAB压缩包。这个好处在于,系统中不用第三方压缩软件,系统内置,所以比较方便使用。但是,功能没有第三方软件强大,也不能设置压缩密码,而且好像分卷压缩好像有大小限制。第二种采用WinRAR第三方软件来实现压缩,这也是主流和老牌的压缩软件,功能和压缩率都很好。可以设置压缩密码。

    压缩备份整体思路是这样的,先将数据库通过上面的方式备份到临时目录中,然后将其压缩到备份目录中。压缩备份如果不分卷,直接装备份的压缩包保存到备份目录,如果是分卷压缩备份,那么在备份目录也是以单独的文件夹中保存多个分卷方式处理,这样便于在压缩目录浏览,也不会感觉很凌乱。

1.采用CAB压缩来备份MySQL数据库

    MakeCAB软件的使用方法:这个软件压缩功能比较弱,压缩包内不能有文件夹。而且多个文件打包到一个压缩包中的时候,需要先构建一个打包文件的文件列表,然后根据文件列表进行压缩打包。MakeCAB还有个弊端,在打包多文件时,不能指定压缩包的输出路径,实在是太弱了。只因为他是绿色的,所以才想办法使用它,本来想使用windows自带的ZIP压缩功能,查了半天没有相关命令,实在有点郁闷。 Makecab使用说明:

[plain] view plain copy

 print?

  1. makecab /f (文件列表) /d compressiontype=(mszip,lzx) /d compressionmemory=(15-21) /d maxdisksize=(分卷大小) /d diskdirectorytemplate=(文件夹模板) /d cabinetnametemplate=(文件名模板)

参数简述:
文件列表:保存了要打包文件的列表。
压缩类型(compressiontype):mszip–压缩率一般。lzx–高压缩率。
压缩级别(compressionmemory):mszip时范围10,21。我测试好像没有什么变化;lzx是,取值范围15,21.
分卷大小(maxdisksize):整数,单位为字节。数值必须是512的整数倍。最大好像是2G(2^31)。

        文件夹模板(diskdirectorytemplate):设置在压缩后自动在当前目录产生的文件夹名称规则。特殊字符“*”表示,以1开始递增的数字命名创建文件夹。如:disk*,在有三卷的情况下,那么就会生成disk1,disk2,disk3。如果不带“*”号,那么就只创建一个文件夹。

文件名模板(cabinetnametemplate):和文件夹模板规则一样。如果没有分卷,就可以不用“*”号;如果,启用了分卷压缩,就一定要使用“*”号,否则会导致最后的卷覆盖了前面的分卷。

使用makecab压缩数据库的代码如下:

[plain] view plain copy

 print?

  1. SET myTempDir=临时目录
  2. SET backDbTmpPath=备份好的数据库文件目录
  3. SET volumePackSize=分卷大小
  4. FOR /f ”tokens=1* delims=” %%i in (‘DIR ”%backDbTmpPath%” /S /B /A-D’) do echo ”%%i” >> ”%myTempDir%\cab_files.lst”
  5. REM 切换到零时目录
  6. FOR /F ”delims=:” %%i IN (‘ECHO %myTempDir%’) DO %%i:
  7. CD ”%myTempDir%”
  8. IF NOT %volumePackSize%==0 GOTO CabSplitCompress
  9. makecab /f ”%myTempDir%\cab_files.lst” /d compressiontype=lzx /d compressionmemory=%cabCompressLevel% /d maxdisksize=0 /d diskdirectorytemplate=cabdb /d cabinetnametemplate=”%backupName%.cab”
  10. MOVE /Y ”%myTempDir%\cabdb\%backupName%.cab” ”%backupPath%\”
  11. GOTO BackupFinished
  12. :CabSplitCompress
  13. SET /A maxdisksize=%volumePackSize% * 1024
  14. makecab /f ”%myTempDir%\cab_files.lst” /d compressiontype=lzx /d compressionmemory=%cabCompressLevel% /d maxdisksize=%maxdisksize% /d diskdirectorytemplate=cabdb /d cabinetnametemplate=”%backupName%.part*.cab”
  15. MOVE /Y ”%myTempDir%\cabdb\*” ”%backupPath%\%backupName%\”
  16. GOTO BackupFinished

    在这段代码之前,已经将数据库通过mysqldum命令方式备份到%backDbTmpPath%目录中了,所以只需要将这个目录中的数据压缩后移动到备份目录即可。

    代码说明:第一个for语句中的’DIR “%backDbTmpPath%” /S /B /A-D ‘是列出临时数据库备份目录中的文件,也就是备份好的数据库.sql文件,/S /B 就是以完整路径方式列出文件。为什么还需要使用for语句呢?因为这个语句不能为完整文件路径前后加上双引号括起来,如果不加上引号括起来,在使用mackcab压缩的时候,他只会识别空格之前的内容,就会提示找不到文件,那么备份就不会成功。所以使用for语句再循环一遍,在每个完整路径的前后添加双引号,echo “%%i”就达到了目的。

    压缩文件列表生成好后,需要将当前目录切换到压缩零时目录中,因为makecab在压缩时只能将压缩结果压缩到当前目录的指定目录下。这句“FOR /F “delims=:” %%i IN (‘ECHO%myTempDir%’) DO %%i:”用于识别临时目录所在的分区,并切换到这个分区。

    然后再根据配置参数是否启用分卷压缩,进行不同的处理。

    没有分卷压缩就是,直接压缩然后移动压缩好的,参数请参看双面的说明。

   如果启用了分卷压缩,那么有一点非常重要,那就是makecab的分卷必须是512的整数倍。所以为了保证用户在配置分卷大小的时候不用考虑这个数值,我们可以进行一定的处理。因为WinRAR压缩包分卷是1代表的是1k,而在makecab中1024代表分包1k,所以为了保证统一的压缩分卷配置,makecab在压缩时统一将分卷大小*1024。这样既能保证这个数字既能是512的整数倍,也能和WinRAR的压缩卷大小统一。SET /A maxdisksize=%volumePackSize% * 1024。参数“/a”表示运算后面的乘法然后设置给maxdisksize。剩下的处理和前面差不多。

2.采用WinRAR压缩备份MySQL数据库

    WinRAR压缩功能比较强大,可以直接将备份在临时目录的数据库压缩到数据库备份目录。

    使用rar压缩数据库代码如下:

[plain] view plain copy

 print?

  1. :RarCompress
  2. SET rarCommand=”%rarPath%\rar.exe” a -r -ep1 -o+ -m%compressLevel%
  3. IF NOT %volumePackSize%==0 SET rarCommand=%rarCommand% -v%volumePackSize%
  4. IF NOT %rarPwd%=={empty} SET rarCommand=%rarCommand% -p%rarPwd%
  5. REM 如果未分卷,保存在备份目录的根目录
  6. IF %volumePackSize%==0 SET rarCommand=%rarCommand% ”%backupPath%\%backupName%.rar”
  7. REM 如果分卷,保存在根目录下的一个专属文件夹中
  8. IF NOT %volumePackSize%==0 SET rarCommand=%rarCommand% ”%backupPath%\%backupName%\%backupName%.rar”
  9. SET rarCommand=%rarCommand% ”%backDbTmpPath%\”
  10. %rarCommand%

代码说明:这里采用了根据条件来构建命令的方式。根据不同的参数生成不同的命令行。也就是设置一个变量,把命令和参数都拼凑进去,然后直接输出变量就可运行。

这里用到的RAR参数说明:

        a:备份指定目录下所有文件。

        -r:备份目录和子目录。

        -ep1:不包含完整路径,但是包含压缩目录的下的目录结构。如果是-ep,那么压缩包包涵所有的文件,但是没有目录结构。还有 -ep3,那就是包涵驱动器进去的完整路径了。

        -o+:如果文件存在就覆盖。
-m:后面跟压缩等级。0~5的取值范围。

        -v:设置卷标大小。整数,1代表1K

        -p:压缩包密码

        然后就是压缩包名称

        最后一个参数是源目录

至此我们已经完成了目标:1,2,4,5,6

四、能删除历史备份

    解决思路:每次备份都在一个主目录中创建一个备份目录,这样每次备份就有一个独立的目录。然后根据文件夹创建的时间倒序获取文件夹的列表,最新的备份就排到了最前面,那么删除以前的备份,就是删除尾部的文件夹即可。注意如果启用了为卷的压缩备份,那么就删除文件,而不是删除文件夹。

    代码如下:

[plain] view plain copy

 print?

  1. REM ***************************************************************************
  2. REM 删除历史备份
  3. :RemoveHistoryBackup
  4. IF %isExistError%==yes ( IF %onErrorDeleteBackFile%==no GOTO ClearTmpFile )
  5. IF %deleteHistorySkips%==0 GOTO ClearTmpFile
  6. IF %enableCompress%==no GOTO RemoveHistoryBackupFolder
  7. IF NOT %volumePackSize%==0 GOTO RemoveHistoryBackupFolder
  8. GOTO RemoveHistoryBackupFile
  9. :RemoveHistoryBackupFolder
  10. FOR /F ”Skip=%deleteHistorySkips% tokens=*” %%i IN (‘DIR ”%backupPath%\%backupFolderPrefix%*” /TC /O-D /AD /B’) DO RD ”%backupPath%\%%i” /S /Q & ECHO %myDate% %TIME%   删除历史备份:%%i >> ”%backupLogFile%”
  11. GOTO ClearTmpFile
  12. :RemoveHistoryBackupFile
  13. FOR /F ”Skip=%deleteHistorySkips% tokens=*” %%i IN (‘DIR ”%backupPath%\%backupFolderPrefix%*” /TC /O-D /A-D /B’) DO DEL ”%backupPath%\%%i” /Q /F & ECHO %myDate% %TIME% 删除历史备份:%%i >> ”%backupLogFile%”
  14. GOTO ClearTmpFile
  15. REM 完成删除历史备份
  16. REM ***************************************************************************

    说明:首先进行一些校验,只有符合条件了才进行删除。一种是删除文件夹的形式,一种是删除文件的形式。

    for 语句中使用的dir命令使用了备份名前缀来进行文件夹或者文件的匹配,这样匹配度更高,可以防止一部分误删除,但是如果其他文件夹或文件名前缀和这个前缀相同,那么就会产生误删除。所以这里请注意。

    这里的重要参数/TC /O-D,/TC 表示排序以创建时间作为依据,而不是最后修改时间,这样可以更加有效的控制删除。/O-D表示根据时间进行倒序排序。以前使用的文件夹名称排序方式进行删除,后来考虑到这个排序结果受到日期格式的影响,可能会产生错误的删除,所以最终放弃了这种方式。

    保留多少次,skip多少次就可以了。

五,数据库备份日志

    在备份MySQL的时候,可能成功或者失败。以及一些环境监测的数据都可以写入到日志文件中。

    这需要写日志输出到日志文件即可。日志文件存放到备份目录的根目录。同时如果在备份具体数据库出错时,除了需要向日志文件中写入日志,需要在特定备份目录中新建一个备份失败数据库的记录文件。这里文件命名为##BackupFailDbs.txt,这样在备份目录中,排在文件的第一个位置就是他了。方便查找。

[plain] view plain copy

 print?

  1. echo 日志信息 >> %backupLogFile%

    到这里,我们的目标已经完成了1到7了。还有最后一个目标。

六、环境参数校验

环境检测主要是检测文件夹权限,mysql是否可以使用,各个配置项是否正确。

检测是比较简单和冗长的过程,下面代码及时针对文件的权限进行检测。

[plain] view plain copy

 print?

  1. REM ****目录权限检测****
  2. REM 检查备份目录是否存在,不存在则创建
  3. :CheckAndMakeBackupFolder
  4. IF exist ”%backupPath%” GOTO CheckBackupFolderCreatFile
  5. MD ”%backupPath%”
  6. IF %errorlevel%==0 GOTO CheckBackupFolderCreatFile
  7. ECHO 创建数据库备份目录失败。请检测您是否具有写入”%backupPath%”的权限,或者驱动器是否存在。
  8. PAUSE
  9. GOTO END
  10. REM 检查备份目录是否有创建文件的权限
  11. :CheckBackupFolderCreatFile
  12. ECHO. > ”%backupPath%\%checkFileName%”
  13. IF EXIST ”%backupPath%\%checkFileName%” del ”%backupPath%\%checkFileName%” /Q /F & GOTO CheckBackupFolderCreateFolder
  14. ECHO 请检查对备份文件夹”%backupPath%”是否有文件写入权限。
  15. PAUSE
  16. GOTO END
  17. REM 检查备份目录是否有创建文件夹的权限
  18. :CheckBackupFolderCreateFolder
  19. MD ”%backupPath%\%checkFileName%” && ( RD /S /Q ”%backupPath%\%checkFileName%” & GOTO CheckTempFolderAccess )
  20. ECHO %myDate% %TIME%    请检查对备份文件夹”%backupPath%”是否有创建文件夹的权限。>>”%backupLogFile%”
  21. GOTO END
  22. REM 检测临时目录访问权限
  23. :CheckTempFolderAccess
  24. ECHO. > ”%temp%\%checkFileName%”
  25. IF EXIST ”%temp%\%checkFileName%” DEL ”%temp%\%checkFileName%” /Q /F & GOTO MakeTempFolder
  26. ECHO %myDate% %TIME%    没有临时目录写入权限。请用具有权限的用户执行备份脚本。>>”%backupLogFile%”
  27. GOTO END
  28. REM 创建零时目录
  29. :MakeTempFolder
  30. MD ”%myTempDir%” && GOTO CheckMySQLInstalled
  31. ECHO %myDate% %TIME%    无法创建临时目录”%myTempDir%”。请检查临时目录权限。>>”%backupLogFile%”
  32. GOTO END
  33. REM ****完成目录权限检测****
  34. REM *********************************************************************

 

 

7.确保MySQL数据库备份脚本能在本地正常运行

获得脚本后,我们要确认当前的环境是否能正常运行脚本。脚本要用到MySQL的客户端,所以在运行脚本前先安装MySQL。验证本机能不能使用MySQL客户端,开始–>运行–>CMD,然后回车。

如果我们不希望在本机安装MySQL数据库,我们可以再其他已经安装了MySQL数据库的电脑上,找到MySQL的安装目录,在其bin目录下可以找到mysql.exe和mysqldump.exe这两个可执行文件。将他复制过来,放到C:\Windows\就可以了。

完成上面一步之后,我们来进行脚本文件的配置。

 

8.配置脚本文件参数

在备份MySQL的脚本上右键,选择编辑。这时记事本会打开脚本文件。脚本文件前部分是参数配置(根据实际情况填写):

 

[plain] view plain copy

 print?

  1. REM ***************************************************************************
  2. REM 参数配置(参数前后不能有空格)
  3. REM 设置dbhost为主机名或IP地址。设置MySQL数据库的地址,本机不用改。
  4. SET dbhost=localhost
  5. REM 设置登陆mysql数据库的用户名。如果用户名中有”号,请用”"代替。
  6. SET dbuser=root
  7. REM 设置登陆mysql的密码。如果密码中有”号,请用”"代替。
  8. SET dbpwd=123456
  9. REM 设置backupPath为备份文件存放的路径。注意:文件夹名存在空格不需要引号括起来。警告:此文件夹应为专用目录,最好独立使用,避免删除历史备份时误删数据。
  10. SET backupPath=D:\MySQLAutoBackup
  11. REM 备份文件夹前缀。
  12. SET backupFolderPrefix=MyBackup_
  13. REM 设置删除历史备份文件。删除多少次备份之前的备份文件。0–不删除历史备份文件;1,表示一次,2,表示2次,以此类推。如set deleteHistorySkips=30表示删除30次以前的备份文件;
  14. SET deleteHistorySkips=30
  15. REM 设置备份时发生错误是否删除历史备份文件。yes–删除;no–不删除。
  16. SET onErrorDeleteBackFile=no
  17. REM 是否启用压缩功能。yes–开启压缩功能。no–禁用压缩功能。默认值:no,不开启。
  18. SET enableCompress=yes
  19. REM 设置WinRAR压缩级别。取值0到5。0–无压缩;5–最高压缩比;默认值:3
  20. SET compressLevel=3
  21. REM 压缩类型。cab–系统内置cab压缩功能。rar–启用RAR压缩功能,需要安装RAR压缩软件支持
  22. SET compressType=cab
  23. REM 设置WinRAR安装路径。
  24. SET rarPath=C:\Program Files\WinRAR
  25. REM 设置分卷大小。0–表示不分卷;1–表示1k,1024–表示1M,2048–表示2M;默认值:102400,表示100M
  26. SET volumePackSize=0
  27. REM 设置压缩密码。{empty}表示没有密码。其他字符表示压缩文件密码
  28. SET rarPwd={empty}
  29. REM 设置临时目录。如果备份时系统默认临时目录所在分区空间太小,可以通过这里调整该脚本运行的临时目录。默认值:%TEMP%
  30. REM 启用压缩时,零时目录占用空间较大,大约是备份数据库的1.2倍。不启用压缩,占用临时目录空间很小。
  31. REM 如果启用了CAB压缩,临时目录最好和备份文件夹在同一个分区。请保证指定的临时目录存在。
  32. SET TEMP=%TEMP%
  33. REM 完成参数配置
  34. REM ***************************************************************************

 

配置完后保存并退出,然后双击脚本,运行一下脚本。如果配置不正确,脚本会给出提示。如下图:

如果运行成功,会在备份文件夹中创建日志文件和数据库备份文件。

在确认脚本能正常运行的情况后,就可以将脚本添加到计划任务了

 

二、将脚本添加到Windows计划任务中,让数据库自动进行备份

在Windows 2003和 Windows 2008 R2中计划任务稍微有些不同,这里就将两种方式都进行讲解。

    3.1.在Windows 2003中向计划任务添加MySQL自动备份脚本

开始–>控制面板–>计划任务–>添加计划任务,打开计划任务向导。

 

打开向导之后,选择“下一步”,之后要求选择程序,在这里选择“浏览”,选择我们配置好的脚本文件。

 

选择脚本后点击确定,打开如下窗口:

 

在这个窗口中,任务名可以保持默认,且选择“每天”,数据库每天进行备份,然后点击“下一步”打开如下窗口:

 

“起始时间”,就是脚本开始运行的时间,根据实际需要配置。一般配置到深夜。运行这个任务选择每天。然后点击“下一步”打开如下窗口:

 

在这里配置运行脚本的用户。运行脚本的用户,一定要具有读写备份目录和临时的权限,所以用户最好配置成验证脚本时登陆的用户。设置好用户名和密码之后,点击“下一步”,然后点击完成。完成计划任务的配置。

 

如果出现如下的警告信息:

表明计划任务的服务没有运行,通过以下方法手工开启。

打开“控制面板”,找到“管理工具”,在管理工具下找到“服务”,双击打开。

在服务管理器中,找到“Task Scheduler”这个服务,双击打开,选择启动类型为“自动”,点击“应用”,然后点击“启动”,最后点击“确定”,然后关闭服务管理器。

然后找到添加好的任务计划,右键选择运行,测试一下任务是否能正常运行。

 

 

 

3.2.在Windows 2008 R2 中添加MySQL自动备份脚本到任务计划中

控制面板–>管理工具–>计划任务程序–>双击打开

 

选择“Microsoft”节点(也可以先创建自己的任务分类),点击“创建基本任务”,打开如下窗口:

 

名称随意输入,点击下一步。

 

选择每天,点击下一步。

 

填写好,每天开始运行脚本的时间,每隔填写1天。然后点击下一步

 

选择“启动程序”,下一步。

 

点击浏览,选择脚本文件,另外两个参数留空。然后点击下一步,再点击完成。完成配置向导。同样可以右键我们建好的计划任务选择运行,测试我们的自动备份MySQL脚本是否能正常运行。

配置完成。

 

三、下面就提供一下MySqlAutoBackup-1.4.bat的运行情况截图:

1.错误设置的检测日志说明

 

2.备份日志记录

 

3.备份目录结果截图