EC2インスタンス上のMySQL5.5からAuroraへの移行

今回はレガシーインフラの改善として、EC2インスタンス上のMySQL5.5から
AWSサービスのAuroraへの移行を行いました。

## 全体作業の流れ

作業としては、以下の流れで作業を行いました。
1. 旧MySQLからAuroraへレプリケーションを行う
2. アプリ側を切り替える
以上。

という、とても簡単な手順で移行出来ました。
それでは、作業の詳細です。

## １、旧MySQLからAuroraへレプリケーションを行う

### １-1、EC2インスタンス上のMySQL5.5からデータをdumpする

```
$ mysqldump --master-data=2 --single-transaction --order-by-primary --databases hoge fuga > some.dump.txt
```

- `--master-data=2` マスタのポジションがコメントで出力されます
- `--single-transaction` は運用中のサービスの場合、ロックしないようdumpします
- ユーザデータも移行してください手順は割愛
- 旧MySQL側のマスタ設定は割愛します

### １-2、Auroraの設定

基本的なところは、
http://dev.classmethod.jp/cloud/aws/try-aurora-replica-failover/
こちらなどを参考にしました。

Auroraは、time_zoneの設定が出来ないので、下記の記事を参考に `init_connect` を設定しました。

参考
http://qiita.com/j3tm0t0/items/089ef96ba131df079ca4

```
init_connect       SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;
```

と、思っていたらこんな記事も最近見つけました。
http://dev.classmethod.jp/cloud/aws/amazon-aurora-local-timezone/

他に、 `character_set` の設定も行いました。
（Auroraは、パラメータグループがCluster用と２種類あるので注意！）


### １-3、Auroraに、データを流し込む

```
$ mysql -h auroraクラスターエンドポイント.ap-northeast-1.rds.amazonaws.com -uユーザ -p < some.dump.txt
```

### １-4、Auroraのレプリケーション設定（スレーブ）

```
$ mysql -h auroraクラスターエンドポイント.ap-northeast-1.rds.amazonaws.com -uユーザ -p
mysql> CALL mysql.rds_set_external_master(
    'xxx.xxx.xxx.xxx', （マスターのIPアドレス）
    3306, （ポート番号）
    'replication_user', （接続するユーザー名）
    '*********', （パスワード）
    'mysql-bin.09999', （バイナリログのファイル名）
    '123', （マスタのポジション）
    0 （SSL接続を行わない）
);
```

### １-5、Auroraのレプリケーション開始

```
mysql> CALL mysql.rds_start_replication;
```
それから

```
mysql> show slave status\G
```
とやってみて、

```
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
```
になっていれば、レプリケーション成功です。
さらに、 `Seconds_Behind_Master: 0` になっていれば切り替え準備完了です。

## 2、アプリ側を切り替える

任意のタイミングで、アプリ側の接続先をAuroraに切り替えてください。

```
mysql> call mysql.rds_stop_replication;
```
これでレプリケーションは停止できます。
無事移行が完了したら、

```
mysql> call mysql.rds_reset_external_master;
```

レプリケーションの設定をリセットしておきましょう。（重要）
これをやっておかないと、Auroraを再起動などした時にレプリケーションが開始されてしまいます。

## データの互換性について

今回は、小さめのデータベースだったので、確認も比較的簡単に出来ました。
カラムのデータ型としては以下のようなものがありましたでしたが、特に問題はありませんでした。

```
+------------------+------+-----+---------+----------------+
| Type             | Null | Key | Default | Extra          |
+------------------+------+-----+---------+----------------+
| int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| int(10) unsigned | YES  | MUL | 100     |                |
| int(11)          | YES  | MUL | NULL    |                |
| int(11)          | NO   |     | NULL    |                |
| text             | NO   | UNI | NULL    |                |
| text             | YES  | UNI | NULL    |                |
| text             | YES  |     | NULL    |                |
| datetime         | YES  |     | NULL    |                |
| varchar(255)     | YES  |     | NULL    |                |
| tinyint(3)       | NO   | MUL | NULL    |                |
+------------------+------+-----+---------+----------------+
```

しかし、こういった報告もあります。
http://oranie.hatenablog.com/entry/20130402/1364906656
http://qiita.com/yng13/items/ddf755780315e029cc6e

でも、レプリケーションさえ出来てしまえば、検証もやりやすいですね。