アクアシステムズは、データベース領域のパイオニアとして様々なプロダクトをリサーチ&検証しています。 今、データベースはIT技術の中でも有数のエキサイティングなエリアです。私たちがこれまで取り組んできた調査、検証、方法論の研究を、皆さんのお役に立つよう発信していきたいと思います。

RDS へのDB 移行

2017.1.27 第1回「RDS へのDB 移行

[ 著者:吉田 宗弘]

前の記事

1. Introduction

1.1 はじめに

近年クラウド・ファーストのポリシーのもと、クラウド環境にシステムを構築する例が増加しています。また新規構築だけではなく、既存のシステムをクラウド環境に移行する流れも加速しています。特にシステム移行では、既存のデータベースを限られた時間内にクラウド環境に移行する必要があり、非常に高度な作業が要求されます。
今回は、筆者が過去に実際に行ったクラウド環境 (RDS) へのDB 移行の経験を踏まえて、RDS へのDB 移行方法について纏めてみたいと思います。

本書では、オンプレミスのOracle からRDS (Oracle) への移行を前提としています。

2. RDS への移行方法

2.1 選択可能な移行方法

実際にオンプレミス環境のデータベースをRDS に移行させる場合、どのような方法があるでしょうか? Amazon がDatabase Migration Service (DMS) と呼ばれる、RDS へのDB移行サービスを提供していますので、これを利用するのも1つの選択肢です。
https://aws.amazon.com/jp/dms/
http://docs.aws.amazon.com/ja_jp/dms/latest/userguide/dms-ug.pdf

他に、DataPump, GoldenGate 等のツールを使用して移行を行う事も可能です。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/
Oracle.Procedural.Importing.html


https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/
Appendix.OracleGoldenGate.html


これらのツールには、それぞれどのような特徴があるでしょうか?

以下に、それぞれのツールの特徴を纏めました。


移行ツール

特徴

DMS

・非常に簡単に利用可能
・DB の静止時間は極少で良い
・Oracle 以外のデータベースへも移行可能
・アーカイブログモードで、別途Supplemental Logging を有効化する必要がある。
・一部サポートされないデータ型がある。
・RDS とオンプレミス環境が直接接続できる必要がある。
・LOB データを含む場合、データ移行に多くの時間がかかる。
・移行元環境, 移行先環境の1つは、AWS サービス上に存在している必要がある。
・DMS の使用料が別途必要

DataPump

・移行中DB を静止する必要がある。
・データ型に対する制約は一番少ない。
・ログモードに依存しない。
・オンプレミス同士の移行も可能。
・LOB データについては、dmp ファイルを経由させれば高速にデータ移行が可能
・dmp ファイルを経由すれば、RDS と直接接続できない環境でも移行可能
・RDS と直接接続可能であれば、network_link を使用して移行可能
・無償で利用可能

GoldenGate

・DB の静止時間は極少で良い
・アーカイブログモードで、別途Supplemental Logging を有効化する必要がある。
・オンプレミス同士の移行も可能。
・一部サポートされないデータ型がある。
・データ移行中にデータ変換が可能
・LOB データのサイズに制限がある。
・RDS とオンプレミス環境が直接接続できる必要がある。
・使用するCapture Mode によっては、DB のVersion に制限がある。
・GoldenGate のライセンス費用が別途必要



MSを使用した移行については、要件さえ満たしてしまえばBrowser上から必要な設定を行っていくだけで移行を実施する事が可能なため、本書では特に触れません。
それでは残り2つの移行ツールは、何を基準に使い分けを行ったら良いでしょうか?
筆者はDB 移行のために、静止可能な時間によると考えています。RDS へのデータ移行中データベースを静止しておく事が可能なら、移行ツールとしてimpdp を選択すべきでしょう。しかし、十分な静止時間が確保できないのであれば、GoldenGate でデータ同期を継続しながら切替えのタイミングを待つと言う選択肢も検討しておいた方が良いでしょう。また、GoldenGate はデータの変換を行いながらデータ移行を行う事が可能です。RDS への移行に伴いテーブルの構成の変更が必要なアプリケーション修正が実施されるような場合、GoldenGate を使用する事でデータの移行と変換を同時に実施する事が可能です。GoldenGate を使用したデータ変換については、Aqua Lab. の記事 (第3回) で取り上げていますので、ご興味のある方は併せてご参照下さい。

http://www.aqua-systems.co.jp/aqua-lab/index.html


2.2 移行前に検討しておくべき事

RDS への移行に使用するツールが決まったところで、移行を開始するまでに検討しておくべき事は何でしょう? 筆者は最低限以下の検討が必要と考えています。
・使用するRDS のインスタンス・クラス, DB 容量, 文字コード
当然ですがRDS インスタンスを作成する際に、どれ位のCPU, メモリ, ストレージ
容量を使用するかを決める必要がありますので、事前に現行環境のスペックやパフォーマンスの状況を確認しておきましょう。また、文字コードやメンテナンス・ウィンドウ等、RDS インスタンスを作成する際に必要となる情報についても確認しておきましょう。

・移行対象スキーマの確認
 基本的に移行はスキーマ単位に実施しますので、RDS に移行するスキーマを確認します。

・RDS の制限
 RDS はクラウド・サービスであるため、オンプレミス環境には無い以下のような制限がありますので、移行するデータベースとアプリケーションにとってこれらの制限が問題無い事を確認します。

  1. 使用可能なオプションに制限がある。
  2. OS にアクセスできない。
  3. 1回/週 30分程度の計画停止 (メンテナンス・ウィンドウ) を考慮する必要がある。
  4. SYS, SYSTEM ユーザを使用できない。
  5. Alter system, Alter database も使用できない。 (一部の機能は代替機能が提供されています。)

