Oracleソースデータベースからデータを移行すると、 Relational Migrator はデータベースで必要な構成変更を自動的にチェックし、それらを実装するためのSQLスクリプトを生成します。 データベース管理者(DBA)にスクリプトを確認し、データベースサーバー上で コマンドを実行させます。
Oracle の構成は移行ジョブの種類によって異なります。
スナップショット移行ジョブはすべてのデータを一度だけ移行し、その後停止します。
継続的な移行ジョブはスナップショット移行を実行し、データ変更を継続的に複製する CDC ステージに入ります。
サポートされているバージョンの Oracle の詳細については、 サポートされているデータベースとバージョン を参照してください。
このタスクについて
Oracle 12c インスタンスから移行する場合は、 SYSDBA ロールとして コマンドを実行する必要があります。
Oracle 12c はプラグ可能なデータベース(PDB)の概念を導入しました。 一部のコマンドは PDB で実行できますが、
ARCHIVELOG
を有効にするようなコマンドは、コンテナとマスターデータベース(CDB)で実行する必要があります。 各アーキテクチャの詳細については、「 コンテナ データベースとプラグ可能なデータベースの概要 」を参照してください。一部のコマンドは、データベースが単一テナントかマルチテナントかによって異なります。マルチテナントデータベースでは、権限にサフィックス
CONTAINER=ALL
が含まれている必要があります。データベースがマルチテナントであるかどうかを確認するには、次のSQLクエリを実行します。SELECT cdb AS is_multitenant FROM v$database; Oracle Database Express Edition(XE)に対して継続的な移行ジョブを実行することはできません。XE は必要なログをサポートしていないためです。
手順
ユーザー権限を設定する
次のコードでは、Oracle インスタンスに接続するための Relational Migrator 用の新しい Oracle サービス アカウントが作成されます。 あるいは、既存の Oracle サービス アカウントを使用して、適切な権限で Relational Migrator に接続することもできます。
サービス アカウントを作成します。
CREATE USER <user> IDENTIFIED BY "<password>"; サービス アカウントが移行ジョブのテーブルを所有していることを確認します。
必要な権限は、移行ジョブで使用されるテーブルをサービス アカウントが所有しているかどうかによって異なります。 テーブルの所有権を確認するには、次のクエリを実行します。
SELECT TABLE_NAME, OWNER FROM ALL_TABLES WHERE TABLE_NAME ='<table_name>' ORDER BY OWNER, TABLE_NAME; サービス アカウントに権限を付与します。
重要
マルチテナントコンテナデータベースを一般的なユーザーとして移行する場合は、権限を付与するときに
CONTAINER=ALL
を追加します。 (例: )。GRANT CREATE SESSION TO <user> CONTAINER=ALL; サービス アカウントがテーブル所有者の場合:
GRANT CREATE SESSION TO <user>; GRANT SELECT ON V_$DATABASE TO <user>; サービス アカウントがテーブル所有者でない場合
GRANT CREATE SESSION TO <user>; GRANT SELECT_CATALOG_ROLE TO <user>; GRANT SELECT ANY TABLE TO <user>; GRANT SELECT ON V_$DATABASE TO <user>; GRANT FLASHBACK ANY TABLE TO <user>;
ユーザー権限を設定する
次のコードでは、Oracle インスタンスに接続するための Relational Migrator 用の新しい Oracle サービス アカウントが作成されます。 あるいは、既存の Oracle サービス アカウントを使用して、適切な権限で Relational Migrator に接続することもできます。
サービス アカウントを作成します。
CREATE USER <user> IDENTIFIED BY "<password>"; サービス アカウントが移行ジョブのテーブルを所有していることを確認します。
必要な権限は、移行ジョブで使用されるテーブルをサービス アカウントが所有しているかどうかによって異なります。 テーブルの所有権を確認するには、次のクエリを実行します。
SELECT TABLE_NAME, OWNER FROM ALL_TABLES WHERE TABLE_NAME ='<table_name>' ORDER BY OWNER, TABLE_NAME; サービス アカウントに権限を付与します。
重要
マルチテナントコンテナデータベースを一般的なユーザーとして移行する場合は、権限を付与するときに
CONTAINER=ALL
を追加します。 (例: )。GRANT CREATE SESSION TO <user> CONTAINER=ALL; サービス アカウントがテーブル所有者の場合:
GRANT CREATE SESSION TO <user>; GRANT SELECT ON V_$DATABASE TO <user>; サービス アカウントがテーブル所有者でない場合
GRANT CREATE SESSION TO <user>; GRANT SELECT_CATALOG_ROLE TO <user>; GRANT SELECT ANY TABLE TO <user>; GRANT SELECT ON V_$DATABASE TO <user>; GRANT FLASHBACK ANY TABLE TO <user>;
継続的な移行ジョブを実行するために、サービス アカウントに追加の権限を付与します。
マルチテナントコンテナデータベースを移行する 場合は、
CONTAINER=ALL
を追加します。GRANT SET CONTAINER TO <user>; GRANT EXECUTE_CATALOG_ROLE TO <user>; GRANT SELECT ANY TRANSACTION TO <user>; GRANT LOGMINING TO <user>; GRANT CREATE TABLE TO <user>; GRANT LOCK ANY TABLE TO <user>; GRANT CREATE SEQUENCE TO <user>; GRANT SELECT ON DBA_TABLESPACES TO <user>; GRANT EXECUTE ON DBMS_LOGMNR TO <user>; GRANT EXECUTE ON DBMS_LOGMNR_D TO <user>; GRANT SELECT ON V_$LOG TO <user>; GRANT SELECT ON V_$LOG_HISTORY TO <user>; GRANT SELECT ON V_$LOGMNR_LOGS TO <user>; GRANT SELECT ON V_$LOGMNR_CONTENTS TO <user>; GRANT SELECT ON V_$LOGMNR_PARAMETERS TO <user>; GRANT SELECT ON V_$LOGFILE TO <user>; GRANT SELECT ON V_$ARCHIVED_LOG TO <user>; GRANT SELECT ON V_$ARCHIVE_DEST_STATUS TO <user>; GRANT SELECT ON V_$TRANSACTION TO <user>; GRANT SELECT ON V_$MYSTAT TO <user>; GRANT SELECT ON V_$STATNAME TO <user>;
アーカイブ ログを有効にする
アーカイブ ログがすでに有効になっているかどうかを確認するには、次のクエリを実行します。
SELECT LOG_MODE FROM V$DATABASE; この出力では、ログ記録が有効になっている場合は
ARCHIVELOG
が出力され、そうでない場合はNOARCHIVELOG
が出力されます。アーカイブ ログがまだ有効になっていない場合は、有効にします。
Relational Migrator は、ログを有効にするコードを自動的に生成できます。 次のコードは の例です。 マルチテナントデータベースを移行する場合は、コンテナまたは マスターデータベースでこれらのコマンドを実行します。
ALTER SYSTEM SET db_recovery_file_dest_size = 10G; ALTER SYSTEM SET db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile; SHUTDOWN IMMEDIATE; STARTUP MOUNT ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN;
テーブルスペースの作成
必要なテーブルスペースを作成します。
CONNECT sys/oraclepw@PDB_NAME as sysdba; CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/CDB_NAME/PDB_NAME/logminer_tbs.dbf' SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED CONNECT sys/password@CDB_NAME as sysdba; CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/CDB_NAME/logminer_tbs.dbf' SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; マルチテナント アーキテクチャで継続的な移行には、各プラグ可能なデータベースとコンテナデータベースにテーブルスペースが必要です。
サービスユーザーにテーブルスペースの割り当てを割り当てます。
ALTER USER <user> DEFAULT TABLESPACE LOGMINER_TBS QUOTA UNLIMITED ON LOGMINER_TBS CONTAINER=ALL;
重要
この手順は、 Amazon RDS でホストされているOracleインスタンスに適用されます。
ユーザー権限を設定する
次のコードでは、Oracle インスタンスに接続するための Relational Migrator 用の新しい Oracle サービス アカウントが作成されます。 あるいは、既存の Oracle サービス アカウントを使用して、適切な権限で Relational Migrator に接続することもできます。
サービス アカウントを作成します。
CREATE USER <user> IDENTIFIED BY "<password>"; サービス アカウントが移行ジョブのテーブルを所有していることを確認します。
必要な権限は、移行ジョブで使用されるテーブルをサービス アカウントが所有しているかどうかによって異なります。 テーブルの所有権を確認するには、次のクエリを実行します。
SELECT TABLE_NAME, OWNER FROM ALL_TABLES WHERE TABLE_NAME ='<table_name>' ORDER BY OWNER, TABLE_NAME; サービス アカウントに権限を付与します。
重要
マルチテナントコンテナデータベースを一般的なユーザーとして移行する場合は、権限を付与するときに
CONTAINER=ALL
を追加します。 (例: )。GRANT CREATE SESSION TO <user> CONTAINER=ALL; サービス アカウントがテーブル所有者の場合:
GRANT CREATE SESSION TO <user>; GRANT SELECT ON V_$DATABASE TO <user>; サービス アカウントがテーブル所有者でない場合
GRANT CREATE SESSION TO <user>; GRANT SELECT_CATALOG_ROLE TO <user>; GRANT SELECT ANY TABLE TO <user>; GRANT SELECT ON V_$DATABASE TO <user>; GRANT FLASHBACK ANY TABLE TO <user>;
継続的な移行ジョブを実行するために、サービス アカウントに追加の権限を付与します。
マルチテナントコンテナデータベースを移行する 場合は、
CONTAINER=ALL
を追加します。GRANT FLASHBACK ANY TABLE TO <user>; GRANT EXECUTE_CATALOG_ROLE TO <user>; GRANT SELECT ANY TRANSACTION TO <user>; GRANT LOGMINING TO <user>; GRANT CREATE TABLE TO <user>; GRANT LOCK ANY TABLE TO <user>; GRANT CREATE SEQUENCE TO <user>; CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('DBA_LOG_GROUPS', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR', '<user>', 'EXECUTE'); CALL rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR_D', '<user>', 'EXECUTE'); CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOG', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOG_HISTORY', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_LOGS', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_CONTENTS', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_PARAMETERS', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGFILE', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVED_LOG', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVE_DEST_STATUS', '<user>', 'SELECT'); CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$TRANSACTION', '<user>', 'SELECT'); RDSインスタンスがマルチテナントの場合は、テーブル空間に対して追加の権限が必要です。
CALL rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES', '<user>', 'SELECT');
アーカイブ ログを有効にする
アーカイブ ログがすでに有効になっているかどうかを確認するには、次のクエリを実行します。
SELECT LOG_MODE FROM V$DATABASE; この出力では、ログ記録が有効になっている場合は
ARCHIVELOG
が出力され、そうでない場合はNOARCHIVELOG
が出力されます。アーカイブ ログがまだ有効になっていない場合は、有効にします。
Relational Migrator は、ログを有効にするコードを自動的に生成できます。 次のコードは の例です。 マルチテナントデータベースを移行する場合は、コンテナまたは マスターデータベースでこれらのコマンドを実行します。
CALL rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours', 24);
詳細
Relational Migrator は、行レベルの変更をキャプチャするためにオープンソースの Debezium コネクターに依存しています。 詳細については、「 Debezium Oracle 」を参照してください
アーカイブ ロギングを有効にする方法の詳細については、「 アーカイブ済み Redo ログの管理 」を参照してください。
追加のトラブルシューティングとデバッグ情報については、 Debezium Oracle ヘルプ記事を参照してください。