【批处理】MySQL自动备份+自动压缩+自动ftp上传+计划任务
一般情况服务器用Linux相对较多些,那么标题中描述的动作,用shell+crontab就可以轻松愉快的搞定。当服务器用的是windows,那么该如何编写这个动作呢。按照正常的编写思维我们逐步实现。
1:命令行逻辑备份MySQL数据库
1 2 |
## 这里涉及到生成备份文件的路径及文件名称,所以,在批处理的开始部分要设置相关的变量 mysqldump --opt -Q -uroot -proot --default-character-set=utf8 dm > "%D%\%Ymd%.sql" |
2:定义变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
## 定义变量Ymd,这个是一个时间标识,比如:20170808 set Ymd="%date:~,4%%date:~5,2%%date:~8,2%" ## 定义一个变量D,赋值为“一” set D=一 ## 判断“一”这个目录是否存在,如果不存在就创建。注意,在bat中,md可以创建目录,mkdir也可以 if not exist %D% ( mkdir %D%>nul ) ## 再次判断“一”这个目录是否存在,如果还不存在,就说明之前创建失败了,退出这个批处理程序 if not exist %D% ( echo Backup path: %D% not exists, create dir failed. goto exit ) ## 执行MySQL备份动作,将备份的文件命名为如20170808.sql,存放在当前路径下的“一”目录下 mysqldump --opt -Q -uroot -proot --default-character-set=utf8 dm > "%D%\%Ymd%.sql" |
3:设置环境变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
## 设置环境变量,在windows下,path为环境变量,在这里显示的指定了MySQL的bin目录,及引用了windows默认的环境变量,这样,我们经常用的命令就可以直接执行了。 ## 其实直接利用windows的环境变量就行,只不过,把具体的变量描述清楚会更可靠一些 set path=C:\Program Files\MySQL\MySQL Server 5.5\bin\;%path% set Ymd="%date:~,4%%date:~5,2%%date:~8,2%" set D=一 if not exist %D% ( mkdir %D%>nul ) if not exist %D% ( echo Backup path: %D% not exists, create dir failed. goto exit ) mysqldump --opt -Q -uroot -proot --default-character-set=utf8 dm > "%D%\%Ymd%.sql" |
4:设置备份路径
要求,保留六份儿备份,第七天删除最早备份的那个备份文件,那么我们就需要将文件分别放在不同的位置来自动实现删除的动作,避免出现空间占满的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
set path=C:\Program Files\MySQL\MySQL Server 5.5\bin\;%path% set Ymd="%date:~,4%%date:~5,2%%date:~8,2%" ## 清空文件夹“六”的内容,然后将其删除,再逐一修改文件夹的名字,每次新的备份都是放在“一”的目录下 del /Q 六 rd 六 rename 五 六 rename 四 五 rename 三 四 rename 二 三 rename 一 二 set D=一 if not exist %D% ( mkdir %D%>nul ) if not exist %D% ( echo Backup path: %D% not exists, create dir failed. goto exit ) mysqldump --opt -Q -uroot -proot --default-character-set=utf8 dm > "%D%\%Ymd%.sql" |
5:压缩
我们知道数据文件压缩比是非常大的7-8倍左右,所以在上传之前要先压缩一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
set path=C:\Program Files\MySQL\MySQL Server 5.5\bin\;%path% set Ymd="%date:~,4%%date:~5,2%%date:~8,2%" del /Q 六 rd 六 rename 五 六 rename 四 五 rename 三 四 rename 二 三 rename 一 二 set D=一 if not exist %D% ( mkdir %D%>nul ) if not exist %D% ( echo Backup path: %D% not exists, create dir failed. goto exit ) mysqldump --opt -Q -uroot -proot --default-character-set=utf8 dm > "%D%\%Ymd%.sql" ## 切换目录到刚刚创建的“一”下,用zip压缩,一般情况zip更通用些 cd /d %D% zip -q "%Ymd%.zip" "%Ymd%.sql" |
6:ftp上传
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
set path=C:\Program Files\MySQL\MySQL Server 5.5\bin\;%path% set Ymd="%date:~,4%%date:~5,2%%date:~8,2%" del /Q 六 rd 六 rename 五 六 rename 四 五 rename 三 四 rename 二 三 rename 一 二 set D=一 if not exist %D% ( mkdir %D%>nul ) if not exist %D% ( echo Backup path: %D% not exists, create dir failed. goto exit ) mysqldump --opt -Q -uroot -proot --default-character-set=utf8 dm > "%D%\%Ymd%.sql" cd /d %D% zip -q "%Ymd%.zip" "%Ymd%.sql" ## echo是在屏幕打印的意思,“>”是重定向的意思,也就是说,将echo后面的字符串写入ftp.up的文件中 echo open 192.168.31.60 >ftp.up echo root >>ftp.up echo root >>ftp.up echo put "%D%\%Ymd%.rar" >>ftp.up echo bye >>ftp.up ## 然后通过ftp -s 的方式调用刚刚创建的ftp.up这个配置文件,执行具体的上传动作 FTP -s:ftp.up |
7:批处理文件的收尾工作
将下面文件保存到一个.bat的文件中就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
## 在批处理文件的开头部分,加上一句@echo off,这句话什么意思呢?echo off的意思是,批处理文件中所有可执行命令执行后的返回信息全部不显示,加上一个@的意思是,自己本身返回的信息也不显示 @echo off set path=C:\Program Files\MySQL\MySQL Server 5.5\bin\;%path% set Ymd="%date:~,4%%date:~5,2%%date:~8,2%" # 这句话的意思是下面所删除的目录,创建的目录都在批处理所在的当前目录下完成,如果不加上这句话,那么在利用windows“定时任务”时,备份的路径则可能在C盘的某路径下了。 cd /d %~dp0 del /Q 六 rd 六 rename 五 六 rename 四 五 rename 三 四 rename 二 三 rename 一 二 set D=一 if not exist %D% ( mkdir %D%>nul ) if not exist %D% ( echo Backup path: %D% not exists, create dir failed. goto exit ) mysqldump --opt -Q -uroot -proot --default-character-set=utf8 dm > "%D%\%Ymd%.sql" cd /d %D% zip -q "%Ymd%.zip" "%Ymd%.sql" echo open 192.168.31.60 >ftp.up echo root >>ftp.up echo root >>ftp.up echo put "%D%\%Ymd%.rar" >>ftp.up echo bye >>ftp.up FTP -s:ftp.up |
8:windows计划任务,自动调度
8.1:图形化:控制面板-管理工具-任务计划程序
8.2:命令行
1 2 3 4 5 6 7 |
## 创建每20分钟执行一次的计划任务 ## 在cmd命令行下执行下面命令 schtasks /create /sc minute /mo 20 /tn "p_name" /tr D:\temp\backup-mysql.bat ## p_name:计划任务的名字,自己定义 ## D:\temp\backup-mysql.bat,批处理的绝对路径 |
其它示例(仅是示例,如果有这方面的需求,还请仔细测试):
1 2 3 4 5 6 7 8 |
## 从2017年8月1日起,每5小时运行一次 schtasks /create /sc hourly /mo 5 /sd 08/01/2017 /tn "p_name" /tr D:\temp\backup-mysql.bat ## 从创建时间开始,每天8点执行指定程序,直至2017年年底,没有制定mo这个时间粒度参数,默认就是1 schtasks /create /tn "p_name" /tr D:\temp\backup-mysql.bat /sc daily /st 08:00:00 /ed 12/31/2017 ## 每天两8点运行一次,直至年底 schtasks /create /tn "p_name" /tr D:\temp\backup-mysql.bat /sc daily /mo 2 /st 08:00:00 /ed 12/31/2017 |