Springboot 實(shí)現(xiàn)數(shù)據(jù)庫(kù)備份還原的方法
之前對(duì)電腦重裝了一下,結(jié)果IDEA的項(xiàng)目目錄沒有備份,導(dǎo)致有幾個(gè)平時(shí)會(huì)拿來(lái)參考的項(xiàng)目都丟失了,尤其有一個(gè)自己寫的Springboot項(xiàng)目當(dāng)初沒有備份,這次是徹底無(wú)緣再見了,有的東西可以對(duì)外(開源)的還是放在博客園這些地方記錄一下比較不錯(cuò),偶爾再遇到這樣的問(wèn)題Ctrl+C&Ctrl+V即可解決了。
這回記錄一下Springboot實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行一個(gè)備份和通過(guò)備份數(shù)據(jù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行恢復(fù)。當(dāng)然不限于Springboot,對(duì)數(shù)據(jù)庫(kù)備份還原中的代碼,Java 相關(guān)的都可以使用。
備份數(shù)據(jù)庫(kù)
備份通過(guò)命令行對(duì)數(shù)據(jù)庫(kù)導(dǎo)出到指定目錄即可。我這里是一個(gè)Get請(qǐng)求,頁(yè)面需要展示備份文件名稱、大小和備份時(shí)間,代碼中使用的log是Slf4j,最終界面效果如圖:

代碼對(duì)我的原代碼有所改動(dòng),關(guān)于備份文件的存放目錄,我配置在了application.properties配置文件中,通過(guò)一個(gè)配置類ProjectUrlConfig去獲取,代碼中的projectUrlConfig.getBackPath()即為文件目錄,與fileName拼接成完整的路徑。
/* 備份數(shù)據(jù)庫(kù) */
@GetMapping("backupSQL")
public ModelAndView backupSQL(Map<String, Object> map){
String fileName = "backup_" + new Date().getTime() + ".sql";
String cmd = "mysqldump -uroot -p123456 dbName > " + projectUrlConfig.getBackPath() + fileName; //-u后的root為mysql數(shù)據(jù)庫(kù)用戶名,-p后接的123456為該用戶密碼,注意不要有空格;dbName填寫需要備份數(shù)據(jù)的數(shù)據(jù)庫(kù)名稱,大于號(hào)后接生成文件路徑
try {
Runtime.getRuntime().exec(cmd);
}catch (Exception e){
log.error("【備份數(shù)據(jù)庫(kù)】失敗:{}", e.getMessage());
map.put("msg", e.getMessage());
return new ModelAndView("common/error", map);
}
log.info("【備份數(shù)據(jù)庫(kù)】成功,SQL文件:{}", fileName);
map.put("msg","備份數(shù)據(jù)庫(kù)成功");return new ModelAndView("common/success", map);
}
恢復(fù)數(shù)據(jù)庫(kù)
備份雖然在cmd命令行中使用 “mysql -uroot -p123456 dbName < SQL文件路徑” 可以對(duì)數(shù)據(jù)庫(kù)還原,嘗試使用時(shí)沒有發(fā)現(xiàn)報(bào)錯(cuò)但數(shù)據(jù)庫(kù)并未還原,最后通過(guò)OutputStreamWriter 來(lái)實(shí)現(xiàn)。
@GetMapping("rollback")
public ModelAndView rollback(@RequestParam("filename") String fileName, Map<String, Object> map){
String path = projectUrlConfig.getBackPath() + fileName;
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("mysql -uroot -p123456 --default-character-set=utf8 dbName");
OutputStream outputStream = process.getOutputStream();
FileInputStream fis = new FileInputStream(path);
InputStreamReader isr = new InputStreamReader(fis, "utf-8");
BufferedReader br = new BufferedReader(isr);
String str = null;
StringBuffer sb = new StringBuffer();
while ((str = br.readLine()) != null) {
sb.append(str + "\r\n");
}
str = sb.toString();
OutputStreamWriter writer = new OutputStreamWriter(outputStream,"utf-8");
writer.write(str);
writer.flush();
if(writer!=null){
writer.close();
}
if(br!=null){
br.close();
}
if(isr!=null){
isr.close();
}
if(fis!=null){
fis.close();
}
if(outputStream!=null){
outputStream.close();
}
}catch (Exception e){
log.error("【還原數(shù)據(jù)庫(kù)】失敗:{}", e.getMessage());
map.put("msg", e.getMessage());
return new ModelAndView("common/error", map);
}
log.info("【還原數(shù)據(jù)庫(kù)】成功,還原文件:{}", fileName);
map.put("msg","還原數(shù)據(jù)庫(kù)成功");return new ModelAndView("common/success", map);
}
以上即可對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份與恢復(fù),但是也只是適用于較小的數(shù)據(jù)庫(kù)。
參考文章:https://blog.csdn.net/duli3554197/article/details/89468758
總結(jié)
到此這篇關(guān)于Springboot 實(shí)現(xiàn)數(shù)據(jù)庫(kù)備份還原的文章就介紹到這了,更多相關(guān)Springboot 數(shù)據(jù)庫(kù)備份還原內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制的詳細(xì)教程
- SpringBoot整合Flyway的方法(數(shù)據(jù)庫(kù)版本遷移工具)
- 淺談SpringBoot之開啟數(shù)據(jù)庫(kù)遷移的FlyWay使用
- Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫(kù)的操作
- SpringBoot連接使用PostgreSql數(shù)據(jù)庫(kù)的方法
- springboot 啟動(dòng)時(shí)初始化數(shù)據(jù)庫(kù)的步驟
- Springboot Mybatis-Plus數(shù)據(jù)庫(kù)單元測(cè)試實(shí)戰(zhàn)(三種方式)
- Springboot Druid 自定義加密數(shù)據(jù)庫(kù)密碼的幾種方案
- springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過(guò)程(連接數(shù)據(jù)庫(kù)進(jìn)行測(cè)試)
- SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫(kù)加密以及踩坑的記錄分享
- SpringBoot使用flyway初始化數(shù)據(jù)庫(kù)
相關(guān)文章
JWT 設(shè)置token過(guò)期時(shí)間無(wú)效的解決
這篇文章主要介紹了JWT 設(shè)置token過(guò)期時(shí)間無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
基于maven的springboot的"過(guò)時(shí)"用法解析
這篇文章主要為大家介紹了基于maven的springboot"過(guò)時(shí)"用法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理
這篇文章主要介紹了springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
在IntelliJ?IDEA中配置SSH服務(wù)器開發(fā)環(huán)境并實(shí)現(xiàn)固定地址遠(yuǎn)程連接的操作方法
本文主要介紹如何在IDEA中設(shè)置遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境,并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)無(wú)公網(wǎng)遠(yuǎn)程連接,然后實(shí)現(xiàn)遠(yuǎn)程Linux環(huán)境進(jìn)行開發(fā),本例使用的是IDEA2023.2.5版本,感興趣的朋友跟隨小編一起看看吧2024-01-01
Java源碼解析阻塞隊(duì)列ArrayBlockingQueue功能簡(jiǎn)介
今天小編就為大家分享一篇關(guān)于Java源碼解析阻塞隊(duì)列ArrayBlockingQueue功能簡(jiǎn)介,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
WIN7系統(tǒng)JavaEE(tomcat7 Eclipse)環(huán)境配置教程(二)
這篇文章主要介紹了WIN7系統(tǒng)JavaEE(java+tomcat7+Eclipse)環(huán)境配置教程,本文重點(diǎn)在于tomcat配置、Eclipse配置,感興趣的小伙伴們可以參考一下2016-06-06
java后端訪問(wèn)https證書的問(wèn)題及解決
這篇文章主要介紹了java后端訪問(wèn)https證書的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10

