【问题标题】:Terraform Azure - Move an existing Azure SQL Database into an Elastic PoolTerraform Azure - 将现有 Azure SQL 数据库移动到弹性池中
【发布时间】:2020-10-16 23:00:48
【问题描述】:

我有一个现有的 Azure SQL Server 和 1 个最初未创建到弹性池中的数据库。 Terraform 已经部署了它并保留了状态。

# Define SQL Server 1
resource "azurerm_mssql_server" "go-1" {
  name                          = "sql-sandbox-server01
  resource_group_name           = data.azurerm_resource_group.env-resourcegroup.name
  location                      = data.azurerm_resource_group.env-resourcegroup.location
  version                       = var.azsqlserver1version
  administrator_login           = var.azsqlserver1sauser
  administrator_login_password  = random_password.sql-password.result
  public_network_access_enabled = "true" # set to false with vNet integration
}
# Define SQL Database 1 - non-ElasticPool
resource "azurerm_mssql_database" "go-1" {
  name                = "sqldb-sandbox-01"
  server_id           = azurerm_mssql_server.go-1.id
  sku_name            = "Basic"
}

由于现在决定使用弹性池(对于这个单一数据库和其他数据库),数据库“sqldb-sandbox-01”现在已经包含表和数据。

我已将此添加到我的 main.tf 文件中……它工作正常,弹性池被创建……

resource "azurerm_sql_elasticpool" "go-1" {
  name                = "sqlep-sandbox-pool01
  resource_group_name = data.azurerm_resource_group.env-resourcegroup.name
  location            = data.azurerm_resource_group.env-resourcegroup.location
  server_name         = azurerm_mssql_server.go-1.name
  edition             = "Basic"
  dtu                 = 50
  db_dtu_min          = 0
  db_dtu_max          = 5
  pool_size           = 5000
}

我的问题是...如何将现有的“sqldb-sandbox-01”移动到 Terraform 中的弹性池中而不破坏数据库并重新创建它?

我尝试了这个,只是添加了单行 elastic_pool_id,但正如文档所述,它将再次破坏/创建数据库...

# Define SQL Database 1 - non-ElasticPool
resource "azurerm_mssql_database" "go-1" {
  name                = var.azsqldb1name
  server_id           = azurerm_mssql_server.go-1.id
  sku_name            = var.azsqldb1sku
  elastic_pool_id     = azurerm_sql_elasticpool.go-1.id
}

我将不胜感激任何处于相同位置并设法找到方法的人的来信。

在 Azure 门户 GUI 中很容易实现将现有的同一服务器数据库移动到弹性池中,因此我希望在这里也有类似的东西。我进行了一些搜索,但找不到任何特定于这个简单任务的内容。

提前致谢

【问题讨论】:

  • 您使用的是什么版本的 terraform 和 azurerm?我知道完成的更高版本有 azurerm_mssql_database(而不是 azurerm_sql_database)
  • TF 版本为 0.12.20,AzureRm 为 1.44.0

标签: azure azure-sql-database terraform terraform-provider-azure


【解决方案1】:

对于现有的 Azure SQL 数据库和弹性池。在块中直接添加单行elastic_pool_id 将强制创建新资源。甚至这种显示在 Azure 门户中也不明显。

您可以使用本地 PowerShell 脚本将现有数据库添加到新的弹性池中,而不是这样做。 local-exec provisioner 在创建资源后调用本地可执行文件。

这是我这边的一个工作示例。

resource "null_resource" "add_pool" {
 
  provisioner "local-exec" {

  command = <<-EOT
   Set-AzSqlDatabase `
   -ResourceGroupName "${azurerm_resource_group.example.name}" `
   -ServerName "${azurerm_mssql_server.example.name}" `
   -DatabaseName "${azurerm_mssql_database.test.name}" `
   -ElasticPoolName "${azurerm_sql_elasticpool.go-1.name}"
  EOT
    
  interpreter = ["PowerShell", "-Command"]

 }

}

【讨论】:

    【解决方案2】:

    经过大量测试,这实际上比预期的要容易。

    我原来的数据库段是这样的...

    # Define SQL Database 1 - non-ElasticPool
    resource "azurerm_mssql_database" "go-1" {
      name                = var.azsqldb1name
      server_id           = azurerm_mssql_server.go-1.id
      sku_name            = "Basic"
    }
    

    手动将数据库移动到弹性池是有意义的,而不是尝试在代码中进行。

    数据库移到弹性池后,我注意到数据库背后的 Azure ID 没有改变。

    然后我更新了 Terraform,更改了 sku_name,并添加了 elastic_pool_id...

    resource "azurerm_mssql_database" "go-1" {
      name                = var.azsqldb1name
      server_id           = azurerm_mssql_server.go-1.id
      sku_name            = "ElasticPool"
      elastic_pool_id     = azurerm_sql_elasticpool.go-1.id
    }
    

    再次运行 Terraform 计划,未检测到基础架构更改,它已经工作并且不想破坏任何东西。

    总结:手动将独立数据库移动到弹性池

    为相关数据库更新 Terraform,更改为...sku_name...并添加 elastic_pool_id

    感谢所有帮助我解决这个问题的人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      相关资源
      最近更新 更多