Mysql:Java程式碼實現資料庫定時備份與還原詳解
一、目的
- 使用java程式碼實現定時執行Mysql備份與還原。
二、思路
- 先寫好一個定時器,每隔多少時間執行一次備份
- 備份方法為,通過java向命令列寫入命令執行
- 首先在cmd中模擬備份,測試成功後
- 使用java程式碼實現資料備份功能
三、具體操作
(1) 命令列實現備份
-
第一次搜尋的備份命令是
mysqldump -h localhost -u root -proot --databases shop --tables sc_cart sys_admin > d:\time_2018-11-14_09-54-55.sql
-
輸入cmd,在命令列中輸入以上程式碼,提示:mysqldump 不是內部或外部命令
-
於是將路徑切換至mysql的bin目錄下
-
再次嘗試,報錯10061再次嘗試,報錯10061
-
檢查賬號密碼沒有問題,多次嘗試,找到原因為,預設埠號為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
-
測試可正常進入資料庫
-
測試備份命令,提示一個警告:Using a password on the command line interface
解決辦法見文章:Mysql:備份提示Using a password on the command line interface -
修改my.ini檔案後,輸入新命令
mysqldump --defaults-extra-file=..\my.ini shop > d:\time_2018-11-14_10-08-38.sql
-
d盤下成功生成一個備份檔案
-
命令列測試成功,下一步使用Java程式碼實現以上功能
(2)Java程式碼實現備份
-
java程式碼實現定時器
/** * 生成備份檔案 * @throws Exception */ @Scheduled(cron="0 0 1 * * ?") //每天凌晨1點執行一次 public void backup() throws Exception{ System.out.println("############生成備份檔案"); doBackup(); }
-
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(); } }
-
執行之後,備份檔案生成,但大小為0,沒有寫入資料
控制檯提示如下:
-
錯誤命令亂碼,將utf-8改為gbk,報錯提示:mysqldump 不是內部或外部命令
-
有了命令列測試的經驗,原因為mysqldump路徑不對,於是將mysqldump.exe考到命令列預設的位置
-
測試依舊提示:mysqldump 不是內部或外部命令
-
繼續測試將程式碼改為
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;
-
測試提示:
-
將mysqldump.exe考到d盤根目錄下,程式碼改為
String stmt = "d:\\mysqldump --defaults-extra-file=d:\\my.ini "+database1+" > "+filepath;
測試無報錯,備份檔案生成,資料寫入成功。 -
最後將成功的程式碼貼在下面
/**
* 執行生成備份
*/
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();
}
}
-
還原始碼
注意:命令列中執行的是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(); } } ```
-
若不將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\binPath:%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