DMSでMySQLからOracleにデータをMigrationする

#DMSでMySQLからOracleにデータをMigrationする

結構移すの大変だったので、備忘録を兼ねて、簡単な手順フローと躓くポイントを記載しておきます。
MySQL(Source)に複数スキーマがあって、それをOracle(Target)に移す場合です。
どっちもRDSインスタンスです。
* 変なところがあったら指摘してください。

もしわからないことがあったら、公式のドキュメントは[ここ](http://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)です。

##MySQLのパラメータを確認

Change Data Capture(CDC)を利用する場合はRDSでMySQLインスタンスのパラメータを設定しましょう。
デフォルトのパラメータだとbinlog関連が設定できてないので、そこを設定します。
ドキュメントには以下のように書かれてます。
そもそも設定ができない箇所もあると思いますが、出来る限り書かれてる通りにセットしましょう。

```text
[server_id]
パラメータを１以上にセット。

[log-bin]
binary log fileへのパスをセット。
例 log-bin=E:\MySql_Logs\BinLog. 
* 拡張子はいりません。

[binlog_format]
パラメータをrowにセット。

[expire_logs_days]
パラメータを１以上にセット。
ディスクスペースの使いすぎを防ぐために、0を使わないことを推奨。

[binlog_checksum]
パラメータをnoneにセット。

[binlog_row_image]
パラメータをfullにセット。
```

##OracleのRDSインスタンスを作成

TargetとしてOracleのインスタンスを作成します。
MySQLのデータをMigrationする際にスキーマごと移されないっぽいです。
AWS Schema Conversion Toolというものも用意されていますが、現状ではMySQLからPostgreSQLへしか対応してません。

そこでOracleにスキーマに対しての表を持たせるために、OracleユーザーをMySQLのスキーマ分用意します。
スキーマ名が schema_name だったら、そのまま schema_name ユーザを作ることにします。

あとは作ったユーザにPrivilegeを与えます。
ドキュメントで要求されている権限などを考慮すると、以下のSQLでイケるかと思います。

```sql
CREATE USER schema_name IDENTIFIED BY "PASSWORD";

GRANT "DBA" TO "schema_name" ;
GRANT CREATE SESSION TO "schema_name" ;
GRANT SELECT ANY TRANSACTION TO "schema_name" ;
GRANT SELECT on ALL_INDEXES TO "schema_name" ;
GRANT SELECT on ALL_OBJECTS TO "schema_name" ;
GRANT SELECT on ALL_TABLES TO "schema_name" ;
GRANT SELECT on ALL_USERS TO "schema_name" ;
GRANT SELECT on ALL_CATALOG TO "schema_name" ;
GRANT SELECT on ALL_CONSTRAINTS TO "schema_name" ;
GRANT SELECT on ALL_CONS_COLUMNS TO "schema_name" ;
GRANT SELECT on ALL_TAB_COLS TO "schema_name" ;
GRANT SELECT on ALL_IND_COLUMNS TO "schema_name" ;
GRANT DROP ANY TABLE TO "schema_name" ;
GRANT SELECT ANY TABLE TO "schema_name" ;
GRANT INSERT ANY TABLE TO "schema_name" ;
GRANT UPDATE ANY TABLE TO "schema_name" ;
GRANT CREATE ANY VIEW TO "schema_name" ;
GRANT DROP ANY VIEW TO "schema_name" ;
GRANT CREATE ANY PROCEDURE TO "schema_name" ;
GRANT ALTER ANY PROCEDURE TO "schema_name" ;
GRANT DROP ANY PROCEDURE TO "schema_name" ;
GRANT CREATE ANY SEQUENCE TO "schema_name" ;
GRANT ALTER ANY SEQUENCE TO "schema_name" ;
GRANT DROP ANY SEQUENCE TO "schema_name" ;
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$NLS_PARAMETERS','schema_name');
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$TIMEZONE_NAMES','schema_name');
```
ここで疑問点があり、ユーザ作成する時にユーザ名をクォートで括ると小文字のユーザー名で作成され、Endpointのコネクションテスト時にログイン時にエラーが起きてしまうようでした。
括らないと大文字でユーザーが作成されますが、コネクションテストは成功します。

##Replication instanceの作成

Replication instanceを作成しましょう。
ここで作ったインスタンスが疎通するか、DBのセキュリティーグループを確認しましょう。

##End Pointの作成
MigrationのSourceのMySQLと、TargetのOracleのユーザ分End Pointを作成します。
作成したらConnectionのテストをしてみて、接続先、ユーザーのPrivilege等が正しいか確認しましょう。

##Taskの作成
CDCを利用する場合は、Migration Typeを「Migrate existing data and rep...」にするのを忘れないように。
Task SettingsでEnable loggingをチェックしておくとCloudWatchにログが吐き出されて、エラーが起こった時原因究明に役立ちます。

今回MySQLの１スキーマに対してOracleの１ユーザにして、End Pointも複数作っているので、Table MappingsはCustomにして、１スキーマ分だけMigrateするようにします。
上の例の続きとすると、以下のような感じです。

```json
{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "1",
      "rule-name": "1",
      "object-locator": {
        "schema-name": "schema_name",
        "table-name": "%"
      },
      "rule-action": "include"
    }
  ]
}
```

##Taskの実行
多分、これでMigrationされるはず！