1. 程式人生 > >Mysql:Java程式碼實現資料庫定時備份與還原詳解

Mysql:Java程式碼實現資料庫定時備份與還原詳解

一、目的

  1. 使用java程式碼實現定時執行Mysql備份與還原。

二、思路

  1. 先寫好一個定時器,每隔多少時間執行一次備份
  2. 備份方法為,通過java向命令列寫入命令執行
  3. 首先在cmd中模擬備份,測試成功後
  4. 使用java程式碼實現資料備份功能

三、具體操作

(1) 命令列實現備份

  1. 第一次搜尋的備份命令是
    mysqldump -h localhost -u root -proot --databases shop --tables sc_cart sys_admin > d:\time_2018-11-14_09-54-55.sql

  2. 輸入cmd,在命令列中輸入以上程式碼,提示:mysqldump 不是內部或外部命令
    在這裡插入圖片描述

  3. 於是將路徑切換至mysql的bin目錄下
    在這裡插入圖片描述

  4. 再次嘗試,報錯10061再次嘗試,報錯10061
    在這裡插入圖片描述

  5. 檢查賬號密碼沒有問題,多次嘗試,找到原因為,預設埠號為3306,我的Mysql埠號為3307,在my.ini檔案中更改後再次嘗試
    開啟D:\Program Files\mysql5.7\mysql5.7\my.ini
    將內容改為如下:

     [mysqld]
     port = 3306
     sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
     skip-grant-tables
    
  6. 測試可正常進入資料庫

  7. 測試備份命令,提示一個警告:Using a password on the command line interface
    在這裡插入圖片描述
    解決辦法見文章:Mysql:備份提示Using a password on the command line interface

  8. 修改my.ini檔案後,輸入新命令mysqldump --defaults-extra-file=..\my.ini shop > d:\time_2018-11-14_10-08-38.sql
    在這裡插入圖片描述

  9. d盤下成功生成一個備份檔案
    在這裡插入圖片描述

  10. 命令列測試成功,下一步使用Java程式碼實現以上功能


(2)Java程式碼實現備份

  1. java程式碼實現定時器

        /**
         * 生成備份檔案
         * @throws Exception
         */
        @Scheduled(cron="0 0 1 * * ?") //每天凌晨1點執行一次
        public void backup() throws  Exception{
            System.out.println("############生成備份檔案");
            doBackup();
        }
    
  2. java程式碼實現寫入命令列

        /**
         * 執行生成備份
         */
        public static void doBackup(){
            System.out.println("現在時間是"+new Date());
            Runtime runtime = Runtime.getRuntime();  //獲取Runtime例項
            String user = "root";
            String password = "root";
            String database1 = "shop"; // 需要備份的資料庫名
            String table1 = "sc_cart";
            String table2 = "sys_admin";
            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  --defaults-extra-file=..\my.ini  --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();
            }
        }
    
  3. 執行之後,備份檔案生成,但大小為0,沒有寫入資料
    控制檯提示如下:
    在這裡插入圖片描述

  4. 錯誤命令亂碼,將utf-8改為gbk,報錯提示:mysqldump 不是內部或外部命令
    在這裡插入圖片描述

  5. 有了命令列測試的經驗,原因為mysqldump路徑不對,於是將mysqldump.exe考到命令列預設的位置
    在這裡插入圖片描述

  6. 測試依舊提示:mysqldump 不是內部或外部命令

  7. 繼續測試將程式碼改為

    String stmt = "d:\\Program Files\\mysql5.7\\mysql5.7\\bin mysqldump  --defaults-extra-file=..\\my.ini "+database1+" > "+filepath;
    //將程式碼順便簡化,賬號密碼後直接跟資料庫,不跟表名,直接備份整個資料庫
    //若不是備份整個資料庫,可使用以下程式碼
    //String stmt = "d:\\mysqldump  --defaults-extra-file=d:\\my.ini " --databases "+database1+" --tables "+table1+" "+table2 +" > "+filepath;
    
  8. 測試提示:
    在這裡插入圖片描述

  9. 將mysqldump.exe考到d盤根目錄下,程式碼改為
    String stmt = "d:\\mysqldump --defaults-extra-file=d:\\my.ini "+database1+" > "+filepath;
    測試無報錯,備份檔案生成,資料寫入成功。

  10. 最後將成功的程式碼貼在下面

/**
 * 執行生成備份
 */
public static void doBackup(){
    System.out.println("現在時間是"+new Date());
    Runtime runtime = Runtime.getRuntime();  //獲取Runtime例項
    String database1 = "shop"; // 需要備份的資料庫名
    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 = "d:\\mysqldump  --defaults-extra-file=d:\\my.ini "+database1+" > "+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, "gbk"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  1. 還原始碼
    注意:命令列中執行的是mysql不是mysqldump

    	    /**
    	     * 還原資料庫
    	     */
    	    public static void restore() {
    	        String database = "shop"; // 需要備份的資料庫名
    	        System.out.println("現在時間是" + new Date());
    	        Runtime runtime = Runtime.getRuntime();
    	        try {
    	            String filePath =  "D:\\time_31.sql"; // sql檔案路徑
    	            String stmt = "d:\\mysql  --defaults-extra-file=d:\\my.ini "+database+"< " + filePath;
    	            System.out.println(stmt);
    	            String[] command = {"cmd", "/c", stmt};
    	            Process process = runtime.exec(command);
    	            //若有錯誤資訊則輸出
    	            InputStream errorStream = process.getErrorStream();
    	            System.out.println(IOUtils.toString(errorStream, "gbk"));
    	            //等待操作
    	            int processComplete = process.waitFor();
    	            if (processComplete == 0) {
    	                System.out.println("還原成功.");
    	            } else {
    	                throw new RuntimeException("還原資料庫失敗.");
    	            }
    	        } catch (Exception e) {
    	            e.printStackTrace();
    	        }
    	    }
    	```
    
    
    
  2. 若不將mysqldump移至D盤根目錄,也可以將mysql的bin目錄配置在環境變數中

    前面步驟完成後安裝好MySQL,為MySQL配置環境變數。MySQL預設安裝在C:\Program Files下。

    1)新建MYSQL_HOME變數,並配置:C:\Program Files\MySQL\MySQL Server 5.6

    MYSQL_HOME:C:\Program Files\MySQL\MySQL Server 5.6

    2)編輯path系統變數,將%MYSQL_HOME%\bin新增到path變數後。配置path環境變數,也可不新建MYSQL_HOME變數,而是直接將MySQL安裝目錄下的bin配置到path變數下,即:C:\Program
    Files\MySQL\MySQL Server 5.6\bin

    Path:%MYSQL_HOME%\bin

    或Path:C:\Program Files\MySQL\MySQL Server 5.6\bin

參考文章:

https://www.aliyun.com/jiaocheng/1121105.html
https://blog.csdn.net/babylove_BaLe/article/details/78953584