・利用しているコンポーネント
 RDS に移行するにあたって、現在利用しているコンポーネントがRDS で利用可能か確認しておく必要があります。RDS では、標準以外のコンポーネントはオプション・グループで設定します。現在インストールされているコンポーネントは、dba_registry
ビューから確認可能です。また、以下の点について注意が必要です。

  1. Statspack のように、dba_registry にリストされないコンポーネントもありますので、DB に定義されているユーザ情報も併せて確認しておきましょう。
  2. DataGuard, Workspace Manager 等、現在RDS で使用できないコンポーネントもあります。
  3. RDS ではデフォルトのTimezone がUTC になっていますが、デフォルト以外の

Timezone を使用する場合も、オプション・グループで設定を行います。

  1. 移行後のチューニングに備えて、Statspack はオプション・グループに予め追加しておいた方が良いでしょう。

・利用しているデータベースの機能
RDS に移行する際に、データベースのEdition をEnterprise Edition からStandard Edition やStandard Edition One 等にダウングレードする場合は、Enterprise Edition の機能として提供されていた機能 (Parallel 処理, Index のOnline Rebuild, Flashback 操作等) が移行後は使用できなくなりますので、これらの機能を使用していないか確認が必要です。移行元環境でPartitioning を使用していて移行先のRDS がEnterprise Edition でない場合は、Metadata移行時にPartition 表を通常の表として再定義する必要があります。

・チューニングしているパラメータ
RDS インスタンスのパラメータは、チューニングしているパラメータがあればそのパラメータがRDS で同様に変更可能か確認しておく必要があります。隠しパラメータ等、パラメータ・オプションでは変更できないパラメータを変更する必要がある場合は、Logon Trigger と組み合わせる事で変更する事も可能です。
筆者が移行を行った環境では、LOB データを大量に使用している環境だったため、パラメータ・グループでDB_SECUREFILE=ALWAYS の設定を行いRDS インスタンスを作成する事で、LOB データへのアクセスを効率化しました。


・1回以上の事前リハーサル
移行の手順と移行に要する時間を把握するため、テスト環境でも構わないので1回以上の事前リハーサルを実施して下さい。実際に事前リハーサルを行った結果、『LOB データ型を含むテーブルをnetwork_link パラメータを指定してimpdp を行うと非常に時間がかかる』と言う問題が判明しましたが、本番移行までに対策を取る事ができました。
また、network_link パラメータを指定したimpdp は、Insert … select … from
table@dblink でデータの移行を行うため、LONG, LONG RAW データ型を含むテーブルについても使用できません。(LOB, LONG, LONG RAW データ型を含むテーブルは、dmp ファイル経由でexpdp/impdp を実施)
本書でも移行時と同様に、これらのデータ型を含むテーブルと含まないテーブルを別々に移行する事を前提としています。

impdp によるデータ移行に要する時間は、オンプレミス環境とRDS 環境間のネットワーク帯域の影響が大きいので、移行に要する時間を把握するためにリハーサルを実施する事は非常に重要です。

※ 以降の説明では、LOB 型, LONG 型, LONG RAW 型データを含むテーブルの扱いは同じ対応となるため、一括してLOB 型として記載します。


2.3 移行環境

本書では、以下の環境でimpdp/GoldenGate を使用してデータベースをRDS に移行する手順について、説明を行います。

項目

移行元環境 (オンプレミス)

移行先環境 (RDS)

OS

CentOS 5.9 x86-64

-

ホスト名

GGSRC

-

DB Version/Edition

10.2.0.4 Enterprise  Edition

12.1.0.1 v6 Standard Edition One

管理者ユーザ/パスワード

system/manager

rdsdba/rdsdba01

ORACLE_HOME

/opt/oracle/10.2.0

-

ORACLE_SID

ora1024

orcl

文字コード

AL32UTF8

AL32UTF8

GoldenGate Version

Capture用 : 11.1.1.1.0
Replicat用: 12.1.2.1.0

-

GoldenGate Install 先

Capture用 :/home/oracle/GG11.1
Replicat用:/home/oracle/GG12.1

-

Trail 出力/読込先

/home/oracle/GG/Trail

-


※ 移行元環境がOracle 10.2 の場合、GoldenGate は統合キャプチャが使用できないためクラシック・キャプチャを使用する事になります。クラシック・キャプチャではRedo Log を直接参照するため、以下のURL にあるようにGoldenGate Hub を作成するのではなくDB Server に直接GoldenGate をセットアップする事になります。
Replicat 側 のGoldenGate については、別マシンにセットアップする事も可能ですが、今回は移行対象のDB Server にセットアップを行いました。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/
Appendix.OracleGoldenGate.html

 

2.4 移行手順の流れ

RDS への移行手順の流れを、以下に示します。


2.5 共通事前作業

1. Oracle 12c Client Install

network_link パラメータを指定したimpdp を使用する場合は、impdp 先のDB Version 以降のimpdp コマンドを使用する必要があります。また、GoldenGate を使用する場合でも、GoldenGate が接続対象DB のClient Library を必要とするため、DB Server にOracle 12c Client をInstall しておきます。

Oracle 12c 用の環境変数を設定するenv ファイルも用意しておくと良いでしょう。

2.移行元容量, 文字コード等の確認

移行元環境の表領域サイズや文字コード等の確認を行います。
今回はスキーマ単位に移行を行うため、ツールでは移行されないProfile につい
ても確認しておきます。

確認に使用したスクリプトは、付録として添付します。

3. オプション・グループ, パラメータ・グループ, RDS インスタンスの作成

本作業は、純粋にRDS の作業なので説明は省略します。

4. TNS にRDS への接続文字列を定義

実際にRDS に接続するための接続文字列を、tnsnames.ora に設定します。
設定するのは、12c Client のtnsnames.ora だけで結構です。
※ impdp でデータ移行を行う場合は、移行元環境のTNS にも同じ設定が必要

