前言:

公司里的服务器内总有一些总要的数据,比如 svn文件服务、git代码库、mysql数据库、等等、如果突然哪天停电或死机。很容易导致机械硬盘损坏。所以一般都会做数据备份。
此教程是把机械硬盘的数据拷贝固态硬盘做备份
在这里插入图片描述

文件结构介绍

backup_system/
│
├── schedule_backup.bat # 调度程序,负责任务调度,定时执行–> 备份程序1 、备份程序2
├── files_backup1.bat #备份程序1
├── files_backup2.bat #备份程序2 (可以复制配置多个 3/4/5/6/7)

配置说明:

在这里插入图片描述

原理说明:

1、采用window自带的 robocopy 命令,实现增量备份。
2、文件被其他程序占用也可以备份。
3、备份路径不存在会自动创建。
4、可以配置多个备份脚本,在定时脚本里配置多个运行即可。
注意:
1、运行脚本时候,请有管理员权限运行。
2、确保 window自带的 robocopy 命令没有损坏
3、备份的磁盘不要在同一个物理盘上。比如 C/D盘是金士顿的固态硬盘 E/F盘是华硕的机械硬盘。(夸盘备份才是合理的)

备份程序1 (files_backup1.bat)

@echo off
    echo 开始复制文件夹...
    :: 原路径
    set "filePath=D:\giteaMainPath" 
    :: 备份路径
    set "backPath=E:\backup\giteaMainPath"
    :: 使用robocopy命令复制文件夹
    :: /E 复制所有子目录,包括空目录
    :: /R:3 失败重试3次
    :: /W:5 每次重试间隔5秒
    :: /NP 不显示复制进度百分比
    :: /NDL 不记录目录列表
    robocopy "%filePath%" "%backPath%" /E /R:3 /W:5 /NP /NDL
    
    :: 检查命令执行结果
    if %errorlevel% equ 0 (
        echo 复制完成,没有需要复制的文件
    ) else if %errorlevel% equ 1 (
        echo 复制成功完成
    ) else if %errorlevel% equ 2 (
        echo 复制完成,但有额外的文件被创建
    ) else if %errorlevel% equ 3 (
        echo 复制完成,但有文件被更新
    ) else if %errorlevel% geq 8 (
        echo 复制过程中出现错误
    )
    
    echo 操作结束
    :: pause  结果后黑窗口不关闭
    :: pause  

备份程序2(files_backup2.bat)

@echo off
    echo 开始复制文件夹...
    :: 原路径
    set "filePath=D:\svnMainPath" 
    :: 备份路径
    set "backPath=E:\backup\svnMainPath"
    :: 使用robocopy命令复制文件夹
    :: /E 复制所有子目录,包括空目录
    :: /R:3 失败重试3次
    :: /W:5 每次重试间隔5秒
    :: /NP 不显示复制进度百分比
    :: /NDL 不记录目录列表
    robocopy "%filePath%" "%backPath%" /E /R:3 /W:5 /NP /NDL
    
    :: 检查命令执行结果
    if %errorlevel% equ 0 (
        echo 复制完成,没有需要复制的文件
    ) else if %errorlevel% equ 1 (
        echo 复制成功完成
    ) else if %errorlevel% equ 2 (
        echo 复制完成,但有额外的文件被创建
    ) else if %errorlevel% equ 3 (
        echo 复制完成,但有文件被更新
    ) else if %errorlevel% geq 8 (
        echo 复制过程中出现错误
    )
    
    echo 操作结束
    :: pause  结果后黑窗口不关闭
    :: pause  
    

调度脚本(files_backup_schedule.bat)

@echo off
setlocal enabledelayedexpansion

:: 全局配置变量 - 在此处修改设置
set "BACKUP_TIME=17:45:00"        :: 备份时间(24小时制,格式:HH:MM:SS)
set "BATCH_FILES=files_backup1.bat files_backup2.bat" :: 需要执行的批处理文件,空格分隔

:: 主循环
:loop
:: 清除屏幕
cls

:: 显示提示信息
echo ===================================
echo 定时数据备份程序运行中....请勿关闭
echo 定时数据备份程序运行中....请勿关闭
echo 定时数据备份程序运行中....请勿关闭
echo -----------------------------------
echo 下次备份时间: %BACKUP_TIME%
echo ===================================

:: 获取当前时间
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "current_date=!dt:~0,4!-!dt:~4,2!-!dt:~6,2!"
set "current_time=!dt:~8,2!:!dt:~10,2!:!dt:~12,2!"

:: 获取星期几
for /f "tokens=3" %%a in ('echo %date%') do set "weekday=%%a"

:: 显示当前时间
echo 当前时间: !current_date! !weekday! !current_time!
echo.

:: 检查是否到达备份时间
if "!current_time!"=="%BACKUP_TIME%" (
    echo 到达备份时间,开始执行备份任务...
    echo.
    
    :: 逐个执行批处理文件
    for %%f in (%BATCH_FILES%) do (
        if exist "%%f" (
            echo 正在执行: %%f
            start /wait cmd /c "%%f"
            echo %%f 执行完成
        ) else (
            echo 警告: 未找到文件 %%f,跳过执行
        )
        echo.
    )
    
    echo 所有备份任务执行完成,等待下一次备份时间...
    timeout /t 2 /nobreak >nul  :: 等待2秒,避免重复执行
)

:: 等待1秒后再次检查
timeout /t 1 /nobreak >nul
goto loop

测试结果:

设定最近的一个时间。然后看结果

在这里插入图片描述

如果文章对你有一点点帮助,欢迎【点赞、留言、+ 关注】
您的关注是我创作的动力!若有疑问/交流/需求,欢迎留言/私聊!
多一个朋友多一条路!

更多推荐