惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Recent Announcements
Recent Announcements
D
Docker
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
The GitHub Blog
The GitHub Blog
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
腾讯CDC
B
Blog
博客园_首页
罗磊的独立博客
D
DataBreaches.Net
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
MongoDB | Blog
MongoDB | Blog
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence

博客园 - 华安

CSS中元素的display显示方式有多种,隐藏、块级、内联、内联-块级 SQl Server 中的 go 是什么作用 CSS中 display:flex的align-items: stretch; 移动端浏览器(尤其是 iOS Safari)的橡皮筋回弹效果(Overscroll / Bounce Effect) 手机端浏览器上ES6中的Fetch回调执行 window.open没效果 用Flex实现兼容性好的全屏布局 在 VS Code 中使用 C# Dev Kit 和 Unity Tools 调试 Unity 2022 Unity 可编程物件(ScriptableObject) 微信小程序中的 联系客服 最基本的使用方法 wx.requestSubscribeMessage(Object object) 和 wx.requestSubscribeDeviceMessage(Object object) 这两个有什么区别 微信小程序中 wx.hideLoading() 后调用 wx.showToast()的问题 Windows 中启动 Nginx的常用命令 CSS进阶技巧:字体渐变、描边、倒影与渐变色描边全解析 netCore 中各DLL引用了 SkiaSharp.dll的问题 unity中预制体解包 在 Unity 中,Time.timeScale实现游戏暂停加速等 微信小程序中关联微信支付 unity中的 Navigation AI使用 C#中TaskCompletionSource(简称 TCS)学习 Unity 编辑器 中,快捷键 Ctrl + Shift + F 的功能 unity中按下 F键,让物体聚焦 微信中进入定页面的,判断时通过扫二维码进入的,还是点小程序名称进入的 MYSQL中从JSON字符串中提取指定的值 Unity2022中创建动画 Animation(旧方法) Unity 中区别,public 和 [SerializeField] Unity中 onCollisionEnter2D与OnTriggerEnter2D 区别 asp.netCore中给动态请求路径加客户端缓存 netCore中获取客户端真实的IP引起的思考 Unity 相机:正交 (Orthographic) vs 透视 (Perspective) unity中的button中的onclick控制面板中四个参数的意思分别是什么
MYSQL 备份数据库
华安 · 2026-05-25 · via 博客园 - 华安

核心设计说明

功能实现方式兼容性
备份 mysqldump 命令行 所有 Windows
压缩 内嵌调用 PowerShell + .NET ZipFile 需 .NET 4.5+,失败自动保留 .sql
清理6个月前 forfiles /d -180 Windows XP+ 自带,无需额外软件
日志 echo >> 追加到文本文件 纯 BAT 命令

以下是完整代码,复制粘贴到记事本,另存为 backup.bat(编码选 ANSI):

@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion

:: ============================================
:: MySQL 自动备份脚本 (Windows BAT 版)
:: 功能:备份数据库 + 自动清理6个月前备份
:: ============================================

:: --- 配置区(根据你的环境修改这5项)---
set DB_HOST=localhost
set DB_PORT=3306
set DB_USER=your_username
set DB_PASSWORD=your_password
set DB_NAME=your_database

:: 备份目录(支持本地路径或网络共享 \\server\share)
set BACKUP_DIR=\\idmt-fileg\DB_BK\mysql_DataBAK
set LOG_FILE=%BACKUP_DIR%\backup.log
set RETENTION_DAYS=180

:: mysqldump 路径(根据实际安装路径修改)
set MYSQLDUMP="C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe"

:: --- 初始化 ---
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"

:: 获取时间戳(调用 PowerShell,兼容所有区域设置)
for /f "usebackq delims=" %%a in (`powershell -Command "Get-Date -Format yyyyMMdd_HHmmss"`) do set TIMESTAMP=%%a
for /f "usebackq delims=" %%a in (`powershell -Command "Get-Date -Format 'yyyy-MM-dd HH:mm:ss'"`) do set LOGTIME=%%a

set BACKUP_FILE=%BACKUP_DIR%\backup_%DB_NAME%_%TIMESTAMP%.sql
set ZIP_FILE=%BACKUP_FILE%.zip