になります。

-- tnsnames.ora 設定の例
rds =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = XXXXXXXXXX)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = orcl)
    )
  )


5. RDS に表領域作成

移行元環境の情報を基に、RDS に表領域 (永続, 一時) を作成します。

USERS, TEMP 等RDSインスタンス作成時に初期状態で作成される表領域については、初期容量や拡張サイズを変更しておきます。

-- 表領域作成の例
-- RDS はOMF で管理されるので、データファイル名は指定しない。
$ sqlplus rdsdba/rdsdba01@rds
SQL> Create bigfile tablespace DATA_XXXXXX datafile size XXXXM autoextend on
next XXm extent management local autoallocate segment space management auto;

SQL> Create bigfile tablespace IDX_XXXXXX datafile size XXXXM autoextend on
next XXm extent management local autoallocate segment space management auto;

-- 初期状態で作成される表領域は、ファイルサイズ, 拡張サイズの変更
SQL> Alter tablespace temp resize XXXXXM;
SQL> Alter tablespace temp autoexten on next XXm;
SQL> Alter tablespace users resize XXXXm;
SQL> Alter tablespace users autoextend on next XXm;
SQL> exit

※ RDS ではデフォルトでBigfile 表領域が作成されます。従来のSmallfile 表領域として表領域を作成したい場合は、表領域作成時にSmallfile キーワードを指定して下さい。


6. Profile の作成/修正

移行対象ユーザのProfile を確認して、初期状態で作成されているProfile 以外のProfile を使用している場合は作成します。初期状態で作成されているProfile の設定を変更している場合は、ここで変更を行います。

-- 新規Profile の作成
$ sqlplus rdsdba/rdsdba01@rds
SQL> Create profile rds_profile limit
       session_per_user  unlimited
       cpu_per_session   unlimited
                     :

-- 既存 Profile の変更
SQL> Alter profile default limit
       password_life_time unlimited;


7. MetadataをNetwork 経由でImport するために、RDS から移行元環境へのDB Link 作成


-- 12c 用の環境変数設定
$ . 12c.env

-- RDS に接続&DB Link 作成
$ sqlplus rdsdba/rdsdba01@rds
SQL> Create database link o1024 connect to system identified by manager
using '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=移行元環境のIP)(PORT=1521))(CONNECT_DATA=(SID=ora1024)))';

-- 確認
SQL> select host_name, instance_name from v$instance@o1024;
SQL> exit


8. Metadata Import

metadata をRDS にImport します。これにより、テーブルデータ以外(テーブル定義, 索引定義, オブジェクト権限付与等) がRDS に移行されます。

-- metadata Import

$ impdp rdsdba/rdsdba01@rds network_link=o1024 table_exists_action=skip
content=metadata_only schemas=移行対象スキーマ#1,移行対象スキーマ#2,
移行対象スキーマ#3,…,移行対象スキーマ#n exclude=statistics


9. 権限設定

MetadataのImport 中に以下のようなメッセージが出力されたら、RDS に管理者権限で接続して失敗したSQL を再実行します。

-- metadata Import 中に出力されるメッセージ
ORA-31685: 権限が不十分なため、オブジェクト型ROLE_GRANT:"SCOTT"が失敗しました。エラー文は次のとおりです:
 GRANT "CONNECT" TO "SCOTT"

ORA-31685: 権限が不十分なため、オブジェクト型ROLE_GRANT:"SCOTT"が失敗しました。エラー文は次のとおりです:
 GRANT "RESOURCE" TO "SCOTT"

-- 上記メッセージ出力時に実行するコマンド
$ sqlplus rdsdba/rdsdba01@rds
SQL> grant connect to scott;
SQL> grant resource to scott;
SQL> exit


10. 非ユニーク索引/参照整合性制約/Trigger 無効化

データロードの障害となる、非ユニーク索引/参照整合性制約/Trigger を無効化します。
非ユニーク索引/参照整合性制約/Trigger の有効化/無効化はスクリプトを作成して行います。

これらのスクリプトを作成するスクリプトは、付録として添付します。

-- 非ユニーク索引の無効化
$ cd ~/script

-- スクリプトの編集 (移行対象のスキーマを設定)
$ vi target_schema.sql
$ sqlplus rdsdba/rdsdba01@rds

-- 非ユニーク索引の有効化/無効化を行うスクリプト作成
SQL> @index.sql
Script unusable_index.sql was created.
Script rebuild_index.sql was created.

-- 非ユニーク索引の無効化
SQL> @unusable_index.sql

-- 索引の状態確認
SQL> @check_index.sql
SQL> exit

※ 本スクリプトは、Partition 索引に対応していません。

-- 参照整合性制約の無効化
$ sqlplus rdsdba/rdsdba01@rds

-- 参照整合性制約の有効化/無効化を行うスクリプト作成
SQL> @consistents.sql
Script disable_costraints.sql was created.
Script enable_costraints.sql was created.

-- 参照整合性制約の無効化
SQL> @disable_consistents.sql

-- 参照整合性制約の状態確認
SQL> @check_consistents.sql
SQL> exit

-- Trigger の無効化
$ sqlplus rdsdba/rdsdba01@rds

-- Triggerの有効化/無効化を行うスクリプト作成
SQL> @trigger.sql
Script disable_trigger.sql was created.
Script enable_trigger.sql was created.

-- Triggerの無効化
SQL> @disable_trigger.sql

-- Triggerの状態確認
SQL> @check_trigger.sql
SQL> exit


2.6 Impdp による移行手順

2.6.1 impdp を使用して移行する際の移行方法

以下にimpdp を使用して移行する際の移行方法を示します。

タイプ

移行方法

LOB列を含むテーブルを持たないスキーマ

network_link 経由のimpdp

LOB列を含むテーブル

