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。
上面的命令,执行效果如下图:
---------------------------------------------------------------------------------------------
如果你觉得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执行计划就创建好了。
这里能看到我们刚刚创建的任务计划程序,右键—>属性,可以配置执行频率和周期;
这里要打勾,使用最高权限运行,否则会出现拒绝访问的问题;
在触发器中,编辑脚本的执行频率;
之后点击确定就可以了;
至此,windows环境的任务计划程序就已经配置好了;
虽然比较low,但是挺实用的;
end;