三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

SQL Server自动备份方案:Windows任务计划与迅雷结合

SQL Server自动备份方案:Windows任务计划与迅雷结合

1. 项目背景与需求解析

最近在DBA圈子里有个特别实用的自动化方案火了——通过Windows任务计划实现服务器自动开机、调用迅雷下载数据库备份文件,并在完成后自动关机。这个方案完美解决了DBA们每天手动备份的痛点,特别适合需要定期备份但又不想熬夜值守的运维人员。

我所在的企业用的是SQL Server 2019(版本15.x),每天凌晨需要备份约50GB的数据库文件。传统方法要么需要人工值守,要么就得让服务器24小时开机,既费电又不安全。下面分享我经过半个月实测验证的完整方案,包含几个关键创新点:

  1. 利用主板BIOS的定时开机功能(不同品牌设置略有差异)
  2. 通过Windows任务计划程序实现级联触发
  3. 使用迅雷命令行工具实现高速下载
  4. 备份完成后自动校验文件完整性
  5. 通过电源管理命令实现安全关机

重要提示:实施前请确保有UPS电源保护,避免断电导致备份中断或文件损坏

2. 系统环境准备

2.1 硬件要求

  • 华硕/戴尔等支持AC recovery功能的主机(实测华硕B660主板最稳定)
  • 至少16GB内存(处理大型数据库备份时不会卡顿)
  • 千兆网络环境(确保下载速度达标)
  • 备用存储空间需≥备份文件大小的2倍(考虑临时文件和版本保留)

2.2 软件配置

  1. 迅雷极速版:建议用v11.1.12.1692版本(新版本可能有广告干扰)
    # 静默安装命令 Start-Process "thunder_setup.exe" -ArgumentList "/S" -Wait
  2. 数据库工具
    • SQL Server Management Studio 18+
    • DB2命令行工具(如需备份DB2数据库)
  3. 系统组件
    # 启用必要的Windows功能 Enable-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-All" -NoRestart

3. 核心实现步骤

3.1 BIOS定时开机设置

以华硕主板为例:

  1. 开机按Del/F2进入BIOS
  2. 找到"高级模式"→"高级"→"APM配置"
  3. 启用"断电恢复后电源状态"设为"开机"
  4. 设置"RTC唤醒日期/时间"(建议比备份时间早10分钟)

不同品牌主板:

  • 戴尔:Power Management → AC Recovery
  • 惠普:Boot Options → After Power Loss

3.2 数据库备份脚本

-- SQL Server备份脚本示例 DECLARE @backupPath NVARCHAR(256) SET @backupPath = 'D:\Backups\DB_'+CONVERT(VARCHAR(20),GETDATE(),112)+'.bak' BACKUP DATABASE [YourDB] TO DISK=@backupPath WITH COMPRESSION, STATS=10 GO

3.3 迅雷自动化配置

  1. 获取迅雷命令行工具:
    # 从迅雷安装目录提取 Copy-Item "C:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe" -Destination "C:\Scripts\XLCmd.exe"
  2. 下载任务脚本:
    $url = "ftp://backup.server/db_backup_$(Get-Date -Format 'yyyyMMdd').zip" Start-Process "XLCmd.exe" -ArgumentList "`"$url`" -start" -Wait

3.4 关机控制逻辑

# 检查迅雷进程是否结束 while (Get-Process -Name "Thunder" -ErrorAction SilentlyContinue) { Start-Sleep -Seconds 60 } # 校验备份文件完整性 $backupFile = "D:\Backups\latest.bak" if ((Test-Path $backupFile) -and ((Get-Item $backupFile).Length -gt 1GB)) { shutdown /s /t 60 /c "备份完成,60秒后关机" } else { Send-MailMessage -To "admin@company.com" -Subject "备份失败警报" -Body "请立即检查服务器!" }

4. 任务计划配置

4.1 主任务链设计

  1. 开机触发任务(延迟2分钟运行)
    • 操作:启动数据库备份脚本
    • 条件:只在AC电源下运行
  2. 备份完成触发(通过文件存在性检测)
    • 操作:调用迅雷下载脚本
  3. 下载完成触发(进程监控)
    • 操作:执行关机脚本

4.2 具体设置步骤

# 创建开机任务 $trigger = New-ScheduledTaskTrigger -AtStartup $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Scripts\Backup.ps1" Register-ScheduledTask -TaskName "DB_AutoBackup" -Trigger $trigger -Action $action -User "SYSTEM"

5. 常见问题排查

5.1 迅雷无法自动启动

现象:任务计划显示成功但迅雷未运行
解决方案

  1. 检查迅雷安装目录权限
    icacls "C:\Program Files (x86)\Thunder Network" /grant "SYSTEM:(OI)(CI)F"
  2. 关闭迅雷的UAC弹窗
    Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Thunder Network\Thunder\Settings] "CheckUploadInfo"=dword:00000000

5.2 备份文件不完整

检测方法

# 检查备份文件头信息 $header = Get-Content "D:\Backups\latest.bak" -TotalCount 1 if ($header -notmatch "SQLSERVER") { Write-Warning "文件可能已损坏" }

5.3 自动关机失效

日志分析步骤

  1. 查看系统事件日志:
    Get-WinEvent -LogName System -MaxEvents 100 | Where-Object {$_.Id -eq 1074}
  2. 检查电源策略:
    powercfg /requests

6. 进阶优化方案

6.1 多节点并行备份

# 同时备份多个数据库 $dbs = "DB1","DB2","DB3" $dbs | ForEach-Object -Parallel { sqlcmd -Q "BACKUP DATABASE [$_] TO DISK='D:\Backups\$_.bak' WITH COMPRESSION" } -ThrottleLimit 3

6.2 增量备份策略

-- 每周日完整备份,其他时间差异备份 IF DATEPART(weekday, GETDATE()) = 1 BACKUP DATABASE [YourDB] TO DISK='...' WITH INIT ELSE BACKUP DATABASE [YourDB] TO DISK='...' WITH DIFFERENTIAL

6.3 云端同步扩展

# 使用rclone同步到云存储 rclone copy "D:\Backups\" "aliyun:/backups/" --transfers=4 --checkers=8

这个方案在我司生产环境稳定运行了半年多,最关键的几个经验:

  1. BIOS设置要禁用快速启动(Fast Boot)
  2. 迅雷配置里必须关闭"下载完成后弹窗提醒"
  3. 任务计划的"安全选项"要设为"不管用户是否登录都要运行"
  4. 建议每周手动验证一次备份文件可恢复性
← 返回列表