スキーマ単位にdmp ファイル経由のexpdp/impdp
LOB列を含むテーブルをinclude パラメータで指定

LOB列を含まないテーブル

スキーマ単位にnetwork_link 経由のimpdp
LOB 列を含むテーブルはexclude パラメータで除外

2.6.2 impdp による移行手順の流れ

mpdp を使用して移行する際の移行手順を以下に示します。

2.7 Impdp による移行

1. 移行元のTNS にRDS への接続文字列設定

LOB 列を含むテーブルについては、dmp ファイルを経由したexpdp/impdp を行います。expdp で作成されたdmp ファイルをRDS に転送するために、移行元のTNS にRDS への接続文字列を設定します。

-- tnsnames.ora 設定の例
rds =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = XXXXXXXXXX)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = orcl)
    )
  )

2. dmp ファイルの転送に使用する、DB Link を作成します。

-- DB Link 作成
$ cd ~/script
$ sqlplus system/manager
SQL> Create database link rds_link connect to rdsdba
identified by rdsdba01 using 'rds';

-- 確認

SQL> select host_name, instance_name from v$instance@rds_link;

3. LOB 列を持つテーブルの情報を確認します。

-- LOB 列を持つテーブルの情報確認
SQL> @lob_column.sql
→ LOB 列の詳細と、LOB 列を持つテーブルの一覧が表示されます。

4. network_linkを指定したimpdp (LOB 列を含むテーブルを持たないスキーマ)


LOB 列を含むテーブルを持たないスキーマを一括してimpdp します。

(oracle12c のimpdp を使用します。)

-- 12c 用の環境変数設定
$ . ~/12c.env

-- impdp
$ impdp rdsdba/rdsdba01@rds network_link=o1024 table_exists_action=append \
content=data_only schemas=スキーマ#1,スキーマ#2,…,スキーマ#n \
logfile=nolob_shcema.log

5. network_link を指定したimpdp (LOB 列を持たないテーブル)

LOB 列を持たないテーブルを、スキーマ単位にimpdp します。
(Oracle12c のimpdp を使用して、LOB列を含むテーブルをexclude で除外します。)

-- 12c 用の環境変数設定
$ . ~/12c.env

-- impdp
$ impdp rdsdba/rdsdba01@rds network_link=o1024 schemas=スキーマ  \
exclude=TABLE:\"IN \(\'除外テーブル#1\', \'除外テーブル#2\',…, \
\'除外テーブル#n'\)\" content=data_only table_exists_action=append \
logfile=nolob1.log

6. LOB 列を含むテーブルの移行

LOB 列を含むテーブルの移行はこれまでの手順と異なり複数の操作が必要になります。操作する環境も操作毎に異なりますので、実際に作業する場合は複数の端末を開いて操作を行うと良いでしょう。

-- ① 移行元環境でexpdp (移行元環境に接続する設定)
      expdp するテーブルをinclude で指定します。

$ expdp system/manager directory=data_pump_dir schemas=スキーマ \
include=TABLE:\"IN \(\'LOBテーブル#1\', \'LOBテーブル#2\',…, \
\'LOBテーブル#n'\)\" content=data_only dumpfile=lob_tab1.dmp \
logfile=lob_tab1.log

-- ② dmp ファイルの転送
     dmp ファイルをRDS に転送します。移行元環境にSQL*Plus で接続して
DB Link 経由でdmp ファイルを転送します。

$ sqlplus system/manager
SQL> dbms_file_transfer.put_file('DATA_PUMP_DIR', 'lob_tab1.dmp',
'DATA_PUMP_DIR', ' lob_tab1.dmp', 'rds_link');

-- ③ impdp を使用してRDS にImport を行います。
     Oracle10g/Oracle12c どちらのimpdp を使用しても構いません。

$ impdp rdsdba/rdsdba01@rds directory=DATA_PUMP_DIR dumpfile=lob_tab1.dmp \
content=data_only

-- ④ Import が完了したら使用したdmp ファイルを削除します。
     RDS に接続したSQL*Plus からファイルを削除します。

-- 12c 用の環境変数設定
$ . ~/12c.env

-- SQL*Plus からファイル削除
$ sqlplus rdsdba/rdsdba01@rds
SQL> exec utl_file.fremove('DATA_PUMP_DIR', 'lob_tab1.dmp');


 

2.8  GoldenGate による移行手順

2.8.1 GoldenGate について

GoldenGate はOracle だけでなく他社製のデータベースも含めて、データレプリケーションを行うための製品です。
以前にもAqua Lab. で取り上げていますので、ご興味のある方は是非ご一読下さい。
http://www.aqua-systems.co.jp/aqua-lab/index.html

Amazon が公開しているRDS User Guide にGoldenGateを使用したデータレプリケーションの方法が記載されていますが、以下の点にご注意下さい。
・GoldenGate は統合キャプチャモードでの動作を前提としているため、11.2.0.3+Patch#13328193 又は11.2.0.4 以降のみサポートとなっています。
本書の例のようにクラシック・キャプチャを使用すれば、11.2.0.3 以前のデータベースからもデータレプリケーションが可能です。(但し、DB Server へのGoldenGate のInstall が必要)
・User Guide の設定では、初期同期は行われません。 (新たなトランザクションによって生成されたデータのみ同期されます。)
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/
Appendix.OracleGoldenGate.html


本書では初期同期もGoldenGate を使用して行う方法を紹介していますが、大量のデータを一気に反映させるような処理はGoldenGate には不向きな処理となります。初期同期のように大量データを一気に反映させるような処理は、可能な限りimpdp を使用する方が良いでしょう。

2.8.2 GoldenGate による移行手順の流れ

GoldenGate を使用して移行を行う手順を以下に示します。

2.8.3 GoldenGate による移行手順

1. GoldenGate Install

