DMSでMySQLからOracleにデータをMigrationする
結構移すの大変だったので、備忘録を兼ねて、簡単な手順フローと躓くポイントを記載しておきます。
MySQL(Source)に複数スキーマがあって、それをOracle(Target)に移す場合です。
どっちもRDSインスタンスです。
* 変なところがあったら指摘してください。
もしわからないことがあったら、公式のドキュメントはここです。
MySQLのパラメータを確認
Change Data Capture(CDC)を利用する場合はRDSでMySQLインスタンスのパラメータを設定しましょう。
デフォルトのパラメータだとbinlog関連が設定できてないので、そこを設定します。
ドキュメントには以下のように書かれてます。
そもそも設定ができない箇所もあると思いますが、出来る限り書かれてる通りにセットしましょう。
[server_id]
パラメータを1以上にセット。
[log-bin]
binary log fileへのパスをセット。
例 log-bin=E:\MySql_Logs\BinLog.
* 拡張子はいりません。
[binlog_format]
パラメータをrowにセット。
[expire_logs_days]
パラメータを1以上にセット。
ディスクスペースの使いすぎを防ぐために、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でイケるかと思います。
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の1スキーマに対してOracleの1ユーザにして、End Pointも複数作っているので、Table MappingsはCustomにして、1スキーマ分だけMigrateするようにします。
上の例の続きとすると、以下のような感じです。
{
"rules": [
{
"rule-type": "selection",
"rule-id": "1",
"rule-name": "1",
"object-locator": {
"schema-name": "schema_name",
"table-name": "%"
},
"rule-action": "include"
}
]
}
Taskの実行
多分、これでMigrationされるはず!