MySQL5.1のデータベースをRDS for MySQLへ移行

記事タイトルとURLをコピーする

某クラウドで動いていたMySQLをAmazon RDSに移行する案件を担当しました。
その際にとった方法について紹介します。

データベース移行条件

案件開始時に以下の条件が与えられました。

  • 移行元のMySQLのバージョンは5.1
  • 移行対象データベースのストレージエンジンはMyISAMだが、移行後はInnoDBにする
  • 移行時にサービスを止めることは可能

RDS for MySQLは、MyISAMでも一応は動作可能なようですが、InnoDBが推奨なようです。
この移行のタイミングでInnoDBに変更してしまおうということになりました。

Q: Amazon RDS for MySQL ではどのストレージエンジンをサポートしていますか? MySQL の Amazon RDS における特定時点の復元およびスナップショット復元機能には、クラッシュからの回復可能なストレージエンジンが必要で、InnoDB ストレージエンジンのみがサポートされています。MySQL は様々な機能を持つ複数のストレージエンジンをサポートしていますが、それらすべてがクラッシュの回復とデータ耐久性に最適化されているわけではありません。例えば、MyISAM ストレージエンジンは、信頼性の高いクラッシュ回復をサポートしておらず、MySQL がクラッシュ後に再起動した時、特定時点の復元およびスナップショット復元が意図どおりに機能せず、データが紛失または破損する可能性があります。それでも、Amazon RDS で MyISAM を使用する場合は、このステップに従ってください。
Amazon RDS for MySQL" のよくある質問

移行方法の検討

まず、DMS(AWS Database Migration Service)を検討しました。
利用可能かどうかAWSの仕様(MySQL 互換データベースの AWS Database Migration Service のターゲットとしての使用)を確認しました。

ソースストレージエンジン (MyISAM、MEMORY など) にかかわらず、AWS DMS によってデフォルトで InnoDB テーブルとして MySQL 互換のターゲットテーブルが作成されます。

良さげです。
MyISAMをInnoDBに変換もしてくれそうな感じに書いています。

AWS DMS は MySQL のバージョン 5.5、5.6、5.7、8.0 と Aurora MySQL をサポートしています。さらに、AWS DMS は MariaDB のバージョン 10.0.24 から 10.0.28、10.1、10.2、10.3 をサポートしています。

しかし、残念ながら、5.1には対応していませんでした。
移行元MySQLを最初にアップデートし、それからDMSで移行するというステップをとれば可能そうな気はします。

ただ、今回はサービス停止時間も長めにとれるので、mysqldumpで移行することに決めました。

事前準備

RDS for MySQLのDBインスタンスを作成します。
パラメータグループなども必要に応じて移行前のものに合わせておきます。
なお、今回はMySQL5.7で作成しました。

1.移行元でDumpファイル作成

$ mysqldump --routines --events -u root -p --databases 対象データベース名 | gzip > dump.sql.gz

2.移行作業用EC2インスタンスにDumpファイルを配置

RDSへアクセスできるEC2インスタンスに、いったんDumpファイルを配置します。
このEC2インスタンスでは、mysqlコマンドが使える必要があります。
実際はあまり気にしないでいいかもしれませんが、今回は念のためにRDSとmysqlクライアントを同じバージョンにしました。

まず、MySQLクライアントをダウンロードサイトからダウンロードしました。
次に、Amazon Linux 2にもともとインストールされていたMariaDBを干渉しないように削除し、ダウンロードしたrpmファイルをインストールしました。

$ sudo yum remove mariadb-libs
$ sudo yum install mysql-community-client-5.7.26-1.el7.x86_64.rpm mysql-community-libs-5.7.26-1.el7.x86_64.rpm mysql-community-common-5.7.26-1.el7.x86_64.rpm

3.Dumpファイルの文字列を変換する

Dumpファイルはテキストデータなので、sedでMyISAMと書かれている部分をInnoDBに変換します。

$ gzip -d dump.sql.gz
$ sed -i 's/ENGINE=MyISAM/ENGINE=InnoDB/g' dump.sql

4.DumpファイルをRDSへインポート

$ mysql -u マスターユーザー名 -p -h RDSのエンドポイント < dump.sql

これで完了です。

この方法で必ず成功するかは断言できないですが、今回は成功しました。
実際の移行時は必ずテストをしていただければと思います。

まとめ

MySQL5.1、MyISAMといった古めのデータベースも、AWSのRDSに移行することができました。
移行を検討している方に参考になれば幸いです。

渡辺 信秀(記事一覧)

2017年入社 / 地味な内容を丁寧に書きたい