Springboot 實(shí)現(xiàn)數(shù)據(jù)庫備份還原的方法
之前對電腦重裝了一下,結(jié)果IDEA的項(xiàng)目目錄沒有備份,導(dǎo)致有幾個(gè)平時(shí)會(huì)拿來參考的項(xiàng)目都丟失了,尤其有一個(gè)自己寫的Springboot項(xiàng)目當(dāng)初沒有備份,這次是徹底無緣再見了,有的東西可以對外(開源)的還是放在博客園這些地方記錄一下比較不錯(cuò),偶爾再遇到這樣的問題Ctrl+C&Ctrl+V即可解決了。
這回記錄一下Springboot實(shí)現(xiàn)對數(shù)據(jù)庫進(jìn)行一個(gè)備份和通過備份數(shù)據(jù)對數(shù)據(jù)庫進(jìn)行恢復(fù)。當(dāng)然不限于Springboot,對數(shù)據(jù)庫備份還原中的代碼,Java 相關(guān)的都可以使用。
備份數(shù)據(jù)庫
備份通過命令行對數(shù)據(jù)庫導(dǎo)出到指定目錄即可。我這里是一個(gè)Get請求,頁面需要展示備份文件名稱、大小和備份時(shí)間,代碼中使用的log是Slf4j,最終界面效果如圖:
代碼對我的原代碼有所改動(dòng),關(guān)于備份文件的存放目錄,我配置在了application.properties配置文件中,通過一個(gè)配置類ProjectUrlConfig去獲取,代碼中的projectUrlConfig.getBackPath()即為文件目錄,與fileName拼接成完整的路徑。
/* 備份數(shù)據(jù)庫 */ @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ù)庫用戶名,-p后接的123456為該用戶密碼,注意不要有空格;dbName填寫需要備份數(shù)據(jù)的數(shù)據(jù)庫名稱,大于號(hào)后接生成文件路徑 try { Runtime.getRuntime().exec(cmd); }catch (Exception e){ log.error("【備份數(shù)據(jù)庫】失?。簕}", e.getMessage()); map.put("msg", e.getMessage()); return new ModelAndView("common/error", map); } log.info("【備份數(shù)據(jù)庫】成功,SQL文件:{}", fileName); map.put("msg","備份數(shù)據(jù)庫成功");return new ModelAndView("common/success", map); }
恢復(fù)數(shù)據(jù)庫
備份雖然在cmd命令行中使用 “mysql -uroot -p123456 dbName < SQL文件路徑” 可以對數(shù)據(jù)庫還原,嘗試使用時(shí)沒有發(fā)現(xiàn)報(bào)錯(cuò)但數(shù)據(jù)庫并未還原,最后通過OutputStreamWriter 來實(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ù)庫】失?。簕}", e.getMessage()); map.put("msg", e.getMessage()); return new ModelAndView("common/error", map); } log.info("【還原數(shù)據(jù)庫】成功,還原文件:{}", fileName); map.put("msg","還原數(shù)據(jù)庫成功");return new ModelAndView("common/success", map); }
以上即可對數(shù)據(jù)庫進(jìn)行備份與恢復(fù),但是也只是適用于較小的數(shù)據(jù)庫。
參考文章:https://blog.csdn.net/duli3554197/article/details/89468758
總結(jié)
到此這篇關(guān)于Springboot 實(shí)現(xiàn)數(shù)據(jù)庫備份還原的文章就介紹到這了,更多相關(guān)Springboot 數(shù)據(jù)庫備份還原內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫版本控制的詳細(xì)教程
- SpringBoot整合Flyway的方法(數(shù)據(jù)庫版本遷移工具)
- 淺談SpringBoot之開啟數(shù)據(jù)庫遷移的FlyWay使用
- Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫的操作
- SpringBoot連接使用PostgreSql數(shù)據(jù)庫的方法
- springboot 啟動(dòng)時(shí)初始化數(shù)據(jù)庫的步驟
- Springboot Mybatis-Plus數(shù)據(jù)庫單元測試實(shí)戰(zhàn)(三種方式)
- Springboot Druid 自定義加密數(shù)據(jù)庫密碼的幾種方案
- springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過程(連接數(shù)據(jù)庫進(jìn)行測試)
- SpringBoot 集成 Jasypt 對數(shù)據(jù)庫加密以及踩坑的記錄分享
- SpringBoot使用flyway初始化數(shù)據(jù)庫
相關(guān)文章
Java的List集合框架之LinkedList詳細(xì)解析
這篇文章主要介紹了Java的List集合框架之LinkedList詳細(xì)解析,LinkedList底層是內(nèi)部Node類的存儲(chǔ),prev、next、item值,同時(shí)最外層還有first、last節(jié)點(diǎn),需要的朋友可以參考下2023-11-11SpringBoot通過redisTemplate調(diào)用lua腳本并打印調(diào)試信息到redis log(方法步驟詳解)
這篇文章主要介紹了SpringBoot通過redisTemplate調(diào)用lua腳本 并打印調(diào)試信息到redis log,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02使用Criteria進(jìn)行分組求和、排序、模糊查詢的實(shí)例
這篇文章主要介紹了使用Criteria進(jìn)行分組求和、排序、模糊查詢的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03@Value設(shè)置默認(rèn)值后,獲取不到配置值的原因分析
這篇文章主要介紹了@Value設(shè)置默認(rèn)值后,獲取不到配置值的原因,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java 實(shí)現(xiàn)將一個(gè)string保存到txt文檔中
今天小編就為大家分享一篇java 實(shí)現(xiàn)將一個(gè)string保存到txt文檔中的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07一文帶你學(xué)會(huì)Java網(wǎng)絡(luò)編程
網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備(計(jì)算機(jī))的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來。這篇文章將帶大家深入了解一下Java的網(wǎng)絡(luò)編程,需要的可以了解一下2022-08-08關(guān)于ThreadLocal對request和response的用法說明
這篇文章主要介紹了關(guān)于ThreadLocal對request和response的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08jstl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猨stl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03