DB Server にCapture 用GoldenGate とReplicat 用GoldenGate をそれぞれInstall します。

-- Capture 用GoldenGate Install
-- Capture 用GoldenGate (11.1.1.1) は、Install 先ディレクトリにファイルを解凍
-- するだけです。
[oracle@GGSRC ~]$ mkdir GG11.1
[oracle@GGSRC ~]$ cd install/GG11.1/
[oracle@GGSRC GG11.1]$ unzip V28939-01.zip
[oracle@GGSRC GG11.1]$ tar xvf fbo_ggs_Linux_x64_ora10g_64bit.tar \
-C /home/oracle/GG11.1

-- Replicat 用GoldenGate Install
-- Replicat 用GoldenGate (12.1.2.1) は、OUI からInstall を行いますので、
-- TeraTerm 端末ではなく、GUI から作業を行って下さい。
[oracle@GGSRC ~]$ mkdir GG12.1
[oracle@GGSRC ~]$ cd install/GG12c/
[oracle@GGSRC GG12c]$ unzip V46695-01.zip
[oracle@GGSRC GG12c]$ cd fbo_ggs_Linux_x64_shiphome/Disk1
[oracle@GGSRC Disk1]$ ./runInstaller
→ OUI の指示に従ってInstall します。
  現段階ではOracle12c のClient Library を参照するように環境変数を設定して
いないので、ここではManager の起動は行わないで下さい。

2. SubDir 作成

それぞれの環境のGoldenGate で必要となるディレクトリを作成します。

-- Capture 用GoldenGate SubDir 作成

[oracle@GGSRC ~]$ cd GG11.1/
[oracle@GGSRC GG11.1]$ ./ggsci
GGSCI (GGSRC) 1> Create subdirs
GGSCI (GGSRC) 2> exit

-- Replicat 用GoldenGate SubDir 作成

-- 12c 用の環境変数設定
[oracle@GGSRC ~]$ . 12c.env
[oracle@GGSRC ~]$ cd GG12.1/
[oracle@GGSRC GG12.1]$ ./ggsci
GGSCI (GGSRC) 1> Create subdirs
GGSCI (GGSRC) 2> exit

※ 以降、Replicat 用のGoldenGate 設定を行う端末には、12c 用の環境変数が設定されているものとします。

3. GoldenGate 用表領域/ユーザ作成

それぞれの環境に、GoldenGate 用表領域/同期用ユーザを作成します。

-- Capture 側 GoldenGate 用表領域/ユーザ作成
[oracle@GGSRC GG11.1]$ sqlplus "/ as sysdba"
SQL> Create tablespace ggs_tbs datafile
'/opt/oracle/oradata/ora1024/ggs_tbs.dbf' size 64M
       autoextend on next 16M maxsize 256M;

SQL> Create user ggs identified by ggs default tablespace ggs_tbs
temporary tablespace temp
       quota unlimited on ggs_tbs;

SQL> grant connect, resource, dba to ggs;
SQL> exit

-- Replicat 側 GoldenGate 用表領域/ユーザ作成
[oracle@GGSRC GG12.1]$ sqlplus rdsdba/rdsdba01@rds

-- RDS はOMF で管理されているので、データファイルパスは指定しない。
SQL> Create tablespace ggs_tbs datafile size 64M
       autoextend on next 16M maxsize 256M;

SQL> Create user ggs identified by ggs default tablespace ggs_tbs
temporary tablespace temp
       quota unlimited on ggs_tbs;

SQL> grant connect, resource, dba to ggs;
SQL> exit

4. Manager 起動

それぞれの環境でManager の設定ファイルを作成して起動する。

-- Capture 側 Manager 設定/起動
[oracle@GGSRC GG11.1]$ ./ggsci
GGSCI (GGSRC) 1> edit params mgr
PORT 7450
DYNAMICPORTLIST 9001-9100

GGSCI (GGSRC) 2> start mgr
Manager started.

GGSCI (GGSRC) 3> info all
Program     Status      Group       Lag           Time Since Chkpt
MANAGER     RUNNING

GGSCI (GGSRC) 4> info mgr
Manager is running (IP port GGSRC.7450).

GGSCI (GGSRC) 5> exit

-- Replicat 側 Manager 設定/起動
-- この後使用する、Checkpoint Table, GG Schema の設定も行っておく。

[oracle@GGSRC GG12.1]$ ./ggsci
GGSCI (GGSRC) 1> edit params ./GLOBALS
CHECKPOINTTABLE ggs.ggschkpt
GGSCHEMA ggs

-- Capture 側と同一マシンに定義するので、Port 番号を変える
-- Trail のPurge はここで設定する。
GGSCI (GGSRC) 2> edit params mgr
PORT 7550
DYNAMICPORTLIST 9101-9200
PURGEOLDEXTRACTS /home/oracle/GG/Trail/t*, USECHECKPOINTS

GGSCI (GGSRC) 3> start mgr
Manager started.

GGSCI (GGSRC) 4> info all
Program     Status      Group       Lag           Time Since Chkpt
MANAGER     RUNNING

GGSCI (GGSRC) 5> info mgr
Manager is running (IP port GGSRC.7550, Process ID 32181).

GGSCI (GGSRC) 6> exit

5. Checkpoint Table 作成

Replicat 側の環境にCheckpoint Table を作成します。

-- Replicat 側 環境にCheckpoint Table を作成する。
[oracle@GGSRC GG12.1]$ ./ggsci

GGSCI (GGSRC) 1>  dblogin userid ggs@rds, password ggs
Successfully logged into database.

GGSCI (GGSRC as ggs@ORCL) 2> add checkpointtable
No checkpoint table specified. Using GLOBALS specification (ggs.ggschkpt)...
Successfully created checkpoint table ggs.ggschkpt.

GGSCI (GGSRC as ggs@ORCL) 3> exit

