如何在不影响现有数据库的前提下将Terraform的azurerm_sql_database迁移至azurerm_mssql_database?
不中断现有Azure数据库的前提下,迁移azurerm_sql_database到azurerm_mssql_database的方法
直接替换Terraform配置中的资源类型会触发新数据库创建,因为Terraform会将新资源类型识别为全新资源。要在保留现有数据库的前提下完成迁移,需要通过状态迁移关联新旧资源,具体步骤如下:
步骤1:添加新的azurerm_mssql_database资源配置
在现有Terraform代码中,新增与原azurerm_sql_database参数完全一致的azurerm_mssql_database资源块,注意参数严格匹配(如数据库名称、资源组、关联服务器、SKU、备份策略等)。不要删除旧的azurerm_sql_database配置。
示例:
原旧资源配置:
resource "azurerm_sql_database" "app_db" { name = "app-db" resource_group_name = var.resource_group_name server_name = azurerm_sql_server.application_sql_server.name sku_name = "GP_Gen5_2" }
新增的新资源配置:
resource "azurerm_mssql_database" "app_db" { name = "app-db" resource_group_name = var.resource_group_name server_id = azurerm_sql_server.application_sql_server.id sku_name = "GP_Gen5_2" # 复制原数据库的其他配置参数,确保完全一致 }
步骤2:迁移Terraform状态
执行terraform state mv命令,将旧资源的跟踪状态转移到新资源上,让Terraform将新资源与现有实际数据库关联:
terraform state mv 'azurerm_sql_database.app_db' 'azurerm_mssql_database.app_db'
步骤3:验证迁移状态
运行terraform plan,检查输出结果:
- 不应出现“创建新数据库”或“销毁旧数据库”的操作提示
- 应显示资源配置已对齐,无需执行变更操作
步骤4:清理旧配置并确认
确认状态迁移无误后,删除代码中的azurerm_sql_database资源块,再执行terraform apply,此时Terraform仅更新本地状态,不会对实际数据库产生任何修改。
关键注意事项
- 确保新资源的所有参数与旧资源完全匹配,避免触发不必要的资源修改
- 操作前备份Terraform状态文件(如
terraform.tfstate),防止状态丢失 - 生产环境操作前,务必在测试环境验证整个流程
内容的提问来源于stack exchange,提问作者Karkala Srikanth
相关产品推荐
相关产品推荐

