批处理自动备份mySQL数据库和自动还原mySQL数据库

产品上线,数据库备份就是不得不考虑的问题。下面说说我的数据库备份策略。

我的服务器为Win2003,项目的数据库引擎采用的是MyIsam,数量大并不大,运营到现在1个月,数据库大小6M。为了防止出现意外,数据库每天都需要备份,当然,如果每天手工备份,那就要把人烦死。所以我就写了下面的批处理文件,通过Win2003系统的计划任务,在凌晨2点开始执行批处理,备份数据库。批处理中我采用了两种方法,一种是通过mysqldump命令备份,并通过gzip压缩数据。另一种是备份物理文件,通过调用rar命令压缩数据。至今,这个数据库备份批处理文件运行近1个月,目前看来效果符合预期。下面先看一下备份mySQL数据库的批处理代码:

备份数据库

[plain]  view plain copy
  1. @ECHO OFF  
  2. set path=%SystemRoot%\system32;D:\PHP\MySql\MySQL Server 5.1\bin;C:\Program Files\WinRAR  
  3. set mktime=%date:~0,10%  
  4.   
  5. ::设置数据库名称(两个数据库,则下面的for中的tokens值为1,2。如果有三个数据库,则tokens值为:1,2,3。数据库依次为%%a,%%b,%%c....按英文字母顺序排列)  
  6. ::这里备份三个数据库:DB_A、DB_B、DB_C,数据库间用半角逗号分隔  
  7. SET dbname=DB_A,DB_B,DB_C  
  8.   
  9. ::数据库管理员权限及密码  
  10. SET dbuser=root  
  11. SET dbpasswd=123456  
  12.   
  13. ::mySQL所在目录  
  14. SET mysqldir=D:\PHP\MySql\MySQL Server 5.1  
  15.   
  16. ::备份gz文件所在目录  
  17. SET gz_backupdir=D:\mySQL_data_bak\sql_gz_bak  
  18. if not exist %gz_backupdir% md %gz_backupdir%  
  19.   
  20. ::备份file文件所在目录  
  21. SET file_backupdir=D:\mySQL_data_bak\file_bak  
  22. if not exist %file_backupdir% md %file_backupdir%  
  23.   
  24. ::::停止WWW网页WEB服务::::或者停止Apache2 命令:net stop Apache2  
  25. net stop w3svc  
  26.   
  27. ::::延时15秒  
  28. ping -n 15 127.0.1>nul  
  29.   
  30. ::::开始备份mySQL数据库::::  
  31. @ECHO Beginning backup of %dbname%...  
  32. for /f "tokens=1,2,3 delims=," %%a in ("%dbname%") do (  
  33.   if not exist %gz_backupdir%\%%a md %gz_backupdir%\%%a  
  34.   if not exist %gz_backupdir%\%%b md %gz_backupdir%\%%b  
  35.   if not exist %gz_backupdir%\%%c md %gz_backupdir%\%%c  
  36.   "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%a | gzip > %gz_backupdir%\%%a\%mktime%.sql.gz  
  37.   "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%b | gzip > %gz_backupdir%\%%b\%mktime%.sql.gz  
  38.   "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%c | gzip > %gz_backupdir%\%%c\%mktime%.sql.gz  
  39. )  
  40.   
  41. ::停止mySQL服务,以便拷备文件  
  42. net stop MySQL  
  43.   
  44. ::延时10秒  
  45. ping -n 10 127.0.1>nul  
  46.   
  47. ::开始将要备份的文件打包到仓库  
  48. d:  
  49. cd "%mysqldir%\data"  
  50. for /f "tokens=1,2,3 delims=," %%a in ("%dbname%") do (  
  51.   if not exist %file_backupdir%\%%a md %file_backupdir%\%%a  
  52.   if not exist %file_backupdir%\%%b md %file_backupdir%\%%b  
  53.   if not exist %file_backupdir%\%%c md %file_backupdir%\%%c  
  54.   @rar a %file_backupdir%\%%a\%mktime%.rar %%a  
  55.   @rar a %file_backupdir%\%%b\%mktime%.rar %%b  
  56.   @rar a %file_backupdir%\%%c\%mktime%.rar %%c  
  57. )  
  58.   
  59. ::::启动MySQL::::  
  60. net start MySQL  
  61.   
  62. ::::启动IIS::::如果WEB服务器是Apache,则去掉下面一行,使用: net start Apache2  
  63. net start w3svc  
  64.   
  65. exit  

对于上面的内容,做以下几点补充说明

1、由于采用两种方式备份,为了不混淆,所以以mysqldump方式备份的,由于通过gzip压缩,所以后缀名为.gz,这种文件我保存在D:\mySQL_data_bak目录下的sql_gz_bak目录下。以物理备份文件方式的,由于通过rar压缩,后缀名为.rar,这种文件我保存在D:\mySQL_data_bak目录下的file_bak目录下。备份的文件名是变量mktime决定的,mktime=%date:~0,10%,意思是把当前时间从位置0开始,截取10个字符,那么%data%为:2012-08-31 星期五 取得的结果就为:2012-08-31

2、设置备份数据库名称。上面的例子中备份了三个数据库。分别为DB_A、DB_B、DB_C,这个根据你实际情况备份你需要的数据库了。这里要注意的是,由于这在里统一配置要配备的数据库,那么在下面要通过批处理的for命令来遍历,依次读取需要备份的数据库名称。所以,如果你备份的数据库恰好不是3个,那么你要改动上面的代码。

备份一个数据库的情况