6. 移行元環境でDB Supplemental Logging を有効化する。

-- Capture 側環境で、DB のSupplemental Logging を有効化する。
[oracle@GGSRC GG11.1]$ sqlplus "/ as sysdba"
SQL> alter database add supplemental log data;
SQL> alter system switch logfile;

-- 確認
SQL> select supplemental_log_data_min from v$database;
SUPPLEME
--------
YES

SQL> exit

7. 対象表のSupplemental Logging を有効化する。

-- Capture 側環境で、DB のSupplemental Logging を有効化する。
[oracle@GGSRC GG11.1]$ sqlplus "/ as sysdba"
GGSCI (GGSRC) 1> dblogin userid ggs, password ggs
Successfully logged into database.

-- 確認
GGSCI (GGSRC) 2> info trandata scott.*
Logging of supplemental redo log data is disabled for table SCOTT.BONUS.
Logging of supplemental redo log data is disabled for table SCOTT.DEPT.
Logging of supplemental redo log data is disabled for table SCOTT.EMP.
Logging of supplemental redo log data is disabled for table SCOTT.SALGRADE.

-- 有効化
GGSCI (GGSRC) 3> add trandata scott.*
2016-11-02 11:45:44  WARNING OGG-00869  No unique key is defined for table BONUS. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.

Logging of supplemental redo data enabled for table SCOTT.BONUS.
Logging of supplemental redo data enabled for table SCOTT.DEPT.
Logging of supplemental redo data enabled for table SCOTT.EMP.
2016-11-02 11:45:45  WARNING OGG-00869  No unique key is defined for table SALGRADE. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.
Logging of supplemental redo data enabled for table SCOTT.SALGRADE.

-- 再確認
GGSCI (GGSRC) 4> info trandata scott.*
Logging of supplemental redo log data is enabled for table SCOTT.BONUS
Logging of supplemental redo log data is enabled for table SCOTT.DEPT
Logging of supplemental redo log data is enabled for table SCOTT.EMP
Logging of supplemental redo log data is enabled for table SCOTT.SALGRADE

GGSCI (GGSRC) 5> exit

8. 初期同期プロセスの定義

それぞれの環境に初期同期プロセスを定義します。

-- Capture 側環境で、初期同期プロセスを定義する。
-- Extract のパラメータに、SOURCEISTABLE を指定する事で、テーブルからデータを
-- 読込みTrail ファイルを出力します。

[oracle@GGSRC GG11.1]$ ./ggsci
GGSCI (GGSRC) 1> edit params ext-init
SOURCEISTABLE
USERID ggs, PASSWORD ggs
RMTHOST localhost, MGRPORT 7550
RMTFILE /home/oracle/GG/Trail/in
TABLE scott.*;

-- Replicat 側環境で、初期同期プロセスを定義する。
-- Replicat のパラメータに、SPECIALRUN パラメータを指定する事で、
-- ワンタイム実行用のプロセスである事を指定する。
-- SPECIALRUN を指定した場合は、END パラメータも指定する。

[oracle@GGSRC GG12.1]$ ./ggsci
GGSCI (GGSRC) 1> edit params rep-init
SPECIALRUN
END RUNTIME
USERID ggs@rds, PASSWORD ggs
EXTFILE /home/oracle/GG/Trail/in
ASSUMETARGETDEFS
MAP scott.*, TARGET scott.*;

9. Online 同期プロセスの定義

それぞれの環境にOnline 同期プロセスを定義します。

-- Capture 側環境で、Online 同期プロセスを定義する。

GGSCI (GGSRC) 2> edit params ext01
EXTRACT EXT01
SETENV (ORACLE_HOME=/opt/oracle/10.2.0)
SETENV (ORACLE_SID=ora1024)
SETENV (NLS_LANG=Japanese_Japan.AL32UTF8)
USERID ggs, PASSWORD ggs
RMTHOST GGHUB, MGRPORT 7550
RMTTRAIL /home/oracle/GG/Trail/ol

IGNOREREPLICATES
GETAPPLOPS
TRANLOGOPTIONS EXCLUDEUSER ggs
TABLE scott.*;

GGSCI (GGSRC) 3> add extract EXT01, tranlog, begin now
EXTRACT added.

GGSCI (GGSRC) 4> add rmttrail /home/oracle/GG/Trail/ol, extract EXT01, MEGABYTES 5
RMTTRAIL added.

-- Replicat 側環境で、Online 同期プロセスを定義する。
-- 初期同期プロセスがCapture したデータを、Online 同期プロセスが再度Capture して
-- 反映処理を行う可能性があるため、重複キーエラー (1) と該当レコード無し (1403)
-- については処理を継続するように指定しておく

GGSCI (GGSRC) 2> edit params rep01REPLICAT REP01
USERID ggs@rds, PASSWORD ggs
ASSUMETARGETDEFS
REPERROR (1, DISCARD)
REPERROR (1403, DISCARD)
MAP scott.*, TARGET scott.*;

GGSCI (GGSRC) 3> add replicat REP01, EXTTRAIL /home/oracle/GG/Trail/ol
REPLICAT added.

GGSCI (GGSRC) 4> exit

10. Online 同期 Extract プロセスの実行

-- Capture 側環境で、Online 同期 Extract プロセスを実行する。
-- 本プロセスを初期同期のプロセスに先立って実行する事により、初期同期プロセス
-- の実行以降に行われた変更を漏れなくCapture します。

[oracle@GGSRC GG11.1]$ ./ggsci
GGSCI (GGSRC) 1> start extract ext01
Sending START request to MANAGER ...
EXTRACT EXT01 starting

GGSCI (GGSRC) 2> info all
Program     Status      Group       Lag           Time Since Chkpt
MANAGER     RUNNING
EXTRACT     RUNNING     EXT01       00:02:40      00:00:00

