最近老大提到了資料庫備份的功能,由於伺服器是window系統的,所以研究了下備份的方案,特此記錄
主要是實現每天定時備份功能,如果還要搞容災的話,就得對mysql資料庫進行主從設定了
核心的cmd命令如下所示
"D:\app\dev\MySQL Server 5.5\bin\mysqldump.exe" -uroot -proot --opt --default-character-set=utf8 -e --triggers -R --hex-blob --flush-logs -x db_package >D:/temp/db_backup/db_package20220.sql
命令的更多使用可以參考MySQL命令列匯入匯出工具--mysqldump命令詳解
之後的bat命令也是在此基礎上進行改造
bat命令:
echo 取日期、時間變數值
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
if /i %time:~0,2% lss 10 set hh=0%time:~1,1%
if /i %time:~0,2% geq 10 set hh=%time:~0,2%
set mn=%time:~3,2%
set ss=%time:~6,2%
set date=%yy%%mm%%dd%
set time=%hh%%mn%%ss%
%這裡不要具體時分資料,要的話可以追加time%
set filename=%date%
%賦值等號兩邊不能有空格%
set mysqldumpPath="D:\app\dev\MySQL Server 5.5\bin\mysqldump.exe"
set dbName=db_package
set dbUser=root
set dbPwd=root
set outpurDir=D:/temp/db_backup/
set outputFileName=%outpurDir%%dbName%_%filename%.sql
echo %outputFileName%
%mysqldumpPath% -u%dbUser% -p%dbPwd% --opt --default-character-set=utf8 -e --triggers -R --hex-blob --flush-logs -x %dbName% > %outputFileName%
將上面的內容複製到bat檔案裡,然後將上面的5個變數進行修改:
mysqldumpPath
你本地mysql路徑dbName
需要備份的資料庫dbUser
資料庫使用者名稱dbPwd
資料庫密碼outpurDir
備份檔案輸出路徑之後如果想要定時,有以下兩種方法:
目標:每天凌晨0:00備份一次資料庫,最大儲存30天資料,超過的自動刪除最久的那一份資料
首先,我們要知道java應該如何執行bat檔案,通過以下程式碼執行bat檔案
Runtime.getRuntime().exec("cmd /c run.bat")
主要區別:
#轉至https://blog.csdn.net/liuyukuan/article/details/5974517
cmd /c command 執行完命令後關閉命令視窗。
cmd /k command 執行完命令後不關閉命令視窗。
cmd /c start command 會開啟一個新視窗後執行命令,原視窗會關閉。
cmd /k start command 會開啟一個新視窗後執行命令,原視窗不會關閉。
定時的話,使用Spring Boot裡的定時任務即可
1.Application類中標明註解@EnableScheduling
,可開啟定時任務
@SpringBootApplication
@EnableScheduling
public class BusinessApplication {
}
2.建立你的定時任務類:
/**
* @author starsone
* @date 2022/12/09 11:52
*/
@Component
public class DbBackupService {
/**
* 每天凌晨0:00觸發
*/
@Scheduled(cron="0 0 0 * * ?")
private void scheduled3(){
File file = new File(dbBkFile);
if (file.exists()) {
File[] files = file.getParentFile().listFiles();
if (files.length > 30) {
//檔案超過30個,刪最舊的那個檔案
File oldFile = Arrays.stream(files).sorted((o1, o2) -> {
Long l = o1.lastModified();
Long l2 = o2.lastModified();
return l.compareTo(l2);
}).findFirst().get();
oldFile.delete();
}
System.out.println("-------------開始資料庫備份------------");
try {
Runtime.getRuntime().exec("cmd /c " + dbBkFile);
} catch (IOException e) {
System.out.println("------------備份失敗,出現異常----------");
e.printStackTrace();
}
} else {
System.out.println("------------備份失敗,bat檔案未找到----------");
}
}
}
cron表示式常用範例:
0 0 12 * * ?
每天中午12點觸發0 15 10 ? * *
每天上午10:15觸發0/2 * * * * ?
表示每2秒 執行任務0 0/2 * * * ?
表示每2分鐘 執行任務0 0 12 ? * WED
表示每個星期三中午12點 0 15 10 ? * MON-FRI
表示週一到週五每天上午10:15執行作業0 15 10 ? 6L 2002-2006
表示2002-2006年的每個月的最後一個星期五上午10:15執行具體看參考12、windows定時備份資料庫 - 雲起時。 - 部落格園