如何编写脚本检测Azure中匹配指定名称的运行中数据库并实现每日通知?
检查Azure中运行状态的指定名称模式数据库并发送通知
针对你需要监控以_copy结尾的运行中Azure SQL数据库并发送通知的需求,以下是两种实用的脚本方案,配合自动化工具可实现每日检查:
PowerShell 脚本(适配Azure Automation)
这个脚本可以遍历指定订阅下的所有SQL数据库,筛选出名称以_copy结尾且状态为Online的实例,然后发送邮件提醒。
完整脚本
# 通过Run As账户登录Azure(Azure Automation环境专用) Connect-AzAccount -Identity # 切换到目标订阅 $subscriptionId = "你的订阅ID" Set-AzContext -Subscription $subscriptionId # 筛选符合条件的数据库 $copyDatabases = Get-AzSqlDatabase | Where-Object { $_.Name -like "*_copy" -and $_.Status -eq "Online" } # 构建通知内容 $subject = if ($copyDatabases.Count -gt 0) { "⚠️ 存在运行状态的_copy后缀数据库" } else { "✅ 无运行状态的_copy后缀数据库" } $body = if ($copyDatabases.Count -gt 0) { "需要清理的运行中数据库列表:`n`n" + ($copyDatabases | ForEach-Object { "服务器: $($_.ServerName) | 数据库名: $($_.Name)" }) -join "`n" } else { "当前没有以_copy结尾的运行中数据库,无需操作。" } # 发送邮件(以SendGrid为例,可替换为其他邮件服务) $sendGridApiKey = "你的SendGrid API密钥" $from = "alerts@yourdomain.com" $to = "admin@yourdomain.com" Send-MailMessage -From $from -To $to -Subject $subject -Body $body ` -SmtpServer "smtp.sendgrid.net" -Port 587 -UseSsl ` -Credential (New-Object System.Management.Automation.PSCredential "apikey", (ConvertTo-SecureString $sendGridApiKey -AsPlainText -Force))
自动化配置步骤
- 在Azure门户创建Automation账户,启用Run As账户。
- 创建新的PowerShell Runbook,粘贴上述脚本,替换占位符(订阅ID、API密钥、邮箱地址)。
- 给Run As账户分配
SQL Database Reader角色,确保能读取数据库信息。 - 添加
SendGrid模块到Automation账户(如果用其他邮件服务,需安装对应模块)。 - 设置每日触发计划,比如每天凌晨执行一次。
Azure CLI 脚本(适合本地/CI/CD环境)
如果偏好使用Azure CLI,这个脚本可以快速查询目标数据库,适合本地定时任务或Azure DevOps流水线。
完整脚本
# 服务主体登录(CI/CD环境用,本地运行可替换为az login) az login --service-principal -u <你的客户端ID> -p <你的客户端密钥> --tenant <你的租户ID> # 切换到目标订阅 az account set --subscription "你的订阅ID" # 查询符合条件的数据库 copy_dbs=$(az sql db list --query "[?ends_with(name, '_copy') && status=='Online']" -o table) # 生成通知内容 if [[ -n "$copy_dbs" && "$copy_dbs" != "No entries found" ]]; then subject="⚠️ 发现运行状态的_copy后缀数据库" body="以下数据库仍在运行,请及时清理:`n`n$copy_dbs" else subject="✅ 无运行状态的_copy后缀数据库" body="当前没有需要清理的_copy结尾数据库。" fi # 发送邮件(以mailx为例,根据操作系统调整命令) echo -e "$body" | mailx -s "$subject" admin@yourdomain.com
定时运行设置
- Linux/macOS:用
cron添加每日任务,比如0 1 * * * /path/to/your/script.sh。 - Azure DevOps:创建新流水线,设置每日触发计划,将脚本作为任务执行。
关键注意事项
- 执行脚本的账户必须拥有
Microsoft.Sql/servers/databases/read权限,否则无法查询数据库信息。 - 邮件服务可灵活替换,比如用Azure通信服务、Exchange Online,只需修改发送邮件的代码段。
- 若需检查多个订阅,可在脚本中添加循环遍历所有订阅的逻辑。
内容的提问来源于stack exchange,提问作者Mark Cooper
相关产品推荐
相关产品推荐