GGSCI (GGSRC) 3> exit

11. Sequence のFlush

Sequence を同期対象に含める場合は、移行元環境で本操作を実行します。

-- Sequence を同期対象に含める場合に実施
-- 必要なProcedure 等を作成

[oracle@GGSRC GG11.1]$ sqlplus "/ as sysdba"
SQL> @sequence.sql
Please enter the name of a schema for the GoldenGate database objects:
ggs   <-- 入力
             :
STATUS OF SEQUENCE SUPPORT
--------------------------------------------------------------
SUCCESSFUL installation of Oracle Sequence Replication support

SQL> exit

-- Sequence のFlush
[oracle@GGSRC GG11.1]$ ./ggsci

GGSCI (GGSRC) 1> dblogin userid ggs, password ggs
Successfully logged into database.

GGSCI (GGSRC) 2> flush sequence scott.*
Successfully flushed 2 sequence(s) SCOTT.*

GGSCI (GGSRC) 3> exit

12. 初期同期 Extract プロセスの実行

-- 移行元環境で初期同期 Extract プロセスを実行する。

[oracle@GGSRC GG11.1]$ ./extract paramfile dirprm/ext-init.prm \
reportfile  ./dirrpt/init-load.txt
→ 処理が完了するまで、待機します。

-- 処理が完了したら、Report ファイルからエラーが発生していない事を確認します。
[oracle@GGSRC GG11.1]$ vi ./dirrpt/init-load.txt

13. 初期同期 Replicat プロセスの実行

DB Server にCapture 用GoldenGate とReplicat 用GoldenGate をそれぞれInstall します。

-- 移行先環境で初期同期 Replicat プロセスを実行する。

[oracle@GGSRC GG12.1]$ ./replicat paramfile dirprm/rep-init.prm \
reportfile  ./dirrpt/init-load.txt
→ 処理が完了するまで、待機します。

-- 処理が完了したら、Report ファイルからエラーが発生していない事を確認します。
[oracle@GGSRC GG12.1]$ vi ./dirrpt/init-load.txt

14. Online 同期用 Replicat プロセスの実行

-- 移行先環境でOnline 同期用 Replicat プロセスを実行する。

[oracle@GGSRC GG12.1]$ ./ggsci
GGSCI (GGSRC) 1> start replicat rep01
Sending START request to MANAGER ...
REPLICAT REP01 starting

GGSCI (GGSRC) 2> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING
REPLICAT    RUNNING     REP01       00:00:00      00:00:01

GGSCI (GGSRC) 3> exit

 

2.8.4 GoldenGate の制限事項

GoldenGate を使用してデータ同期を行う場合、使用するGoldenGate のVersion や使用するCapture のモード (クラシック・キャプチャ or 統合キャプチャ) によってレプリケート可能なデータ型やオブジェクトの種類が若干異なります。制限事項の詳細については、Version 毎のマニュアルで確認して頂くとして、ここでは代表的な制限事項について記載します。

1. クラシック・キャプチャ, 統合キャプチャでサポートされないデータ型

・スカラー, LOB, VARRAYS, ネストされた表やREFs ANYDATA による抽象データ型

・ANYDATASET, ANYTYPE, MLSLABEL, BFILE, ORDDICOM, URITYPE, TIMEZONE_ABBR, UROWID

2. クラシック・キャプチャではサポートされないデータ型/オブジェクト

・オブジェクト・リレーショナルとして格納されたXML
・基本圧縮, OLTP 圧縮, Exadata Hybrid Columnar Compression で圧縮されたテーブルからのキャプチャ

・RAC データベース上のXA

3. 標準表のサポートの制限

・列の長さが2MB までの行数が含まれている表がサポートの対象

・文字型LOB, LONG 列の最大サイズは4KB, BLOB 列の最大サイズは8KB

4. Sequenceのサポート制限

・Active/Active 双方向構成での順序値のレプリケーションはサポートされません。

5. DDL 操作

・Cluster, Function, Index, Table Trigger 等、一般的なオブジェクトに対するDDL はサポートされますが、DDL のサイズは最大2MB に制限されています。

 

Oracle GoldenGate のバージョン毎のマニュアルは、下記URL から参照可能です。
http://www.oracle.com/technetwork/jp/middleware/goldengate/
documentation/goldengate-098310-ja.html

 

2.9 共通事後作業

1. 非ユニーク索引/参照整合性制約/Trigger 有効化

データのロードに先立って無効化した、非ユニーク索引/参照整合性制約/

Trrigger を有効化します。ここでは、先に作成したスクリプトを直接実行していますが、実際に作業する場合はデータ移行が完了したスキーマから順にスクリプトの内容を並列で実行するのが良いでしょう。

-- 非ユニーク索引の有効化
$ cd ~/script

$ sqlplus rdsdba/rdsdba01@rds
SQL> @rebuild_index.sql

-- 索引の状態確認
SQL> @check_index.sql
SQL> exit

-- 参照整合性制約の有効化
$ sqlplus rdsdba/rdsdba01@rds
SQL> @enable_consistents.sql

-- 参照整合性制約の状態確認
SQL> @check_consistents.sql
SQL> exit

-- Triggerの有効化
$ sqlplus rdsdba/rdsdba01@rds
SQL> @enable_trigger.sql

-- triggerの状態確認
SQL> @check_trigger.sql
SQL> exit

2. 統計情報取得

非ユニーク索引の有効化まで完了したら、データベースへのアクセスを安定化させるため、以下の統計情報を取得します。
・移行したスキーマ
・ディクショナリ

・固定オブジェクト

