原文:Window系统的mysql数据库定时备份 – Stars-One的杂货小窝
最近老大提到了数据库备份的功能,由于服务器是window系统的,所以研究了下备份的方案,特此记录
主要是实现每天定时备份功能,如果还要搞容灾的话,就得对mysql数据库进行主从配置了
cmd命令
核心的cmd命令如下所示
"D:\app\dev\MySQL Server 5.5\bin\mysqldump.exe" -uroot -proot --opt --default-character-set=utf8 -e --triggers -R --hex-blob --flush-logs -x db_package >D:/temp/db_backup/db_package20220.sql
命令的更多使用可以参考MySQL命令行导入导出工具–mysqldump命令详解
之后的bat命令也是在此基础上进行改造
实现
bat命令:
echo 取日期、时间变量值set yy=%date:~0,4%set mm=%date:~5,2%set dd=%date:~8,2%if /i %time:~0,2% lss 10 set hh=0%time:~1,1%if /i %time:~0,2% geq 10 set hh=%time:~0,2%set mn=%time:~3,2%set ss=%time:~6,2%set date=%yy%%mm%%dd%set time=%hh%%mn%%ss%%这里不要具体时分数据,要的话可以追加time%set filename=%date%%赋值等号两边不能有空格%set mysqldumpPath="D:\app\dev\MySQL Server 5.5\bin\mysqldump.exe"set dbName=db_packageset dbUser=rootset dbPwd=rootset outpurDir=D:/temp/db_backup/set outputFileName=%outpurDir%%dbName%_%filename%.sqlecho %outputFileName%%mysqldumpPath% -u%dbUser% -p%dbPwd% --opt --default-character-set=utf8 -e --triggers -R --hex-blob --flush-logs -x %dbName% > %outputFileName%
将上面的内容复制到bat文件里,然后将上面的5个变量进行修改:
mysqldumpPath
你本地mysql路径dbName
需要备份的数据库dbUser
数据库用户名dbPwd
数据库密码outpurDir
备份文件输出路径
之后如果想要定时,有以下两种方法:
- Spring Boot项目中加入定时任务去执行bat文件
- 使用window的任务计划功能
Spring Boot的定时任务
目标:每天凌晨0:00备份一次数据库,最大保存30天数据,超过的自动删除最久的那一份数据
首先,我们要知道java应该如何执行bat文件,通过以下代码执行bat文件
Runtime.getRuntime().exec("cmd /c run.bat")
主要区别:
#转至https://blog.csdn.net/liuyukuan/article/details/5974517cmd /c command 执行完命令后关闭命令窗口。 cmd /k command 执行完命令后不关闭命令窗口。 cmd /c start command 会打开一个新窗口后执行命令,原窗口会关闭。 cmd /k start command 会打开一个新窗口后执行命令,原窗口不会关闭。
定时的话,使用Spring Boot里的定时任务即可
1.Application类中标明注解@EnableScheduling
,可开启定时任务
@SpringBootApplication@EnableSchedulingpublic class BusinessApplication {}
2.创建你的定时任务类:
/** * @author starsone * @date 2022/12/09 11:52 */@Componentpublic class DbBackupService { /** * 每天凌晨0:00触发 */ @Scheduled(cron="0 0 0 * * ?") private void scheduled3(){ File file = new File(dbBkFile); if (file.exists()) { File[] files = file.getParentFile().listFiles(); if (files.length > 30) { //文件超过30个,删最旧的那个文件 File oldFile = Arrays.stream(files).sorted((o1, o2) -> { Long l = o1.lastModified(); Long l2 = o2.lastModified(); return l.compareTo(l2); }).findFirst().get(); oldFile.delete(); } System.out.println("-------------开始数据库备份------------"); try { Runtime.getRuntime().exec("cmd /c " + dbBkFile); } catch (IOException e) { System.out.println("------------备份失败,出现异常----------"); e.printStackTrace(); } } else { System.out.println("------------备份失败,bat文件未找到----------"); } }}
cron表达式常用示例:
0 0 12 * * ?
每天中午12点触发0 15 10 ? * *
每天上午10:15触发0/2 * * * * ?
表示每2秒 执行任务0 0/2 * * * ?
表示每2分钟 执行任务0 0 12 ? * WED
表示每个星期三中午12点
–0 15 10 ? * MON-FRI
表示周一到周五每天上午10:15执行作业0 15 10 ? 6L 2002-2006
表示2002-2006年的每个月的最后一个星期五上午10:15执行
window系统任务计划
具体看参考12、windows定时备份数据库 – 云起时。 – 博客园
参考
- MySQL命令行导入导出工具–mysqldump命令详解
- windows下mysql每天定时备份数据库几种方法 – Rukh – 博客园
- 12、windows定时备份数据库 – 云起时。 – 博客园
- java程序执行cmd命令出现权限问题场景相应解决方案_小叶要吃丶肉的博客-CSDN博客
提问之前,请先看提问须知点击右侧图标发起提问或者加入QQ群一起学习TornadoFx学习交流群:1071184701<!––>