You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform或Bash自动备份Azure PostgreSQL至Azure文件共享

Azure PostgreSQL弹性数据库自动备份至Azure文件共享的自动化方案

你已经通过Terraform完成了存储账户和文件共享的创建,接下来可以通过以下步骤实现PostgreSQL弹性数据库的定时自动备份:

一、核心实现路径

推荐使用**Azure自动化账户(Automation Account)**搭配PowerShell/Shell Runbook,结合计划触发器实现定时备份——这是Azure生态中轻量、易维护的自动化方案,无需额外搭建服务器。

二、第一步:配置权限

要确保自动化流程能访问PostgreSQL和存储账户,需要配置两个关键权限:

  • 给自动化账户的系统分配服务主体,分配PostgreSQL服务器的备份操作员角色(或参与者角色,权限更宽泛),允许执行数据库导出操作。
  • 给该服务主体分配存储账户的存储文件数据SMB共享参与者角色,允许向目标文件共享写入备份文件。
  • 额外配置:如果PostgreSQL服务器启用了VNet防火墙,需要将自动化账户的VNet加入允许列表,或者开启服务端点让自动化账户能访问数据库。

三、第二步:编写备份脚本(以PowerShell为例)

脚本核心逻辑是用pg_dump导出数据库,再将备份文件上传到Azure文件共享。建议把敏感信息(如数据库密码、存储账户密钥)存到自动化账户的凭据库,避免硬编码。

示例脚本:

# 从自动化账户凭据库读取敏感信息
$pgCred = Get-AutomationPSCredential -Name "PostgresAdminCred"
$storageCred = Get-AutomationPSCredential -Name "StorageAccountCred"

# 基础配置参数
$pgHost = "your-postgres-flex-server.postgres.database.azure.com"
$dbName = "target-database"
$backupFileName = "backup_$(Get-Date -Format 'yyyyMMddHHmmss').sql"
$storageAccountName = $storageCred.UserName
$storageShareName = "backup_psql"
$storageKey = $storageCred.GetNetworkCredential().Password

# 安装pg_dump(首次运行需要,后续可省略)
if (-not (Get-Command "pg_dump" -ErrorAction SilentlyContinue)) {
    Install-Module -Name PostgreSQLCmdlets -Force -Scope CurrentUser
}

# 导出数据库
$env:PGPASSWORD = $pgCred.GetNetworkCredential().Password
pg_dump -h $pgHost -U $pgCred.UserName -d $dbName -f $backupFileName -w

# 上传到Azure文件共享
$ctx = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageKey
Set-AzStorageFileContent -Context $ctx -ShareName $storageShareName -Source $backupFileName -Force

# 清理本地临时文件
Remove-Item $backupFileName -Force

四、第三步:用Terraform固化自动化基础设施

可以把自动化账户、Runbook、定时计划都用Terraform定义,实现全流程的基础设施即代码。

1. 创建自动化账户

resource "azurerm_automation_account" "backup_automation" {
  name                = "postgres-backup-automation"
  location            = data.azurerm_resource_group.rg_pssql_flex.location
  resource_group_name = data.azurerm_resource_group.rg_pssql_flex.name
  sku_name            = "Basic"
}

2. 创建备份Runbook

resource "azurerm_automation_runbook" "postgres_backup_runbook" {
  name                    = "PostgresFlexBackupRunbook"
  location                = azurerm_automation_account.backup_automation.location
  resource_group_name     = azurerm_automation_account.backup_automation.resource_group_name
  automation_account_name = azurerm_automation_account.backup_automation.name
  runbook_type            = "PowerShell"
  log_verbose             = true
  log_progress            = true

  content = <<CONTENT
# 填入上面的PowerShell备份脚本
CONTENT
}

3. 创建定时计划触发器

比如设置每天凌晨2点执行备份:

resource "azurerm_automation_schedule" "daily_backup_schedule" {
  name                    = "DailyPostgresBackupSchedule"
  resource_group_name     = azurerm_automation_account.backup_automation.resource_group_name
  automation_account_name = azurerm_automation_account.backup_automation.name
  frequency               = "Day"
  interval                = 1
  start_time              = "2024-01-01T02:00:00Z"
  time_zone               = "Asia/Shanghai"
}

# 关联计划和Runbook
resource "azurerm_automation_job_schedule" "backup_job_schedule" {
  automation_account_name = azurerm_automation_account.backup_automation.name
  resource_group_name     = azurerm_automation_account.backup_automation.resource_group_name
  schedule_name           = azurerm_automation_schedule.daily_backup_schedule.name
  runbook_name            = azurerm_automation_runbook.postgres_backup_runbook.name
}

五、可选优化建议

  • 敏感信息加密存储:把数据库密码、存储账户密钥放到Azure Key Vault,让自动化账户通过密钥访问,进一步提升安全性。
  • 备份压缩:在pg_dump命令中添加-Fc参数生成压缩格式的备份文件,减少存储空间占用。
  • 旧备份清理:在脚本中添加逻辑,删除超过指定天数(如7天)的旧备份文件,避免存储溢出。
  • 失败告警:配置自动化账户的作业日志告警,当备份任务失败时,通过邮件或短信通知运维人员。

内容的提问来源于stack exchange,提问作者Ikteaja hsan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:50:19