RDS MySQL 5.7からAmazon Auroraにオンライン移行する方法

2017.04.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。RDS MySQL 5.7環境からAuroraへのレプリケーションを利用したデータ移行を行う機会がありましたので、手順をまとめておきたいと思います。

Auroraリードレプリカ

他のデータベースエンジンからの移行はまだ敷居が高いのですが、既にRDS MySQLを使っているユーザであれば、Amazon Auroraに乗り換えない手はありません。MySQL 5.6との互換性があるのでアプリケーション側の変更はほぼ不要、より高性能、より堅牢なストレージの自動拡張機能付き、参照用ノードをFailover先としても利用可能、と、もう良いことばかりです。

ただ、RDS MySQLからAuroraに乗り換えるには、データ移行を避けて通ることができません。可能であれば、DB移行に伴うシステムのダウンタイムは限りなく0に近い方が望ましいです。そこで、なんとも便利な機能がリリースされているではないですか。

RDS MySQLをマスタとして、Auroraリードレプリカが簡単に作成できるようになっています。公式ドキュメントの手順を見ると、レプリケーションの構成から昇格まで、GUIの簡単操作だけで実現できそうです。

MySQL5.7ではAuroraリードレプリカ機能そのままは使えなかった

早速試してみることにしたのですが、マスタがMySQL5.7の場合は、残念ながらエラーになってしまいました。

aurora_read_replica

aurora_read_replica_error

Cannot upgrade from mysql 5.7.11 to aurora 5.6.10a.Specify a current active database version, the latest active minor version for mysql 5.7 is 5.7.11. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

この機能はAuroraのベースがMySQL5.6.10ということなので、MySQL5.6でないと使えないようです。

MySQL5.7からAuroraへのレプリケーションを手動で試す

懲りずにまずMySQL5.7からAuroraへのレプリケーションを手動で構成してみることにしました。基本的な流れは下記公式ドキュメントが参考になりました。

わずかなダウンタイムでの Amazon RDS MySQL または MariaDB DB インスタンスへのデータのインポート - Amazon Relational Database Service

  1. MySQL5.7からmysqldumpでエクスポート
  2. ダンプファイルをAuroraにインポート
  3. 確認済のマスターログファイル名とマスターログの場所を確認して、Auroraからmysql.rds_set_external_masterでMySQL5.7をマスタに指定
  4. Auroraにてmysql.rds_start_replicationでレプリケーションを開始

コマンドそのものは成功し、しばらくはこれで上手くいくかと思われたのですが、、、

2017-04-25 13:24:11 14117 [ERROR] Slave I/O: Found a Gtid_log_event or Previous_gtids_log_event when GTID_MODE = OFF. Error_code: 1784
2017-04-25 13:24:11 14117 [ERROR] Slave I/O: Relay log write failure: could not queue event from master, Error_code: 1595

上記エラーが出力され、レプリケーションが止まってしまいました。この原因についてなのですが、下記記事に書いてある"5.6.23"で修正されたバグなのではないかと判断しました。Auroraは"5.6.10"ベースということなので、そのままレプリケーションの構成を取ることはあきらめることにしました。(私の調査不足で、もしかすると回避策があるかもしれません)

MySQL5.7からMySQL5.6を挟んでAuroraまでレプリケーションできた

結局、こんな構成にすることでAuroraまでのレプリケーションを構成することができました。結局手作業でMySQL on EC2を構築することになってしまいましたが、Auroraにシステム切替をするまでの一時的な構成なので、OKということにしました。

repl_from_mysql57_to_aurora

参考までに、間に構築したEC2環境についても記録とメモを残しておきたいと思います。

$ sudo cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2016.09"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2016.09"
PRETTY_NAME="Amazon Linux AMI 2016.09"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2016.09:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

$ rpm -q mysql56-server
mysql56-server-5.6.35-1.23.amzn1.x86_64

$ sudo cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# Slave
log-bin
server-id = 11
log-slave-updates
replicate-ignore-db = mysql
binlog_format = MIXED

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
  • log-bin
  • バイナリログを有効化
  • server-id
  • 任意の重複しないIDを指定
  • log-slave-updates
  • SLAVEからSLAVEを作る場合に指定
  • replicate-ignore-db
  • RDS特有のテーブル(mysql.rds_heartbeat2など)が無いとエラーになるようなので設定、replicate-do-dbで同期をとるDBを明示的に指定する方法でも良い
  • binlog_format
  • RDSのデフォルトがMIXEDになっていたのでそれに揃えた

AWSサポートにはDatabase Migration Service(DMS)も勧められました。継続的なレプリケーションが必要なら、その方が良かったと思うのですが、今回はマスタ側に手を入れずにデータ移行を行いたかったので、MySQL on EC2を使ってやってみました。

まとめ

実際にはDB移行もなかなかそう簡単には行かないことも多いのですが、一旦Auroraに乗り換えさえしてしまえば、DB運用はずっと楽になるはずです。Auroraは今後も機能改善、拡張のリリースが続いていくと思われますので、ぜひお早めにご検討いただければと思います。個人的には、まだプレビュー状態ながら注目度の高いPostgreSQL互換のAuroraも、どんどん試して行きたいと思います。

どこかの誰かのお役に立てば嬉しいです。