java代码定时备份mysql数据库及注意事项基于springboot
一、需求:
定时备份数据库数据
二、分析:
1. 定时任务
2. 备份数据库表结构和数据
三、实现:
1. pom 文件:
<?xml version="1.0" encoding="UTF-8"?> 4.0.0 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE com.kevin backupdatabase 1.0-SNAPSHOT jar 1.8 mysql mysql-connector-java 8.0.15 com.alibaba druid 1.1.20 org.springframework.boot spring-boot-starter 2.2.4.RELEASE org.awaitility awaitility 3.1.2 test org.springframework.boot spring-boot-maven-plugin
2. application.yml 文件
1
2
3
4
5
6
7
8
9
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.100.120:3306/test01?useSSL=false&autoReconnect=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: kevin02
password: Kevin123!
sqlbackup:
path: /export/servers/db_backup/
3. BackUpDataBaseManager —— 具体操作数据库备份
package com.kevin.manager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.File; import java.io.IOException; /** * @author dell * @version: task.java v 1.0, 2020年01月18日 12:47 * @Description 数据库操作 **/ @Service public class BackUpDataBaseManager { private static final Logger log = LoggerFactory.getLogger(BackUpDataBaseManager.class); @Value("${spring.datasource.driver-class-name}") private String driverClassName; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String userName; @Value("${spring.datasource.password}") private String password; @Value("${sqlbackup.path}") private String sqlPath; /** * 获取数据库名 */ public String getDataBaseName() { return url.substring(url.indexOf("3306"), url.indexOf("?")).replaceAll("/", "").replaceAll("3306", ""); } /** * 获取主机地址 */ private String getHost() { return url.substring(url.indexOf("mysql"), url.indexOf("3306")).replace(":", "").replace("//", "").replace("mysql", ""); } /** * 导出 sql 并返回相关信息 */ public void exportSql(String time) { // 指定导出的 sql 存放的文件夹 File saveFile = new File(sqlPath); if (!saveFile.exists()) { saveFile.mkdirs(); } String host = getHost(); String dataBaseName = getDataBaseName(); String fileName = time + "_" + "cloudpm.sql"; StringBuilder sb = new StringBuilder(); // 拼接备份命令 sb.append("mysqldump").append(" --opt").append(" -h ").append(host).append(" --user=").append(userName).append(" --password=").append(password); sb.append(" --result-file=").append(sqlPath + fileName).append(" --default-character-set=utf8 ").append(dataBaseName); try { Process exec = Runtime.getRuntime().exec(sb.toString()); if (exec.waitFor() == 0) { log.info("数据库备份成功,保存路径:" + sqlPath); } else { System.out.println("process.waitFor()=" + exec.waitFor()); } } catch (IOException e) { log.error("备份 数据库 出现 IO异常 ", e); } catch (InterruptedException e) { log.error("备份 数据库 出现 线程中断异常 ", e); } catch (Exception e) { log.error("备份 数据库 出现 其他异常 ", e); } } }
3. 定时任务
package com.kevin.schedule; import com.kevin.manager.BackUpDataBaseManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; /** * @author dell * @version: ScheduledTasks.java v 1.0, 2020年02月11日 11:38 * @Description 定时任务 **/ @Component public class ScheduledTasks { private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSS"); @Autowired private BackUpDataBaseManager backUpDataBaseManager; /** * 每天下午4点50分30秒执行 */ @Scheduled(cron = "30 50 16 * * ?") public void reportCurrentTime() { String format = dateFormat.format(System.currentTimeMillis()); log.info("The time is now {}", format); backUpDataBaseManager.exportSql(format); } }
4. 启动类
package com.kevin; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; /** * @author dell * @version: TaskAppliacation.java v 1.0, 2020年02月11日 12:12 * @Description **/ @SpringBootApplication @EnableScheduling public class TaskApplication { public static void main(String[] args) { SpringApplication.run(TaskApplication.class); } }
5. 执行:
启动程序:
执行结果(文件名 _ 前面为 时间戳):
sz 命令下载
默认下载到 下载目录
文件内容:
思路:使用
mysqldump --opt -h hostname --user=username --password=password --result-file=/dir/filename --default-character-set=utf8 dbname
命令
hostname :数据库所在主机
username:数据库连接用户名
password:数据库连接密码
result-file:结果文件。指定目录+文件名
dbname:需要导出的数据库名
如:
mysqldump --opt -h 192.168.100.120 --user=kevin --password=Kevin123! --result-file=/export/servers/db_backup/2020021216503001_cloudpm.sql --default-character-set=utf8 test01
注意事项:
网上有说 加个 锁表的参数 --lock-all-tables=true
但报 无 reload 权限,直接拿 语句执行,也报相同的问题:
mysqldump: Couldn"t execute "FLUSH TABLES": Access denied; you need (at leas……)
通过 grant 进行授权也不行
直到看到
然后 去掉了 --lock-all-tables=true
就可以执行成功了
9月,新土豆正当季,便宜营养,6道做法分享,学会有空做给家人吃9月,新土豆正当季,便宜营养,6道做法分享,学会有空做给家人吃秋高气爽,正是粮食蔬菜大丰收的季节,最近各种卖秋菜的车渐渐多了起来,又到了一年一度囤秋菜的季节。在北方早些时候,物质条
做辣椒酱,只放盐是外行,需多加2味料,香辣入味,久放不坏头条创作挑战赛莫愁厨路无知己,谁人不识小面姨。大家好,我是小面姨。今天小面姨给大家分享一道辣椒酱的做法。最近这几天,已经是深秋时节,各种各样的秋季蔬菜已经到了即将退场的时刻。如果想
豆角不要炒着吃,加1勺玉米面,比肉还香的美味,吃一次念念不忘豆角不要炒着吃,加1勺玉米面,比肉还香的美味,吃一次念念不忘。豆角鲜嫩好吃,价格也很便宜,现在每家每户餐桌上最常见的菜就是豆角。豆角好吃,营养高,含有丰富的蛋白质,维生素,和少量的
国内4大光瓶酒,便宜好喝,却因酒瓶简陋被嫌弃,有谁都喝过在白酒圈,有人说喝光瓶酒的人是懂酒,因为光瓶酒价格便宜,酒质参差不齐,但是能从这一堆品牌中选到性价比高的,那是真酒腻子。也有人会贬低喝光瓶酒的,说光瓶酒价格便宜,假酒成堆,能喝光瓶
江苏70岁大爷,晒满墙茅台引发热议,酒友您还缺儿子吗?有钱人的世界真奢靡!茅台随便喝,是多少酒友可望不可及的梦,但在豪门的眼中,茅台可能都不值得一品。这不,前两天江苏一位70岁大爷分享日常,不小心拍到家中一整墙的茅台,此图一出,简直惊
日本媒体曝出猛料!福原爱遭家长投诉,或被解聘,儿子也将被带走8月27日,许久没有在公共场合露面的福原爱,再次被推上风口浪尖,成为国内媒体球迷关注的焦点!此前,福原爱被媒体球迷关注基本都与横滨男有关,但这一次与以往不同,福原爱成为舆论的焦点,
戒指戴在左手上有什么意义?戴戒指是有讲究的。按西方的传统习惯来说,左手显示的是上帝赐给你的运气,因此,戒指通常戴在左手上。现在比较流行的戴法是食指想结婚,表示未婚中指已经在恋爱中无名指表示已经订婚或结婚小指
野餐树(拼音版)儿童美德故事本文适合有一年级和二年级识词基础的小学生自主阅读朗读。字词句段野餐(ycn)树从前,在一个国家里有一片大树林(dshln),小鸟在树枝上唱歌(chngg),小鹿在草地(cod)上散
好玩儿(拼音版)儿童品质故事好玩儿(howner)有个小孩子,他可喜欢玩儿了,一早醒来(xngli)就想玩儿,想我今天上哪儿去玩呀?晚上钻进(zunjn)被窝还想玩儿,想明天我玩点什么(shnme)好呀?这样
假腿的熊(拼音版)传奇童话故事本文适合有一年级和二年级识词基础的小学生自主阅读朗读。字词句段假腿的熊从前有个老头儿,有个老太婆。他们种下了萝卜(lubo)。熊老是来偷他们的萝卜(lubo)。老头儿走去看看,只见
猴子和鹿(拼音版)儿童美德故事本文适合有一年级和二年级识词基础的小学生阅读朗读。猴子和鹿有一天,猴子碰见(pnjin)了梅花鹿。他们俩呀,都说自己的本领大,说着,说着,吵起架来了。最后决定来个比赛(bsi)。他