Window系統的mysql資料庫定時備份

2022-12-09 18:03:57

原文:Window系統的mysql資料庫定時備份 - Stars-One的雜貨小窩

最近老大提到了資料庫備份的功能,由於伺服器是window系統的,所以研究了下備份的方案,特此記錄

主要是實現每天定時備份功能,如果還要搞容災的話,就得對mysql資料庫進行主從設定了

cmd命令

核心的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 備份檔案輸出路徑

之後如果想要定時,有以下兩種方法:

  1. Spring Boot專案中加入定時任務去執行bat檔案
  2. 使用window的任務計劃功能

Spring Boot的定時任務

目標:每天凌晨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執行

window系統任務計劃

具體看參考12、windows定時備份資料庫 - 雲起時。 - 部落格園







參考