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 数据库定时自动备份的主要内容,如果未能解决你的问题,请参考以下文章

linux crontab mysql定时自动备份

mysql自动备份

怎么定时自动备份mysql数据表

MySQL 数据库定时自动备份

斑马斑马-04-白云之上-mysql定时自动备份实现

基于 mysql 镜像的定时自动备份数据和清除过期备份