1. 程式人生 > >Java實現Mysql的定時備份與還原

Java實現Mysql的定時備份與還原

一、資料庫的定時備份

備份命令

Mysql的備份指令:

1. 指定資料庫:

mysqldump -h localhost -uroot -proot  tuser>d:\user_2017-12-25_15-42-10.sql 

tuser:資料庫名
user_2017-12-25_15-42-10.sql:檔名

2. 指定資料庫中的多個表:

mysqldump -h localhost -uroot -proot --databases tuser --tables t_user t_user2>d:\user_2017-12-25_15-42-two.sql 

在 –tables 之後加上所需備份的表名

定時(Spring-Task)

瞭解了mysql的備份命令,那麼如何實現定時呢?
這裡採用Spring的定時任務來實現,基於註解的方式。

主要有兩點注意:

1. Spring.xml中開啟定時任務註解的配置:
 <!--開啟定時任務註解-->
<task:annotation-driven />

注意在頭部引入task的標籤及描述

     xmlns:task="http://www.springframework.org/schema/task"
     http://www.springframework.org/schema/task
     http://www.springframework
.org/schema/task/spring-task-4.0.xsd
2.在相應的方法中添加註解@Scheduled
    @Scheduled(cron="0/5 * *  * * ? ")   //每5秒執行一次
    public void task1(){
        System.out.println("北京時間:"+new Date());
    }

注意(cron=”0/5 * * * * ? “) 表示式

cron="0/5 * *  * * ? "   表示每隔5s執行一次
cron=" * * 0/1 * * ? "   表示每隔1小時執行一次

關於cronExpression的配置可以百度

對資料庫 tuser 中的兩張表 t_user 和 t_user2 進行備份:
程式碼如下:

 //定時備份方案
    @Scheduled(cron="0/5 * *  * * ? ")   //每5秒執行一次  @Scheduled(cron=" * * 0/1 * * ? ") 每小時一次
    public void back(){
        System.out.println("現在時間是"+new Date());
        Runtime runtime = Runtime.getRuntime();  //獲取Runtime例項
        String user = "root";
        String password = "root";
        String database1 = "tuser"; // 需要備份的資料庫名
        String table1 = "t_user";
        String table2 = "t_user2";
        Date currentDate = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
        String sdfDate = sdf.format(currentDate);
        String filepath = "d:\\time_" + sdfDate + ".sql"; // 備份的路徑地址
        //執行命令
        String stmt = "mysqldump  -h localhost -u "+user+" -p"+password+" --databases "+database1+" --tables "+table1+" "+table2 +" > "+filepath;   
        System.out.println(stmt);
        try {
            String[] command = { "cmd", "/c", stmt};
            Process process = runtime.exec(command);
            InputStream input = process.getInputStream();
            System.out.println(IOUtils.toString(input, "UTF-8"));
            //若有錯誤資訊則輸出
            InputStream errorStream = process.getErrorStream();
            System.out.println(IOUtils.toString(errorStream, "UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

二、資料庫的還原

還原命令

可以通過兩種方式來進行還原操作。

1. mysql 利用sql檔案還原資料庫
mysql -h localhost -uroot -proot tuser< D:\user_2017-12-25_15-42-10.sql
2. source 命令

這也是匯入sql檔案的方式,登入mysql之後,輸入:

source d:/game_product2018-01-02_10-41-30.sql

注意反斜槓的方向,“source d:\ab.sql” 這樣會執行失敗。
注:在Navicat中無法使用 source 命令

還原

在程式碼中採用第一種方式實現還原操作

    public void restore() {
        String user = "root";
        String password = "root";
        String database = "tuser"; // 需要備份的資料庫名
        System.out.println("現在時間是" + new Date());
        Runtime runtime = Runtime.getRuntime();

        String cmd = "mysql  -h localhost" + " -u " + user + " -p" + password + " " + database;
        System.out.println(cmd);
        try {
            String filePath =  "D:\\user_2017-12-25_15-42-10.sql"; // sql檔案路徑
            String stmt = cmd + " < " + filePath;
            String[] command = {"cmd", "/c", stmt};
            Process process = runtime.exec(command);
            //若有錯誤資訊則輸出
            InputStream errorStream = process.getErrorStream();
            System.out.println(IOUtils.toString(errorStream, "utf-8"));
            //等待操作
            int processComplete = process.waitFor();
            if (processComplete == 0) {
                System.out.println("還原成功.");
            } else {
                throw new RuntimeException("還原資料庫失敗.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }