MySQL 数据库定时自动备份
Posted sp42a
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 数据库定时自动备份相关的知识,希望对你有一定的参考价值。
每天定时备份 SQL 到磁盘,通过一个简单的 Java Timer + Task 完成。
首先是配置类,你可以通过 Spring 注入到你系统。
/**
* 备份的配置类
*
* @author Frank Cheung<sp42@qq.com>
*
*/
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
@Autowired
private 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();
@Override
public 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 同一个服务器,不能分开
以上是关于MySQL 数据库定时自动备份的主要内容,如果未能解决你的问题,请参考以下文章