如何每日自动定期将SQL Server备份上传至AWS S3并保留最近10份
问题解答
1. 脚本选择:优先用Windows PowerShell
直接选PowerShell,理由很明确:
- PowerShell对结构化数据(比如AWS CLI返回的JSON)、日期排序、条件判断的支持远强于.bat脚本,处理S3对象元数据(如最后修改时间)更省心
- 复杂逻辑(比如统计文件数量、筛选旧文件)的实现成本低,后期维护和扩展更简单
- 不用像.bat那样靠繁琐的字符串切割来解析命令输出
2. 检查存储桶文件数量&删除旧文件的逻辑
核心流程:
- 用
aws s3 ls列出存储桶内的目标备份文件(可通过前缀/后缀过滤) - 提取文件的最后修改时间(或按文件名中的日期)排序,统计总数量
- 若数量≥10,计算超出的数量,删除排序最靠前的(最旧的)多余文件
3. 示例代码
前置准备
- 已安装AWS CLI并完成凭证配置(执行
aws configure输入密钥和区域) - 备份文件命名规则可识别(比如前缀为
ERP_Backup_,后缀为.bak)
PowerShell脚本示例
# 配置参数 $bucketName = "your-erp-backup-bucket" $localBackupFile = "C:\SQLServerBackups\ERP_Daily_Backup.bak" # 当日生成的备份文件路径 $s3BackupDir = "ERP_Daily_Backups/" # S3中备份文件的存放目录(可选) $keepLatestCount = 10 # 1. 上传最新备份到S3 Write-Host "开始上传当日备份..." aws s3 cp $localBackupFile s3://$bucketName/$s3BackupDir --quiet # 2. 获取存储桶内所有备份文件并按修改时间从旧到新排序 Write-Host "获取存储桶内已有备份列表..." $existingBackups = aws s3 ls s3://$bucketName/$s3BackupDir --recursive --output json | ConvertFrom-Json $sortedBackups = $existingBackups | Sort-Object -Property LastModified # 3. 删除超出数量的最旧备份 $excessNum = $sortedBackups.Count - $keepLatestCount if ($excessNum -gt 0) { Write-Host "发现$excessNum份超出保留数量的备份,开始删除最旧文件..." for ($i=0; $i -lt $excessNum; $i++) { $oldBackupKey = $sortedBackups[$i].Key aws s3 rm s3://$bucketName/$oldBackupKey --quiet Write-Host "已删除旧备份:$oldBackupKey" } } else { Write-Host "当前备份数量($($sortedBackups.Count)/$keepLatestCount)符合要求,无需删除" }
补充说明
- 如果备份文件名自带日期(比如
ERP_Backup_20240520.bak),也可以按文件名排序,把排序逻辑改成Sort-Object -Property Key即可 - 可添加错误处理:用
try/catch包裹上传命令,上传失败时终止脚本 - 自动执行:通过Windows任务计划程序,设置每日定时触发,执行命令:
powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\UploadERPBackupToS3.ps1"
为什么不推荐.bat?
.bat脚本处理AWS CLI的JSON输出需要靠findstr、嵌套for循环做字符串切割,逻辑繁琐且容易出错,比如日期排序、对象属性提取这类操作几乎没法优雅实现,后期维护成本极高。
内容的提问来源于stack exchange,提问作者Johnson
相关产品推荐
相关产品推荐