-- スキーマ毎の統計情報取得
$ sqlplus rdsdba/rdsdba01@rds
SQL> exec dbms_stats.gather_schema_stats(ownname=>'移行対象スキーマ#1', cascade=>true);
SQL> exec dbms_stats.gather_schema_stats(ownname=>'移行対象スキーマ#2', cascade=>true);
SQL> exec dbms_stats.gather_schema_stats(ownname=>'移行対象スキーマ#3', cascade=>true);
SQL> exec dbms_stats.gather_schema_stats(ownname=>'移行対象スキーマ#4', cascade=>true);
                 :

-- ディクショナリの統計情報取得
SQL> exec dbms_stats.gather_dictionary_stats;

-- 固定オブジェクトの統計情報取得
SQL> exec dbms_stats.gather_fixed_objects_stats;
SQL> exit

3. DB Link 削除

expdp で作成したdmp ファイルの転送や、Network_link でのimpdp を行うために作成したDB Link を削除します。

-- dmp ファイルの転送に使用したDB Link の削除 (移行元環境)
$ sqlplus system/manager
SQL> drop database link rds_link;
SQL> exit

-- network_link 経由のimpdp で使用したDB Linkの削除 (RDS環境)
$ sqlplus rdsdba/rdsdba01@rds
SQL> drop database link o1024;
SQL> exit

4. Statspack 有効化/自動Snapshot 取得設定

性能問題発生時にデータベースのボトルネックを調査するためにStatspack を有効化して自動Snapshot を有効化しておきます。

-- Statspack の有効化
$ sqlplus rdsdba/rdsdba01@rds
SQL> Alter user perfstat identified by perfstat account unlock;
SQL> exit

-- Snapshot 取得確認
$ sqlplus perfstat/perfstat@rds
SQL> exec statspack.snap;
SQL> select snap_id, to_char(snap_time, 'YYYY/MM/DD HH24:MI:SS'), snap_level
       from stats$snapshot order by 1;

--> エラーが発生せず、Snapshot が取得できていればOk

-- Snapshot 自動取得設定 (1時間毎)
SQL> variable jobno number;
SQL> variable instno number;
SQL> begin
       select instance_number into :instno from v$instance;
       dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
       commit;
     end;
     /

SQL> print jobno
・同等のスクリプトが、$ORACLE_HOME/rdbms/admin/spauto.sql として提供されていますのでこのスクリプトを実行してもOk です。

・Snapshot の自動取得はDBMS_JOB を使用しているため、JOB_QUEUE_PROCESSES 初期化パラメータを1以上に設定しておく必要があります。

 

3. まとめ

以上でオンプレミス環境のOracle データベースをRDS に移行する事ができました。
RDS は2.2 に挙げたような制限事項がありますが、逆にRDS に移行する事によって、以下のようなメリットも受ける事ができます。
・従量課金制による、ライセンス料の削減
・Backup やPatch 適用等の運用作業からの解放
・Multi-az による冗長構成を、Edition に関係無く構築可能
・Provisioned IOPS による高速ストレージや、スケールアップが容易
本書が、RDS へのDB 移行を検討されている方にとっての一助になれば幸いです。

今回は移行先としてStandard Edition One を選択したため使用できませんでしたが、Enterprise Edition を選択すればimpdp でParallel 処理を行わせる事も可能です。

4. 参考URL

AWS Database Migration Service (DMS)
https://aws.amazon.com/jp/dms/


DMS ユーザーズガイド (英語版)
http://docs.aws.amazon.com/ja_jp/dms/latest/userguide/dms-ug.pdf


DMS がサポートするデータ型
https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/
CHAP_Reference.Source.Oracle.DataTypes.html


DMS でLOB データ型のサポートについて
http://docs.aws.amazon.com/dms/latest/userguide/
CHAP_Introduction.LOBSupport.html


Amazon RDS での Oracle へのデータのインポート
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/
Oracle.Procedural.Importing.html


Amazon RDS での Oracle GoldenGate の使用
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/
Appendix.OracleGoldenGate.html


GoldenGate FAQ
http://www.oracle.com/technetwork/jp/middleware/goldengate/learnmore/
gg-faq-1849133-ja.pdf


GoldenGate がサポートするOS/DB Version
GoldenGate 11gR1
http://www.oracle.com/technetwork/middleware/data-integration/
goldengate1111-cert-matrix-349179.xls

GoldenGate 11gR2
http://www.oracle.com/technetwork/middleware/data-integration/
goldengate1121-cert-matrix-1522269.xls

GoldenGate 12c
http://www.oracle.com/technetwork/middleware/fusion-middleware/
documentation/fmw-1212certmatrix-1970069.xls



前の記事
吉田宗弘

Oracle歴20年。Orace7.2からExadataまで経験していて、マニュアルをほぼ暗記するほどどっぷり浸かっています。 気分転換にGoldenGate、Coherence、その他NoSQLデータベースなどのプロダクトをやることもあります。
Oracle以外だと古代史オタクといっていいくらい本を大量に読んでいて、京都のお寺巡りなどやっています。



金永昊
韓国出身エンジニア。韓国留学中だった日本人の奥さんと結婚して2007年に来日。WEB・オープン系開発者を経てアクアシステムズでデータベース・エンジニアとして、DBA関連の仕事を担当。
最近は、日本でもリリースされたTibero RDBMSとOracle社の最先端技術であるOracle Exadataの仕事ができてウキウキしている。


関口隆二
インフラ、ネットワークエンジニアとして、機器のラッキング、L7SW構築からDB構築までを担当。
OSI参照モデルのL1からL7までカバーすべく、広く浅くをモットーに業務を遂行してます。
趣味は登山と散歩。歩くことが大好きで常に重い荷物を持ってます。家族と山とアンパン(ツブアンのみ)をこよなく愛する30代です。

アクアシステムズの製品・サービスに関するお問合せはこちら

アクアシステムズは、データベーススペシャリストの立場から、データベースの堅牢性とパフォーマンスの向上を追求しています。