1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MySQL 数据库定时自动备份

MySQL 数据库定时自动备份

时间:2024-01-15 12:06:34

相关推荐

MySQL 数据库定时自动备份

每天定时备份 SQL 到磁盘,通过一个简单的 Java Timer + Task 完成。

首先是配置类,你可以通过 Spring 注入到你系统。

/*** 备份的配置类* * @author Frank Cheung<sp42@>**/public class MysqlAutoBackupConfig {private Integer hours; // 每天备份的时间private Integer minute;private Integer second;private String ip;private String userName;private String psw;public Integer getHours() {return hours;}public void setHours(Integer hours) {this.hours = hours;}public Integer getMinute() {return minute;}public void setMinute(Integer minute) {this.minute = minute;}public Integer getSecond() {return second;}public void setSecond(Integer second) {this.second = second;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPsw() {return psw;}public void setPsw(String psw) {this.psw = psw;}public String getDatabaseName() {return databaseName;}public void setDatabaseName(String databaseName) {this.databaseName = databaseName;}private String databaseName;}

定时器备份也很简单,源码如下。

import java.io.IOException;import java.io.InputStream;import java.util.Calendar;import java.util.Date;import java.util.Timer;import java.util.TimerTask;import org.springframework.beans.factory.annotation.Autowired;import com.ajaxjs.Version;import com.ajaxjs.util.DateUtil;import com.ajaxjs.util.io.FileHelper;import com.ajaxjs.util.io.StreamHelper;/*** MySQL 数据库定时自动备份,仅支持 CentOS*/public class MysqlAutoBackup extends TimerTask {@Autowiredprivate MysqlAutoBackupConfig cfg;// 时间间隔 一天时间private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;public void init() {if (Version.isDebug)return;Calendar calendar = Calendar.getInstance();/*** 定制每日2:00执行方法 ***/calendar.set(Calendar.HOUR_OF_DAY, cfg.getHours());calendar.set(Calendar.MINUTE, cfg.getMinute());calendar.set(Calendar.SECOND, cfg.getSecond());Date date = calendar.getTime(); // 第一次执行定时任务的时间/** 如果第一次执行定时任务的时间 小于 当前的时间。 此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。 如果不加一天,任务会立即执行。*/if (date.before(new Date()))date = addDay(date, 1);new Timer().schedule(new MysqlAutoBackup(), date, PERIOD_DAY);// 安排指定的任务在指定的时间开始进行重复的固定延迟执行。}/*** 增加或减少天数** @param date* @param num* @return*/private static Date addDay(Date date, int num) {Calendar start = Calendar.getInstance();start.setTime(date);start.add(Calendar.DAY_OF_MONTH, num);return start.getTime();}@Overridepublic void run() {exec(cfg.getIp(), cfg.getUserName(), cfg.getPsw(), cfg.getDatabaseName());}/*** 传统方式备份数据库。需要 mysqldump 命令行。** @param ip* @param userName* @param psw* @param databaseName*/public static void exec(String ip, String userName, String psw, String databaseName) {String CMD = "mysqldump -h %s -u %s -p %s --set-charset=UTF8 %s";try {Process process = Runtime.getRuntime().exec(String.format(CMD, ip, userName, psw, databaseName));try (InputStream in = process.getInputStream()) {String sql = StreamHelper.byteStream2string(in);FileHelper.saveText("c:/temp/" + DateUtil.now("yyyy-MM-dd_HH-mm-ss") + ".sql", sql);}} catch (IOException e) {e.printStackTrace();}}}

该方式备份数据库缺点如下:

须在 CentOS 系统须要 Web App Server 与 MySQL 同一个服务器,不能分开

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。