理系学生日記

おまえはいつまで学生気分なのか

azurerm_mysql_databaseのcharset、collation指定は効果があるのか

TerraformでAzure Database for MySQLを構築する場合、必ず利用するであろうリソースがazurerm_mysql_databaseです。

このリソースはcharsetcollationが必須パラメータです。 それぞれ文字セット、照合順序を意味しており、MySQLを利用する方は気にしたことがあるでしょう。

一方で、これらの設定は通常サーバー設定として設定するものです。 そして、Azure Database for MySQLにおけるサーバー設定には専用のリソースazurerm_mysql_configurationが存在しています。

であれば、azurerm_mysql_databaseazurerm_mysql_configurationのどちらでこれらの設定を加えれば良いのでしょうか。

azurerm_mysql_databaseで設定→×

azurerm_mysql_databaseを以下のように設定して、terraform applyを実行しました。 ちなみに、mysql_versionには"8.0"を指定しています。

$ terraform show | awk '/azurerm_mysql_database/,/^$/' | sed 's/.\{8\}-.\{4\}-.\{4\}-.\{4\}-.\{12\}/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/g'
# module.mysql.module.db_for_mysql.azurerm_mysql_database.this["kiririmode-database-basic"]:
resource "azurerm_mysql_database" "this" {
    charset             = "latin2"
    collation           = "latin2_general_ci"
    id                  = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg_kiririmode_mysql-basic/providers/Microsoft.DBforMySQL/servers/kiririmode-mysql-basic/databases/kiririmode-database-basic"
    name                = "kiririmode-database-basic"
    resource_group_name = "rg_kiririmode_mysql-basic"
    server_name         = "kiririmode-mysql-basic"
}

その上で、mysql-clientで接続し、サーバーパラメータを確認してみます。 結果、以下のように設定した値が一切反映されていません。

$ mysql -h kiririmode-mysql-basic.mysql.database.azure.com -u 'kiririmode@kiririmode-mysql-basic' -p
mysql> show variables where variable_name in ('character_set_server', 'collation_server');
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| character_set_server | latin1            |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
2 rows in set (0.02 sec)

azurerm_mysql_configurationで設定→○

次に、azurerm_mysql_configurationを用いてcollation_server等を指定した上で、mysql-clientから確認をしてみました。

$ terraform show | awk '/character_set_server|collation_server/,/^$/' | sed 's/.\{8\}-.\{4\}-.\{4\}-.\{4\}-.\{12\}/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/g'
# module.mysql.module.db_for_mysql.azurerm_mysql_configuration.this["character_set_server"]:
resource "azurerm_mysql_configuration" "this" {
    id                  = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg_kiririmode_mysql-basic/providers/Microsoft.DBforMySQL/servers/kiririmode-mysql-basic/configurations/character_set_server"
    name                = "character_set_server"
    resource_group_name = "rg_kiririmode_mysql-basic"
    server_name         = "kiririmode-mysql-basic"
    value               = "utf8mb4"
}

# module.mysql.module.db_for_mysql.azurerm_mysql_configuration.this["collation_server"]:
resource "azurerm_mysql_configuration" "this" {
    id                  = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg_kiririmode_mysql-basic/providers/Microsoft.DBforMySQL/servers/kiririmode-mysql-basic/configurations/collation_server"
    name                = "collation_server"
    resource_group_name = "rg_kiririmode_mysql-basic"
    server_name         = "kiririmode-mysql-basic"
    value               = "utf8mb4_bin"
}

show variablesをしてみましょう。

mysql> show variables where variable_name in ('character_set_server', 'collation_server');
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| character_set_server | utf8mb4     |
| collation_server     | utf8mb4_bin |
+----------------------+-------------+
2 rows in set (0.11 sec)

無事に設定ができたようです。

結論

状況的には、azurerm_mysql_databaseで設定するcharsetcollationにはあまり意味がなさそうです。 サーバー設定としてazurerm_mysql_configurationで定義するのが良いのでしょう。