windows server 备份mysql数据并删除xx天前的文件

目前公司用windows server服务器比较多一些,所以经常要处理win系统下的一些问题;

上一篇是实现从ftp文件服务器拷贝文件到本地的功能;

https://blog.****.net/weixin_40337982/article/details/88948957

今天介绍的主要是备份本地mysql数据,并删除指定日期前的备份数据;

首先是从mysql把数据拉取下来,备份到本地;

@echo off
echo "备份mysql数据开始"
echo  %date:~0,4%%date:~5,2%%date:~8,2%
rem 创建目标目录当时日期,每天只执行一次,故不判断是否存在 例:20190404
md D:\mysqlDataBk\%date:~0,4%%date:~5,2%%date:~8,2%
C:/wxy/mysql/bin/mysqldump --opt -u root --password=123456 test_db > D:/mysqlDataBk/%date:~0,4%%date:~5,2%%date:~8,2%/test_db%date:~0,4%%date:~5,2%%date:~8,2%.sql
@echo on
echo "备份mysql数据结束"

md 是创建文件 可在cmd中使用     md /?     查看帮助api

C:\Users\Administrator>md /?
创建目录。

MKDIR [drive:]path
MD [drive:]path

如果命令扩展被启用,MKDIR 会如下改变:

如果需要,MKDIR 会在路径中创建中级目录。例如: 假设 \a 不
存在,那么:

    mkdir \a\b\c\d

与:

    mkdir \a
    chdir \a
    mkdir b
    chdir b
    mkdir c
    chdir c
    mkdir d

相同。如果扩展被停用,则需要键入 mkdir \a\b\c\d。

上面的命令,执行效果如下图:

windows server 备份mysql数据并删除xx天前的文件

---------------------------------------------------------------------------------------------

如果你觉得mysqldump不满足你目前的需求,可以了解一下mydumper,朋友最近写了一篇关于mydumper工具的文章:

https://blog.****.net/qq_39669058/article/details/88976859

---------------------------------------------------------------------------------------------

接下来是删除文件:

del 命令是删除文件;

rd 命令是删除目录;

rem 删除20190404下面的所有文件
del /s /q D:\redmineDataBk\20190404
rem 删除20190404目录
rd /s /q D:\redmineDataBk\20190404

del和rd都有/s和/q的指令,可以查看帮助api:

C:\Users\Administrator>del /?
删除一个或数个文件。

DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names

  names         指定一个或多个文件或者目录列表。
                通配符可用来删除多个文件。
                如果指定了一个目录,该目录中的所
                有文件都会被删除。

  /P            删除每一个文件之前提示确认。
  /F            强制删除只读文件。
  /S            删除所有子目录中的指定的文件。
  /Q            安静模式。删除全局通配符时,不要求确认
  /A            根据属性选择要删除的文件
  属性          R  只读文件                     S  系统文件
                H  隐藏文件                     A  存档文件
                I  无内容索引文件               L  重分析点
                -  表示“否”的前缀

C:\Users\Administrator>rd /?
删除一个目录。

RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path

    /S      除目录本身外,还将删除指定目录下的所有子目录和
            文件。用于删除目录树。

    /Q      安静模式,带 /S 删除目录树时不要求确认

----------------------------------------------------------------------

关于时间的计算,是个比较大的模块,我就直接把脚本贴出来:

@echo off
rem 计算指定天数之前的日期
set DaysAgo=30
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
rem 获取指定天数之前的日期
set DstDate=%DstYear%%DstMonth%%DstDay%
rem 这里的dstDate就是最终计算出来的时间,例如2019年4月4日的30天前,就是200190305
echo %DaysAgo%天的日期是%DstDate%

rem 仅在调试时放开 pause 
pause
rem 命令结束
goto :eof

rem 下面两段是计算时间的方法;
: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

如上脚本可直接复制使用;

----------------------------------------------------

最终实现备份mysql数据,并删除xx天之前的文件及目录,就是把上面三段脚本组合起来;

如下示例:

@echo off
rem 计算指定天数之前的日期
set DaysAgo=30
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
rem 获取指定天数之前的日期
set DstDate=%DstYear%%DstMonth%%DstDay%
echo %DaysAgo%天的日期是%DstDate%

rem 这里备份数据文件
echo "redmine data bk start"
echo  %date:~0,4%%date:~5,2%%date:~8,2%

rem 创建目标目录当时日期,每天只执行一次,故不判断是否存在 例:20190404
md D:\mysqlDataBk\%date:~0,4%%date:~5,2%%date:~8,2%
C:/wxy/mysql/bin/mysqldump --opt -u root --password=123456 test_db > D:/mysqlDataBk/%date:~0,4%%date:~5,2%%date:~8,2%/test_db%date:~0,4%%date:~5,2%%date:~8,2%.sql

rem 这里操作删除30天前的文件夹及文件  
del /s /q D:\\mysqlDataBk\%DstDate%
rd /s /q D:\\mysqlDataBk\%DstDate%
rem 仅在调试时放开 pause 把rem去掉
rem pause
rem 命令结束
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

脚本编写完成了。

===================================================================

接下来我们可以创建windows任务计划程序,可以理解为是windows的定时任务:

打开控制面板:

找到 系统和安全;然后 管理工具 下面的计划任务,点击,进入任务计划程序窗口;

windows server 备份mysql数据并删除xx天前的文件

 

然后开始创建基本任务:

windows server 备份mysql数据并删除xx天前的文件

名称输入你的脚本名称就可以了;描述就是做什么。然后下一步;

windows server 备份mysql数据并删除xx天前的文件

这里视需求定义,也可以先下一步,回头任务创建好了,再配置执行频率;

windows server 备份mysql数据并删除xx天前的文件

这里也一样,直接下一步;

 windows server 备份mysql数据并删除xx天前的文件

下一步;

windows server 备份mysql数据并删除xx天前的文件

这里选择你的执行脚本文件,不支持把脚本放到桌面;我这里是示例;

windows server 备份mysql数据并删除xx天前的文件

 之后再下一步,完成就可以了;

windows server 备份mysql数据并删除xx天前的文件

 到这里一个windows执行计划就创建好了。

这里能看到我们刚刚创建的任务计划程序,右键—>属性,可以配置执行频率和周期;

windows server 备份mysql数据并删除xx天前的文件

 这里要打勾,使用最高权限运行,否则会出现拒绝访问的问题;

windows server 备份mysql数据并删除xx天前的文件

在触发器中,编辑脚本的执行频率;

windows server 备份mysql数据并删除xx天前的文件

之后点击确定就可以了;

至此,windows环境的任务计划程序就已经配置好了;

虽然比较low,但是挺实用的;

end;