LoginSignup
4
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-15

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されるはず!

4
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4