[plain]  view plain copy
  1. 省略...  
  2. SET dbname=DB_A  
  3. 省略...  
  4. ::::开始备份mySQL数据库::::  
  5. @ECHO Beginning backup of %dbname%...  
  6. for /f "tokens=1 delims=," %%a in ("%dbname%") do (  
  7.   if not exist %gz_backupdir%\%%a md %gz_backupdir%\%%a  
  8.   "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%a | gzip > %gz_backupdir%\%%a\%mktime%.sql.gz  
  9. )  
  10. 省略...  
  11. for /f "tokens=1 delims=," %%a in ("%dbname%") do (  
  12.   if not exist %file_backupdir%\%%a md %file_backupdir%\%%a  
  13.   @rar a %file_backupdir%\%%a\%mktime%.rar %%a  
  14. )  
  15. 省略...  

备份两个数据库的情况

[plain]  view plain copy
  1. 省略...  
  2. SET dbname=DB_A,DB_B  
  3. 省略...  
  4. ::::开始备份mySQL数据库::::  
  5. @ECHO Beginning backup of %dbname%...  
  6. for /f "tokens=1,2 delims=," %%a in ("%dbname%") do (  
  7.   if not exist %gz_backupdir%\%%a md %gz_backupdir%\%%a  
  8.   if not exist %gz_backupdir%\%%b md %gz_backupdir%\%%b  
  9.   "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%a | gzip > %gz_backupdir%\%%a\%mktime%.sql.gz  
  10.   "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%b | gzip > %gz_backupdir%\%%b\%mktime%.sql.gz  
  11. )  
  12. 省略...  
  13. for /f "tokens=1,2 delims=," %%a in ("%dbname%") do (  
  14.   if not exist %file_backupdir%\%%a md %file_backupdir%\%%a  
  15.   if not exist %file_backupdir%\%%b md %file_backupdir%\%%b  
  16.   @rar a %file_backupdir%\%%a\%mktime%.rar %%a  
  17.   @rar a %file_backupdir%\%%b\%mktime%.rar %%b  
  18. )  
  19. 省略...  

3、在备份数据库前停止WEB服务,是为了确保备份数据库的一致性。

4、其它参数配置,根据实际情况改动。

5、通过gzip压缩,需要将gzip.exe放到mySQL目录下的bin目录中。

还原数据库

由于备份时采用两种方式备份数据库,所以还原数据库时,应用两种方法分开还原。所以还原数据库的批处理命令为两个批处理文件。

通过SQL文件(GZ)还原.bat

[plain]  view plain copy
  1. @ECHO OFF  
  2. ::更改数据库名称  
  3. SET dbname=DB_A  
  4.   
  5. ::更改欲还原的数据库备份文件  
  6. SET filename=xxxx-xx-xx.sql.gz  
  7.   
  8. set path=%SystemRoot%\system32;D:\PHP\MySql\MySQL Server 5.1\bin  
  9.   
  10. ::::停止WWW网页WEB服务::::或者停止Apache2 命令:net stop Apache2  
  11. net stop w3svc  
  12.   
  13. ::::延时15秒  
  14. ping -n 15 127.0.1>nul  
  15.   
  16. ::数据库管理员权限及密码  
  17. SET dbuser=root  
  18. SET dbpasswd=123456  
  19.   
  20. ::要还原的gzip文件路径  
  21. SET filename=D:\mySQL_data_bak\sql_gz_bak\%dbname%\%filename%  
  22.   
  23. @ECHO Beginning restore of %dbname%...  
  24. gunzip < %filename% | mysql -u %dbuser% -p%dbpasswd% %dbname%  
  25.   
  26. ::::启动IIS::::如果WEB服务器是Apache,则去掉下面一行,使用: net start Apache2  
  27. net start w3svc  

通过备份文件(RAR)还原.bat

[plain]  view plain copy
  1. @ECHO OFF  
  2. set path=%SystemRoot%\system32;D:\PHP\MySql\MySQL Server 5.1\bin;C:\Program Files\WinRAR  
  3. set mktime=%date:~0,10%  
  4.   
  5. ::设置数据库名称  
  6. SET dbname=DB_A  
  7.   
  8. ::设置欲还原的压缩文件包文件名  
  9. SET filename=xxxx-xx-xx.rar  
  10.   
  11. ::mySQL所在目录  
  12. SET mysqldir=D:\PHP\MySql\MySQL Server 5.1  
  13.   
  14. ::备份的file文件所在目录  
  15. SET file_backupdir=D:\mySQL_data_bak\file_bak\%dbname%  
  16.   
  17. if not exist "%mysqldir%\data\%dbname%" md "%mysqldir%\data\%dbname%"  
  18.   
  19. ::::停止WWW网页WEB服务::::或者停止Apache2 命令:net stop Apache2  
  20. net stop w3svc  
  21.   
  22. ::::延时15秒  
  23. ping -n 15 127.0.1>nul  
  24.   
  25. ::停止mySQL服务,以便拷备文件  
  26. net stop MySQL  
  27.   
  28. ::延时10秒  
  29. ping -n 10 127.0.1>nul  
  30.   
  31. ::开始将要备份的文件打包到仓库  
  32. cd /d "%mysqldir%\data"  
  33. :: e表示解压 -o+ 表示替换原有文件  
  34. rar e -o+ %file_backupdir%\%filename% "%mysqldir%\data\%dbname%"  
  35.   
  36. ::::启动MySQL::::  
  37. net start MySQL  
  38.   
  39. ::::启动IIS::::如果WEB服务器是Apache,则去掉下面一行,使用: net start Apache2  
  40. net start w3svc  
  41. exit  

本篇中自动备份、还原mySQL数据库批处理代码,都已通过测试。如果你在使用中出现问题,请认真检查。在正式使用前,请先在本地或虚拟机上通过测试,确保无误,否则带来的任何后果,本人不负责任。


http://blog.csdn.net/zm2714/article/details/7929236

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值