Java實現Mysql的定時備份與還原
阿新 • • 發佈:2018-12-25
一、資料庫的定時備份
備份命令
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();
}
}