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

如何通过Terraform从备份文件恢复Azure托管PostgreSQL数据库?

使用Terraform从备份文件创建Azure PostgreSQL灵活服务器数据库

问题描述

我正在使用Terraform自动化部署Azure PG灵活服务器数据库,但发现托管PostgreSQL没有从备份文件创建数据库的选项。现有Terraform代码如下:

resource "azurerm_postgresql_flexible_server_database" "db" {
  depends_on  = [azurerm_sql_firewall_rule.allowAzureServices]
  name        = var.db_name
  server_id   = azurerm_postgresql_flexible_server.postgreSQL.id
  collation   = "en_US.UTF8"
  charset     = "UTF8"
}

Azure SQL DB在Terraform中可通过设置create_mode = "restore"实现从备份创建,但PostgreSQL对应资源文档中未找到相关选项,请问如何通过Terraform实现从备份文件创建数据库?

解决方案

由于Azure PostgreSQL灵活服务器的Terraform资源azurerm_postgresql_flexible_server_database本身不支持直接从备份文件创建数据库,需分两步完成:先创建空数据库,再通过Terraform的provisioner执行PostgreSQL恢复命令导入备份。

1. 创建空数据库(保留原有基础配置)

先通过Terraform创建一个符合要求的空数据库,作为备份导入的目标:

resource "azurerm_postgresql_flexible_server_database" "db" {
  depends_on  = [azurerm_sql_firewall_rule.allowAzureServices]
  name        = var.db_name
  server_id   = azurerm_postgresql_flexible_server.postgreSQL.id
  collation   = "en_US.UTF8"
  charset     = "UTF8"
}

2. 添加Provisioner执行备份恢复

根据备份文件的存储位置,选择对应的恢复方式:

本地备份文件恢复

如果备份文件存储在执行Terraform的本地环境,使用local-exec调用pg_restore工具完成导入:

resource "azurerm_postgresql_flexible_server_database" "db" {
  depends_on  = [azurerm_sql_firewall_rule.allowAzureServices]
  name        = var.db_name
  server_id   = azurerm_postgresql_flexible_server.postgreSQL.id
  collation   = "en_US.UTF8"
  charset     = "UTF8"

  provisioner "local-exec" {
    command = <<EOT
      pg_restore -h ${azurerm_postgresql_flexible_server.postgresql.fqdn} \
                 -U ${var.admin_username}@${azurerm_postgresql_flexible_server.postgresql.name} \
                 -d ${var.db_name} \
                 --no-owner \
                 /path/to/your/local/backup.dump
    EOT
    environment = {
      PGPASSWORD = var.admin_password
    }
  }
}

Azure Blob存储备份文件恢复

如果备份文件存储在Azure Blob存储,先通过Azure CLI下载文件到本地临时目录,再执行恢复:

resource "azurerm_postgresql_flexible_server_database" "db" {
  depends_on  = [azurerm_sql_firewall_rule.allowAzureServices]
  name        = var.db_name
  server_id   = azurerm_postgresql_flexible_server.postgreSQL.id
  collation   = "en_US.UTF8"
  charset     = "UTF8"

  provisioner "local-exec" {
    command = <<EOT
      az storage blob download --account-name ${var.storage_account_name} \
                               --container-name ${var.storage_container_name} \
                               --name ${var.backup_blob_name} \
                               --file /tmp/backup.dump \
                               --account-key ${var.storage_account_key}

      pg_restore -h ${azurerm_postgresql_flexible_server.postgresql.fqdn} \
                 -U ${var.admin_username}@${azurerm_postgresql_flexible_server.postgresql.name} \
                 -d ${var.db_name} \
                 --no-owner \
                 /tmp/backup.dump
    EOT
    environment = {
      PGPASSWORD = var.admin_password
    }
  }
}

关键注意事项

  • 执行Terraform的环境需提前安装pg_restore(PostgreSQL客户端工具)及Azure CLI(若需从Blob存储下载备份)
  • 确保PostgreSQL服务器的防火墙规则允许执行Terraform的IP地址访问
  • 若备份为SQL脚本格式,可将pg_restore替换为psql命令执行脚本
  • 生产环境建议使用remote-exec配合受控虚拟机执行恢复,减少本地环境依赖风险

内容的提问来源于stack exchange,提问作者Jayesh Kulkarni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:45:33