MySQLからAWS Auroraへの移行でハマったことなど

MySQLからAWS Auroraに移行した際の振り返り。
RDSはもとより、ほぼDBなど触ったことがなかったのでとてもいい経験になりました。辛かったけど。

概要

オンプレで稼働しているDB(MySQL)をAWS Auroraに移行する。
移行するデータは数百GB〜TBぐらい。
本番を切り替える際のDB停止時間は可能な限り短くする。(数時間)
オンプレで稼働しているDBのバックアップを取得して、Auroraにリストア。
停止できる時間が限られているため、オンプレ ==> Aurora間でレプリケーションを貼り、
タイミングを見計らって数時間の間で本番DBを切り替える。
mysqldumpとxtrabackupというMySQLのバックアップツールの2択で検討していて 、
AWSのドキュメントにも方法が記載してあり、(容量にもよると思うが)リストアがmysqldumpよりも高速という理由でxtrabackupを選択。
しかし色々失敗して結局mysqldumpで移行することに。

移行時に気をつけるポイントなど

InnoDBが破損していないかチェック

S3に置いたバックアップファイルからAuroraを起動した際に失敗したので
xtrabackupを使って移行する場合は確認した方が良さげ。 InnoDB破損に気がつかず、結構な時間を無駄にした。 チェックする際はMySQLの停止が必要。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.6.1 innochecksum — オフライン InnoDB ファイルチェックサムユーティリティー

Auroraは圧縮テーブルをサポートしない

これにハマった時点で圧縮テーブルのことすら知らなかった。
Auroraはrow_formatが"Compressed"なテーブルはサポートしていない。 事前にrow_formatを確認しておき、"Compressed"テーブルがあった場合は"Compact"などにALTER TABLEしておく。

RDS MySQL スナップショットの Aurora への移行 - Amazon Relational Database Service

ドキュメント見逃してた。

データが大きい時は解凍用にEC2を立てる

移行元データが大きい場合、というかネットワーク越しにデータ転送する場合は
大体gzipとかした状態で転送すると思うが、今回のケースではバックアップファイルを圧縮した状態で
Aurora起動できなかったので、EC2で解凍 => 再度S3に上げなおすという方法をとった。 移行元のサーバのDisk容量が逼迫してるとか、そういう時に。

mysqldumpで巨大なテーブルをリストアする場合

巨大なテーブルをリストアする際、セカンダリインデックスを後から作成する、という手法を使うとリストアが早くなる。
テーブルの定義とデータを分けてdumpを取得したり、dumpしたファイルを書き換えるなど手間はかかる。

www.saintsouth.net 参考にさせていただきました。

Auroraでセカンダリインデックスを作成する場合はインスタンスサイズに注意。
インスタンスサイズごとに内部ストレージの容量が決まっており、
内部ストレージの容量以上の量のインデックスファイルを作ろうとすると、エラーが発生する。
あらかじめインデックスファイルの容量は"show table status"などで把握しておくと良い。

time zone設定でハマる

オンプレ => Auroraのレプリケーションで更新されていくカラムの時刻がオンプレと9時間ズレていることが発覚。
オンプレのシステム時刻がJSTで、Auroraのシステム時刻がUTCということから起きる現象。
オンプレ側のシステム時刻を明示的にJST(Asia/Tokyo)にしておくことで回避できるはず。
念のためbinlogの中身を確認してtimezoneが指定されていることを確認しておく。

qiita.com 参考にさせていただきました。

MySQLからAuroraへのユーザ移行

MySQLとAuroraのユーザテーブル(mysql.user)の構造が違うため、
dumpをそのままインポートとかはできない。
Auroraには独自のカラムが追加されていたり、付与できない権限などあり、ハマった。
Auroraにユーザ移行を行う場合は素直にパスワード情報など確認してからgrantコマンドで作るなどした方がよい。

binlogを有効にしているとゼロダウンタイムパッチが効かない

メンテナンスなどでAuroraに再起動などが走った際、セッションが切れないゼロダウンタイムパッチという機能がある。
binlogを有効をしていると、この機能が使われないので注意が必要。フェイルオーバーした時にうっかり若干停止してしまった。

Amazon Auroraアップデート – 空間インデックス・ゼロダウンタイムパッチ | Amazon Web Services ブログ