如何用Terraform为Azure SQL的azurerm_mssql_database添加只读副本?配置未生效
解决Terraform中azurerm_mssql_database只读副本未创建的问题
首先明确:read_replica_count参数仅对弹性池中的数据库生效,独立部署的数据库无法通过该参数自动创建只读副本,需单独配置。以下是具体排查和解决步骤:
1. 确认数据库是否归属弹性池
如果你的数据库未关联弹性池,read_replica_count参数不会触发只读副本创建。必须为azurerm_mssql_database配置elastic_pool_id,指向已存在的弹性池资源。示例配置:
resource "azurerm_mssql_server" "main" { name = "main-sql-server" resource_group_name = azurerm_resource_group.main.name location = azurerm_resource_group.main.location version = "12.0" administrator_login = "sqladmin" administrator_login_password = "ComplexPass123!" } resource "azurerm_mssql_elastic_pool" "main" { name = "main-elastic-pool" resource_group_name = azurerm_resource_group.main.name location = azurerm_resource_group.main.location server_id = azurerm_mssql_server.main.id sku_name = "GP_Gen5_2" # 需使用支持只读副本的SKU } resource "azurerm_mssql_database" "main" { name = "main-db" server_id = azurerm_mssql_server.main.id elastic_pool_id = azurerm_mssql_elastic_pool.main.id read_replica_count = 1 }
2. 检查弹性池SKU兼容性
基础版(Basic)弹性池不支持只读副本功能,必须使用支持异地复制的SKU,例如:
- 常规用途(GP)系列:
GP_Gen5_*、GP_Gen8_* - 业务关键(BC)系列:
BC_Gen5_*、BC_Gen8_*
若使用不兼容的SKU,read_replica_count参数会被忽略,无报错但不会创建副本。
3. 独立数据库的只读副本创建方式
如果数据库是独立部署(未加入弹性池),需通过azurerm_mssql_database_replica资源手动创建只读副本。示例配置:
# 主SQL服务器及数据库 resource "azurerm_mssql_server" "primary" { name = "primary-sql-server" resource_group_name = azurerm_resource_group.primary.name location = azurerm_resource_group.primary.location version = "12.0" administrator_login = "sqladmin" administrator_login_password = "ComplexPass123!" } resource "azurerm_mssql_database" "primary" { name = "primary-db" server_id = azurerm_mssql_server.primary.id sku_name = "GP_Gen5_2" } # 只读副本所在的SQL服务器 resource "azurerm_mssql_server" "secondary" { name = "secondary-sql-server" resource_group_name = azurerm_resource_group.secondary.name location = azurerm_resource_group.secondary.location version = "12.0" administrator_login = "sqladmin" administrator_login_password = "ComplexPass123!" } # 创建只读副本 resource "azurerm_mssql_database_replica" "secondary" { name = "secondary-db" server_id = azurerm_mssql_server.secondary.id source_database_id = azurerm_mssql_database.primary.id read_scale = true # 启用只读路由 }
4. 验证部署状态
执行terraform apply后,查看部署日志是否存在权限不足、SKU不兼容等错误提示。同时运行terraform state list,检查是否有对应的副本资源(弹性池场景下副本会自动关联主库,独立场景下需看到azurerm_mssql_database_replica条目)。
内容的提问来源于stack exchange,提问作者user13759399
相关产品推荐
相关产品推荐

