HeidiSQL 自动备份方案全解析与增强实现

 

摘要

HeidiSQL 是一款常用的 MySQL/MariaDB 图形化管理工具,但自身不具备自动备份功能。通过调用 MySQL 自带的 mysqldump 工具,并结合脚本和计划任务,可以实现“伪自动备份”。本文从基础方法到增强版脚本,包括多数据库支持、压缩、过期清理、日志记录、邮件通知以及完全 PowerShell 版本,提供一个完整的备份方案。


1. HeidiSQL 伪自动备份基础

1.1 背景

  • HeidiSQL 本身没有自动备份功能

  • mysqldump 可导出数据库结构和数据

  • 结合 Windows 批处理脚本和任务计划程序可以实现定时备份

1.2 基本示例脚本

@echo off
set MYSQL_USER=root
set MYSQL_PASSWORD=你的密码
set MYSQL_DATABASE=你的数据库名
set BACKUP_DIR=D:\heidi_backups

set DATETIME=%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%
set DATETIME=%DATETIME: =0%
set BACKUP_FILE=%BACKUP_DIR%\%MYSQL_DATABASE%_%DATETIME%.sql

"C:\Program Files\MariaDB 10.11\bin\mysqldump.exe" -u%MYSQL_USER% -p%MYSQL_PASSWORD% %MYSQL_DATABASE% > "%BACKUP_FILE%"

功能解析

  1. 获取当前日期时间生成文件名

  2. 调用 mysqldump 导出数据库

  3. 可结合 Windows 任务计划程序实现每日自动化


2. 增强版批处理脚本

增强功能包括:

  • 自动备份数据库

  • 文件压缩

  • 清理过期备份

  • 日志记录

@echo off
set MYSQL_USER=root
set MYSQL_PASSWORD=你的密码
set MYSQL_DATABASE=你的数据库名
set BACKUP_DIR=D:\heidi_backups
set RETENTION_DAYS=7

if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"

set DATETIME=%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%
set DATETIME=%DATETIME: =0%

set BACKUP_FILE=%BACKUP_DIR%\%MYSQL_DATABASE%_%DATETIME%.sql
set ZIP_FILE=%BACKUP_FILE%.zip
set LOG_FILE=%BACKUP_DIR%\backup.log

echo [%DATETIME%] 开始备份数据库 %MYSQL_DATABASE% >> "%LOG_FILE%"
"C:\Program Files\MariaDB 10.11\bin\mysqldump.exe" -u%MYSQL_USER% -p%MYSQL_PASSWORD% %MYSQL_DATABASE% > "%BACKUP_FILE%"

if errorlevel 1 (
    echo [%DATETIME%] ERROR: 数据库备份失败 >> "%LOG_FILE%"
    goto :END
) else (
    echo [%DATETIME%] 数据库备份成功 >> "%LOG_FILE%"
)

powershell -Command "Compress-Archive -Path '%BACKUP_FILE%' -DestinationPath '%ZIP_FILE%' -Force"
if exist "%ZIP_FILE%" del "%BACKUP_FILE%" & echo [%DATETIME%] 压缩完成 >> "%LOG_FILE%"

forfiles /p "%BACKUP_DIR%" /s /m *.zip /d -%RETENTION_DAYS% /c "cmd /c del @path"
echo [%DATETIME%] 已清理超过 %RETENTION_DAYS% 天的旧备份 >> "%LOG_FILE%"

:END
echo [%DATETIME%] 备份任务完成 >> "%LOG_FILE%"
exit /b 0

3. 多数据库备份版本

增强功能:

  • 支持多个数据库

  • 每个数据库独立生成备份文件

  • 压缩、过期清理、日志记录

@echo off
set MYSQL_USER=root
set MYSQL_PASSWORD=你的密码
set BACKUP_DIR=D:\heidi_backups
set RETENTION_DAYS=7
set DATABASES=db1 db2 db3
set LOG_FILE=%BACKUP_DIR%\backup.log

if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"

set DATETIME=%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%
set DATETIME=%DATETIME: =0%

for %%D in (%DATABASES%) do (
    set BACKUP_FILE=%BACKUP_DIR%\%%D_%DATETIME%.sql
    set ZIP_FILE=%BACKUP_FILE%.zip
    echo [%DATETIME%] 开始备份数据库 %%D >> "%LOG_FILE%"
    "C:\Program Files\MariaDB 10.11\bin\mysqldump.exe" -u%MYSQL_USER% -p%MYSQL_PASSWORD% %%D > "%BACKUP_FILE%"
    if errorlevel 1 (
        echo [%DATETIME%] ERROR: 数据库 %%D 备份失败 >> "%LOG_FILE%"
    ) else (
        echo [%DATETIME%] 数据库 %%D 备份成功 >> "%LOG_FILE%"
        powershell -Command "Compress-Archive -Path '%BACKUP_FILE%' -DestinationPath '%ZIP_FILE%' -Force"
        if exist "%ZIP_FILE%" del "%BACKUP_FILE%" & echo [%DATETIME%] 数据库 %%D 压缩完成 >> "%LOG_FILE%"
    )
)
forfiles /p "%BACKUP_DIR%" /s /m *.zip /d -%RETENTION_DAYS% /c "cmd /c del @path"
echo [%DATETIME%] 已清理超过 %RETENTION_DAYS% 天的旧备份 >> "%LOG_FILE%"

