Terraform Azure - 将现有的 Azure SQL 数据库移动到弹性池中
Terraform Azure - Move an existing Azure SQL Database into an Elastic Pool
我有一个现有的 Azure SQL 服务器和 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,但正如文档所述,它将再次 destroy/create 数据库...
# 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 中可以轻松实现将现有的同一服务器数据库移动到弹性池中,所以我希望这里有类似的东西。我四处搜索了一下,但没有找到与这个简单任务相关的任何内容。
提前致谢
对于现有的 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"]
}
}
经过大量测试,这实际上比预期的要容易。
我原来的数据库段是这样的...
# 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
感谢所有帮助我解决这个问题的人
我有一个现有的 Azure SQL 服务器和 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,但正如文档所述,它将再次 destroy/create 数据库...
# 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 中可以轻松实现将现有的同一服务器数据库移动到弹性池中,所以我希望这里有类似的东西。我四处搜索了一下,但没有找到与这个简单任务相关的任何内容。
提前致谢
对于现有的 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"]
}
}
经过大量测试,这实际上比预期的要容易。
我原来的数据库段是这样的...
# 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
感谢所有帮助我解决这个问题的人