最近几天在研究数据库备份的问题,刚开始直接用mysql视图工具Navicat for MySQL备份,发现很简单的点几下OK了。

但是想想不能随便给客户安装mysql视图工具,开始查找其它方法。

百度后发现很多是在使用批处理文件脚本,在计划任务里设定脚本执行时间,达到了对数据可的备份。

但是这些脚本执行的稳定性及数据是否会丢失,数据量大时是否影响执行效率这些问题没有深入研究。

当然本人菜鸟而已,基本没怎么接触脚本语言,甚至刚开始时如何创建mysql的脚本都不知从何下手。

最开始使用的方法:

1.关闭mysql服务

2.复制该数据库文件夹到以当日时间为名称的指定文件夹下

3.压缩该文件

4.删除压缩前文件

5.启动mysql服务

代码如下:

net stop mysql

xcopy "C:\Program Files\MySQL\MySQL Server 5.1\Data\msinvoicing" "D:\db_backup\%date:~0,10%\/msinvoicing\"

c:\progra~1\winrar\winrar a -k -r -s D:\db_backup\%date:~0,10%\msinvoicing.rar D:\db_backup\%date:~0,10%\
rd D:\db_backup\%date:~0,10%\msinvoicing /S /Q 
net start mysql

接下来我需要对7天前的备份进行删除,然后要取已得7天前日期命名的文件夹进行删除.

在网上查到了一个取N天前日期的一个脚本(牛人写的),同时又查到了mysql的mysqldump方法.

最后采用了我认为不是很好的办法,使用mysql的mysqldump的方法(不能关闭mysql服务,这样在备份时数据库数据有修改是否就备份不上了...计划时间弄到凌晨?但是人家凌晨修改呢...).

由于找到的删除脚本不能删除文件夹下的文件夹,最终决定直接将mysqldump备份出的.sql文件命名为当天日期,这样就能直接删除.

代码如下:

1.创建txt文件,直接将后缀名改为.bat文件保存。

2.右键编辑.bat文件,写入:

@echo off
rem 计算指定天数之前的日期
set DaysAgo=7
rem 假设系统日期的格式为yyyy-mm-dd
call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
set /a PassDays-=%DaysAgo%
call :DaysToDate %PassDays% DstYear DstMonth DstDay
set DstDate=%DstYear%-%DstMonth%-%DstDay%
echo %DaysAgo%天的日期是%DstDate%

rem 进入到mysql安装目录下得bin文件夹
cd C:\Program Files\MySQL\MySQL Server 5.1\bin
rem 使用mysqldump 本机 账号    密码  数据库名     盘符:/备份到哪个文件夹/命名为
mysqldump -h localhost -uroot -p123 -R msinvoicing >D:\db_backup\%date:~0,10%.sql

rem 压缩文件
c:\progra~1\winrar\winrar a -k -r -s -ep1 D:\db_backup\%date:~0,10%.rar D:\db_backup\%date:~0,10%.sql
rem 生成压缩文件后删除源文件
del D:\db_backup\%date:~0,10%.sql /S /Q 

rem 删除前一天的备份
del D:\db_backup\%DstDate%.rar /S /Q 

rem 按任意键使用 pause
goto :eof

:DateToDays %yy% %mm% %dd% days
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %4=%j%&goto :EOF

:DaysToDate %days% yy mm dd
setlocal ENABLEEXTENSIONS
set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF

以上代码为我最终修改后的备份代码,后来发现删除前7天的备份还是会有问题,因为服务器如果停用一天或者计划任务某天因为种种原因没有执行,那么这一天的备份就无法删除.

后来又在网上查到了一个方法,主要是来删除修改日期为7天前的文件.

创建txt文件,修改后缀名为vbs.

代码如下:

set fso=CreateObject("Scripting.FileSystemObject")
set ws=CreateObject("wscript.shell")
set fd=fso.getfolder("D:\db_backup")
for each f in fd.files
if datediff("d",f.Datecreated,date)>7 then
f.delete(true)
end if
next

总结:这是自己东拼西凑的备份方法,肯定还有更好的备份方式,但愿能让我见识下