なになれ

IT系のことを記録していきます

Aurora MySQL version2からversion3への更新方法まとめ

Aurora MySQL version2からversion3に更新する機会があったので、やったことをまとめます。

事前情報の把握

AWSのドキュメントの以下に事前情報と大まかな手順が記載されています。こちらを一読しておくと良いです。
docs.aws.amazon.com

ポイントとしては、version3への更新はversion2のクラスタのスナップショットを作成し、それを復元してversion3のクラスタを作成することです。
そのため、今回はダウンタイムが発生することを前提とした方法になります。

バックトラックを使用する Aurora MySQL バージョン 2 クラスターがある場合、スナップショットの復元方法を使用して Aurora MySQL バージョン 3 にアップグレードすることは現状できません

また、上記の注意事項があります。今回はバックトラックを使用していない前提です。

更新手順

更新時の問題チェック

version3はmysql8.0系互換です。mysql8.0系に更新するにあたり、問題がないかをmysqlのコマンドであるmysqlcheck --check-upgradeでチェックします。

$ mysqlcheck --check-upgrade --all-databases -u [user] -h [hostname] -p

version3用のパラメータグループ作成

version3用のパラメータグループをクラスタインスタンス用それぞれ作成します。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_WorkingWithParamGroups.html#USER_WorkingWithParamGroups.Creating

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_WorkingWithParamGroups.html#USER_WorkingWithParamGroups.CreatingCluster

Terraformの場合、以下のようなコードになります。パラメータの内容はあくまで例です。
lower_case_table_namesパラメータはversion3の場合、クラスタ作成時のみ適用可能なパラメータなのでこの時点で設定する必要があります。
ちなみにlower_case_table_namesはテーブル名やデータベース名の大文字小文字の区別をどうするかのパラメータです。

resource "aws_rds_cluster_parameter_group" "example_mysql80" {
  family = "aurora-mysql8.0"
  name   = "example-mysql80"
  parameter {
    name         = "lower_case_table_names"
    value        = 1
    apply_method = "immediate"
  }
}

resource "aws_db_parameter_group" "example_mysql80" {
  family      = "aurora-mysql8.0"
  name        = "example-mysql80"
  parameter {
    name         = "slow_query_log"
    value        = 1
    apply_method = "immediate"
  }
  parameter {
    name         = "long_query_time"
    value        = 1
    apply_method = "immediate"
  }
}

バージョン更新

事前に各種プログラムからのデータベース接続を止めます。

既存のversion2のクラスタからスナップショットを作成します。指定しているオプションの内容はあくまで例です。

$ aws rds create-db-cluster-snapshot --db-cluster-id example-80 --db-cluster-snapshot-id example-upgrade-ok-snapshot

スナップショット作成が完了したら、既存のクラスタを削除します。

スナップショットからversion3のクラスタを作成します。

$ aws rds restore-db-cluster-from-snapshot --snapshot-id example-upgrade-ok-snapshot --db-cluster-id example-80 --engine aurora-mysql --engine-version 8.0.mysql_aurora.3.01.0

インスタンスを作成します。

$ aws rds create-db-instance --db-instance-identifier example-80-0 --db-cluster-identifier example-80 --db-instance-class db.r5.large --engine aurora-mysql

クラスタ作成をTerraformで行う場合、以下のようなコードになります。
Terraformでは、snapshot_identifierでスナップショットを指定することで、該当のスナップショットからクラスタを作成できます。

resource "aws_rds_cluster" "example_80" {
  cluster_identifier                  = "example-80"
...
  engine_version                      = "8.0.mysql_aurora.3.01.0"
...  
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.example_mysql80.name
  snapshot_identifier                 = "example-upgrade-ok-snapshot"
...
}

resource "aws_rds_cluster_instance" "example_80" {
  count                        = 1
  identifier                   = "example-80-${count.index}"
...
  instance_class               = "db.r5.large"
...
  db_parameter_group_name      = aws_db_parameter_group.example_mysql80.name
...
}

インスタンスが作成完了したら、各種プログラムからのデータベース接続を再開します。

まとめ

version3への更新は手順を示すと結構簡単です。ダウンタイムを伴うのでそこは注意が必要です。
苦労して更新したことに見合う価値があるかと思っていて、version3は8.0系互換なのでウィンドウ関数が使えるのが良いです。
DBの更新というと、それなりにリスクが高いので敬遠しがちです。ただAuroraのバージョンアップで改善されていることも多いので放置せずに適宜更新していきたいところです。