摘要
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%"
功能解析
-
获取当前日期时间生成文件名
-
调用
mysqldump
导出数据库 -
可结合 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 伪自动备份方法开始,逐步增强:
-
批处理单数据库备份
-
多数据库备份
-
邮件通知
-
完全 PowerShell 版本
-
动态获取数据库列表
特点:
-
自动化备份,支持计划任务
-
压缩、过期清理,节省空间
-
日志记录和邮件通知,提高运维可控性
-
动态数据库获取,减少人工