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

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

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

备份数据库

@ECHO OFF
set path=%SystemRoot%\system32;D:\PHP\MySql\MySQL Server 5.1\bin;C:\Program Files\WinRAR
set mktime=%date:~0,10%

::设置数据库名称(两个数据库,则下面的for中的tokens值为1,2。如果有三个数据库,则tokens值为:1,2,3。数据库依次为%%a,%%b,%%c....按英文字母顺序排列)
::这里备份三个数据库:DB_A、DB_B、DB_C,数据库间用半角逗号分隔
SET dbname=DB_A,DB_B,DB_C

::数据库管理员权限及密码
SET dbuser=root
SET dbpasswd=123456

::mySQL所在目录
SET mysqldir=D:\PHP\MySql\MySQL Server 5.1

::备份gz文件所在目录
SET gz_backupdir=D:\mySQL_data_bak\sql_gz_bak
if not exist %gz_backupdir% md %gz_backupdir%

::备份file文件所在目录
SET file_backupdir=D:\mySQL_data_bak\file_bak
if not exist %file_backupdir% md %file_backupdir%

::::停止WWW网页WEB服务::::或者停止Apache2 命令:net stop Apache2
net stop w3svc

::::延时15秒
ping -n 15 127.0.1>nul

::::开始备份mySQL数据库::::
@ECHO Beginning backup of %dbname%...
for /f "tokens=1,2,3 delims=," %%a in ("%dbname%") do (
  if not exist %gz_backupdir%\%%a md %gz_backupdir%\%%a
  if not exist %gz_backupdir%\%%b md %gz_backupdir%\%%b
  if not exist %gz_backupdir%\%%c md %gz_backupdir%\%%c
  "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%a | gzip > %gz_backupdir%\%%a\%mktime%.sql.gz
  "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%b | gzip > %gz_backupdir%\%%b\%mktime%.sql.gz
  "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%c | gzip > %gz_backupdir%\%%c\%mktime%.sql.gz
)

::停止mySQL服务,以便拷备文件
net stop MySQL

::延时10秒
ping -n 10 127.0.1>nul

::开始将要备份的文件打包到仓库
d:
cd "%mysqldir%\data"
for /f "tokens=1,2,3 delims=," %%a in ("%dbname%") do (
  if not exist %file_backupdir%\%%a md %file_backupdir%\%%a
  if not exist %file_backupdir%\%%b md %file_backupdir%\%%b
  if not exist %file_backupdir%\%%c md %file_backupdir%\%%c
  @rar a %file_backupdir%\%%a\%mktime%.rar %%a
  @rar a %file_backupdir%\%%b\%mktime%.rar %%b
  @rar a %file_backupdir%\%%c\%mktime%.rar %%c
)

::::启动MySQL::::
net start MySQL

::::启动IIS::::如果WEB服务器是Apache,则去掉下面一行,使用: net start Apache2
net start w3svc

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个,那么你要改动上面的代码。

备份一个数据库的情况

省略...
SET dbname=DB_A
省略...
::::开始备份mySQL数据库::::
@ECHO Beginning backup of %dbname%...
for /f "tokens=1 delims=," %%a in ("%dbname%") do (
  if not exist %gz_backupdir%\%%a md %gz_backupdir%\%%a
  "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%a | gzip > %gz_backupdir%\%%a\%mktime%.sql.gz
)
省略...
for /f "tokens=1 delims=," %%a in ("%dbname%") do (
  if not exist %file_backupdir%\%%a md %file_backupdir%\%%a
  @rar a %file_backupdir%\%%a\%mktime%.rar %%a
)
省略...

备份两个数据库的情况

省略...
SET dbname=DB_A,DB_B
省略...
::::开始备份mySQL数据库::::
@ECHO Beginning backup of %dbname%...
for /f "tokens=1,2 delims=," %%a in ("%dbname%") do (
  if not exist %gz_backupdir%\%%a md %gz_backupdir%\%%a
  if not exist %gz_backupdir%\%%b md %gz_backupdir%\%%b
  "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%a | gzip > %gz_backupdir%\%%a\%mktime%.sql.gz
  "%mysqldir%\bin\mysqldump" -u %dbuser% -p%dbpasswd% --default-character-set=utf8 --opt %%b | gzip > %gz_backupdir%\%%b\%mktime%.sql.gz
)
省略...
for /f "tokens=1,2 delims=," %%a in ("%dbname%") do (
  if not exist %file_backupdir%\%%a md %file_backupdir%\%%a
  if not exist %file_backupdir%\%%b md %file_backupdir%\%%b
  @rar a %file_backupdir%\%%a\%mktime%.rar %%a
  @rar a %file_backupdir%\%%b\%mktime%.rar %%b
)
省略...

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

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

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

还原数据库

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

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

@ECHO OFF
::更改数据库名称
SET dbname=DB_A

::更改欲还原的数据库备份文件
SET filename=xxxx-xx-xx.sql.gz

set path=%SystemRoot%\system32;D:\PHP\MySql\MySQL Server 5.1\bin

::::停止WWW网页WEB服务::::或者停止Apache2 命令:net stop Apache2
net stop w3svc

::::延时15秒
ping -n 15 127.0.1>nul

::数据库管理员权限及密码
SET dbuser=root
SET dbpasswd=123456

::要还原的gzip文件路径
SET filename=D:\mySQL_data_bak\sql_gz_bak\%dbname%\%filename%

@ECHO Beginning restore of %dbname%...
gunzip < %filename% | mysql -u %dbuser% -p%dbpasswd% %dbname%

::::启动IIS::::如果WEB服务器是Apache,则去掉下面一行,使用: net start Apache2
net start w3svc

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

@ECHO OFF
set path=%SystemRoot%\system32;D:\PHP\MySql\MySQL Server 5.1\bin;C:\Program Files\WinRAR
set mktime=%date:~0,10%

::设置数据库名称
SET dbname=DB_A

::设置欲还原的压缩文件包文件名
SET filename=xxxx-xx-xx.rar

::mySQL所在目录
SET mysqldir=D:\PHP\MySql\MySQL Server 5.1

::备份的file文件所在目录
SET file_backupdir=D:\mySQL_data_bak\file_bak\%dbname%

if not exist "%mysqldir%\data\%dbname%" md "%mysqldir%\data\%dbname%"

::::停止WWW网页WEB服务::::或者停止Apache2 命令:net stop Apache2
net stop w3svc

::::延时15秒
ping -n 15 127.0.1>nul

::停止mySQL服务,以便拷备文件
net stop MySQL

::延时10秒
ping -n 10 127.0.1>nul

::开始将要备份的文件打包到仓库
cd /d "%mysqldir%\data"
:: e表示解压 -o+ 表示替换原有文件
rar e -o+ %file_backupdir%\%filename% "%mysqldir%\data\%dbname%"

::::启动MySQL::::
net start MySQL

::::启动IIS::::如果WEB服务器是Apache,则去掉下面一行,使用: net start Apache2
net start w3svc
exit

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

你可能感兴趣的:(mysql)