如何通过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
相关产品推荐
相关产品推荐