:: --- 开始备份 ---
echo [%LOGTIME%] 开始备份数据库: %DB_NAME% >> "%LOG_FILE%"

:: 执行备份(通过环境变量传密码,避免进程列表暴露密码)
set "MYSQL_PWD=%DB_PASSWORD%"
%MYSQLDUMP% -h %DB_HOST% -P %DB_PORT% -u %DB_USER% --single-transaction --routines --triggers --events %DB_NAME% > "%BACKUP_FILE%"
set "MYSQL_PWD="

if %ERRORLEVEL% neq 0 (
    echo [%LOGTIME%] 备份失败!错误代码: %ERRORLEVEL% >> "%LOG_FILE%"
    if exist "%BACKUP_FILE%" del "%BACKUP_FILE%"
    exit /b 1
)

if not exist "%BACKUP_FILE%" (
    echo [%LOGTIME%] 备份文件未生成,请检查目录权限 >> "%LOG_FILE%"
    exit /b 1
)

:: --- 压缩(尝试打包成 zip,失败则保留 .sql)---
echo [%LOGTIME%] 正在压缩备份文件... >> "%LOG_FILE%"

set "PS_TEMP=%TEMP%\mysql_zip_%TIMESTAMP%.ps1"
(
    echo Add-Type -AssemblyName System.IO.Compression.FileSystem -ErrorAction Stop
    echo $temp = '%BACKUP_DIR%\temp_%TIMESTAMP%'
    echo New-Item -ItemType Directory -Path $temp -Force ^| Out-Null
    echo Copy-Item '%BACKUP_FILE%' "$temp\backup.sql" -Force
    echo if (Test-Path '%ZIP_FILE%') { Remove-Item '%ZIP_FILE%' -Force }
    echo [System.IO.Compression.ZipFile]::CreateFromDirectory($temp, '%ZIP_FILE%', [System.IO.Compression.CompressionLevel]::Optimal, $false)
    echo Remove-Item $temp -Recurse -Force
    echo Remove-Item '%BACKUP_FILE%' -Force
) > "%PS_TEMP%"

powershell -ExecutionPolicy Bypass -File "%PS_TEMP%" >nul 2>&1

if exist "%ZIP_FILE%" (
    echo [%LOGTIME%] 备份成功: %ZIP_FILE% >> "%LOG_FILE%"
) else (
    echo [%LOGTIME%] 备份成功: %BACKUP_FILE% (压缩失败,保留SQL文件) >> "%LOG_FILE%"
)

if exist "%PS_TEMP%" del "%PS_TEMP%"

:: --- 清理6个月前的备份(Windows自带 forfiles)---
echo [%LOGTIME%] 开始清理 %RETENTION_DAYS% 天前的备份... >> "%LOG_FILE%"

forfiles /p "%BACKUP_DIR%" /m "backup_%DB_NAME%_*.sql*" /d -%RETENTION_DAYS% /c "cmd /c del @path" >nul 2>&1

echo [%LOGTIME%] 清理完成 >> "%LOG_FILE%"
echo [%LOGTIME%] 本次任务结束 >> "%LOG_FILE%"
echo ---------------------------------------- >> "%LOG_FILE%"

endlocal

使用步骤

  1. 修改配置:打开 bat 文件,修改前5项(数据库账号、密码、库名、备份路径、mysqldump 路径)

  2. 保存编码:记事本 → 另存为 → 文件名 backup.bat → 编码选 ANSI

  3. 双击运行:直接双击 backup.bat 即可执行,黑窗口会自动关闭

  4. 查看结果:去备份目录看有没有生成 .zip.sql 文件,以及 backup.log 日志

设置定时自动执行

  1. Win + R,输入 taskschd.msc 回车

  2. 右侧点击 "创建基本任务"

  3. 名称:MySQL自动备份 → 触发器选 "每天" → 时间设 凌晨 2:00

  4. 操作选 "启动程序":

    • 程序或脚本:浏览选择你的 backup.bat 完整路径

  5. 重要:如果你的备份路径是网络共享(\\idmt-fileg\...),在"常规"选项卡里:

    • 勾选 "不管用户是否登录都要运行"

    • 点击 "更改用户或组",输入有权限访问该共享文件夹的域账号

    • 勾选 "使用最高权限运行"