4. 带邮件通知版本

在多数据库备份基础上,增加邮件通知功能:

set SMTP_SERVER=smtp.example.com
set SMTP_PORT=587
set SMTP_USER=your_该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。
set SMTP_PASSWORD=你的邮箱密码
set EMAIL_TO=该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。
set EMAIL_SUBJECT=数据库备份通知
  • 邮件正文包含日志内容

  • 使用 PowerShell Send-MailMessage 发送

  • 可及时知晓备份状态


5. 完全 PowerShell 版本

完全 PowerShell 实现,更现代化,维护方便:

$mysqlUser = "root"
$mysqlPassword = "你的密码"
$backupDir = "D:\heidi_backups"
$retentionDays = 7
$databases = @("db1","db2","db3")
$smtpServer = "smtp.example.com"
$smtpPort = 587
$smtpUser = "your_该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。"
$smtpPassword = "你的邮箱密码"
$emailTo = "该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。"
$emailSubject = "数据库备份通知"

if (-not (Test-Path $backupDir)) { New-Item -Path $backupDir -ItemType Directory | Out-Null }
$datetime = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
$logFile = Join-Path $backupDir "backup.log"
$emailBody = "备份任务 $datetime 结果:`r`n"

foreach ($db in $databases) {
    $backupFile = Join-Path $backupDir "$db`_$datetime.sql"
    $zipFile = "$backupFile.zip"
    Add-Content $logFile "[$datetime] 开始备份数据库 $db"
    $mysqldumpPath = "C:\Program Files\MariaDB 10.11\bin\mysqldump.exe"
    Invoke-Expression "& `"$mysqldumpPath`" -u$mysqlUser -p$mysqlPassword $db > `"$backupFile`""
    if ($LASTEXITCODE -ne 0) {
        Add-Content $logFile "[$datetime] ERROR: 数据库 $db 备份失败"
        $emailBody += "数据库 $db 备份失败 `r`n"
    } else {
        Add-Content $logFile "[$datetime] 数据库 $db 备份成功"
        Compress-Archive -Path $backupFile -DestinationPath $zipFile -Force
        if (Test-Path $zipFile) { Remove-Item $backupFile; $emailBody += "数据库 $db 备份成功 `r`n" }
    }
}

Get-ChildItem -Path $backupDir -Filter "*.zip" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$retentionDays) } | Remove-Item
$emailBody += "已清理超过 $retentionDays 天的旧备份 `r`n"

$securePassword = ConvertTo-SecureString $smtpPassword -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($smtpUser, $securePassword)
Send-MailMessage -From $smtpUser -To $emailTo -Subject $emailSubject -Body $emailBody -SmtpServer $smtpServer -Port $smtpPort -Credential $cred -UseSsl

6. 动态获取数据库列表版本

自动获取用户数据库列表(排除系统数据库),无需手动维护:

$mysqlPath = "C:\Program Files\MariaDB 10.11\bin\mysql.exe"
$databases = & "$mysqlPath" -u$mysqlUser -p$mysqlPassword -e "SHOW DATABASES;" |
    ForEach-Object { $_.Trim() } |
    Where-Object { $_ -notin @("information_schema","mysql","performance_schema","sys") }
  • 动态获取后,可循环备份每个数据库

  • 其他逻辑同上,包括压缩、清理、日志、邮件通知


7. 总结

本文从基础 HeidiSQL 伪自动备份方法开始,逐步增强:

  1. 批处理单数据库备份

  2. 多数据库备份

  3. 邮件通知

  4. 完全 PowerShell 版本

  5. 动态获取数据库列表

特点:

  • 自动化备份,支持计划任务

  • 压缩、过期清理,节省空间

  • 日志记录和邮件通知,提高运维可控性

  • 动态数据库获取,减少人工

No comments

公司简介

 

自1996年以来,公司一直专注于域名注册、虚拟主机、服务器托管、网站建设、电子商务等互联网服务,不断践行"提供企业级解决方案,奉献个性化服务支持"的理念。作为戴尔"授权解决方案提供商",同时提供与公司服务相关联的硬件产品解决方案。
备案号: 豫ICP备05004936号-1

联系方式

地址:河南省郑州市经五路2号

电话:0371-63520088

QQ:76257322

网站:800188.com

电邮:该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。