Data Transmission Service (DTS) を使用して、自己管理 Oracle データベースから AnalyticDB for PostgreSQL インスタンスへデータを同期します。DTS はスキーマ同期、初期完全同期、および増分同期をサポートしており、運用中の Oracle データベースと分析ワークロードとの間で、最小限のダウンタイムでデータを常に最新の状態に保ちます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
バージョン 9i、10g、11g、12c、18c、または 19c の Oracle データベースが実行中であること
Oracle データベースが ARCHIVELOG モードで実行されており、アーカイブログがアクセス可能で、適切な保持期間が設定されていること。詳細については、「アーカイブ・リドゥ・ログ・ファイルの管理」をご参照ください。
Oracle データベースに対して補足ログが有効化されており、`SUPPLEMENTAL_LOG_DATA_PK` および `SUPPLEMENTAL_LOG_DATA_UI` が有効になっていること。詳細については、「補足ログ」をご参照ください。
宛先となる AnalyticDB for PostgreSQL インスタンスが作成済みであること。詳細については、「インスタンスの作成」をご参照ください。
課金
| 同期タイプ | 料金 |
|---|---|
| スキーマ同期および初期完全同期 | 無料 |
| 増分同期 | 課金済み。詳細については、「課金概要」をご参照ください。 |
サポートされる同期トポロジ
単方向 1 対 1 同期
単方向 1 対多 同期
単方向 多対 1 同期
単方向 カスケード同期
詳細については、「同期トポロジ」をご参照ください。
同期可能な SQL 操作
| 操作タイプ | SQL ステートメント |
|---|---|
| DML | INSERT、UPDATE、DELETE |
| DDL | ADD COLUMN |
制限事項
ソースデータベースの制限事項
テーブルには PRIMARY KEY または一意制約(すべてのフィールドが一意)が必要です。該当しない場合、宛先データベースに重複レコードが発生する可能性があります。
Oracle 12c 以降では、テーブル名の長さは 30 バイトを超えてはなりません。
テーブルを同期オブジェクトとして選択し、宛先でテーブル名またはカラム名を変更する場合、1 つのタスクで最大 1,000 個のテーブルをサポートします。1,000 個を超える場合は、複数のタスクを設定するか、代わりにデータベース全体を同期してください。
Express Connect 経由で接続された Oracle Real Application Cluster (RAC) データベースの場合、タスク設定時に仮想 IP アドレス (VIP) を指定してください。SCAN IP アドレスはサポートされておらず、VIP 設定後はノードフェイルオーバーも利用できません。
アーカイブログおよびリドゥログの有効化が必要です。ログの保持期間に関する要件:ログの保持期間が短すぎると、DTS がログを読み取れず、タスク失敗やデータ損失を引き起こす可能性があります。初期完全同期完了後は、保持期間を 24 時間に短縮できます。
同期タイプ 最低保持期間 増分同期のみ 24 時間 初期完全同期および増分同期 7 日間 同期タスク実行中にソースデータベースでプライマリ/セカンダリ スイッチオーバーが発生した場合、タスクは失敗します。
その他の制限事項
DTS は、テーブル、インデックス、制約、関数、シーケンス、ビューの初期スキーマ同期をサポートしています。
警告Oracle および AnalyticDB for PostgreSQL は異種データベースです。スキーマ同期では、ソースと送信先のスキーマが一致することを保証しません。同期前にデータの型変換の影響を評価してください。詳細については、「スキーマ同期のためのデータの型マッピング」をご参照ください。
DTS はデータベースのトリガーと互換性がありません。データの不整合を防ぐために、同期前にソースデータベース内のトリガーを削除します。詳細については、「ソースデータベースにトリガーが含まれる場合のデータ同期タスクの設定」をご参照ください。
パーティションテーブルの場合、DTS はパーティション定義を破棄します。宛先データベースでは手動でパーティションを定義してください。
スキーマ同期中、DTS は外部キーを宛先データベースへ同期します。初期完全同期および増分同期中、DTS はセッションレベルで外部キー制約チェックおよびカスケード操作を一時的に無効化します。同期中にソースデータベースでカスケード更新および削除操作を実行すると、データの不整合を引き起こす可能性があります。
非ピーク時間帯に同期タスクを実行してください。初期完全同期は、ソースおよび宛先データベースの読み取り/書き込みリソースを消費します。
初期完全同期中、同時 INSERT 操作により、宛先データベースでテーブルの断片化が発生します。初期完全同期完了後、宛先の表領域はソースの表領域よりも大きくなります。
DTS は、宛先で最新に同期されたデータのタイムスタンプとソースの現在時刻を比較することで同期遅延を算出します。DML 操作が長期間行われていないと、同期遅延の測定値が不正確になる可能性があります。遅延を更新するには、ソースデータベースで DML 操作を実行してください。データベース全体を同期する場合は、1 秒ごとにデータを受信するハートビートテーブルを作成することを検討してください。
同期中は、宛先データベースへの書き込みを DTS を通じてのみ行ってください。Data Management (DMS) を通じたオンライン DDL 操作など、他のツールを使用して書き込むと、宛先データベースでデータ損失が発生する可能性があります。
必要なデータベースアカウント権限
| データベース | 必要な権限 | 参考情報 |
|---|---|---|
| 自己管理 Oracle データベース | DBA | CREATE USER および GRANT |
| AnalyticDB for PostgreSQL インスタンス | 宛先データベースへの書き込み権限 | 初期アカウントには必要な権限が付与されています。詳細については、「データベースアカウントの作成」をご参照ください。`RDS_SUPERUSER` 権限を持つアカウントも許可されます。詳細については、「ユーザーおよび権限の管理」をご参照ください。 |
細かい粒度の権限の付与(DBA 権限の代替)
Oracle データベースアカウントに DBA 権限を付与できない場合は、アーカイブログおよび補足ログを有効化したうえで、細かい粒度の権限を付与してください。
ステップ 1:アーカイブログの有効化
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
archive log list;ステップ 2:補足ログの有効化
ビジネス要件に応じて、データベースレベルまたはテーブルレベルで補足ログを有効化します。
データベースレベルの補足ログは、DTS タスクの安定性を確保します。テーブルレベルの補足ログは、ソース Oracle データベースのディスク使用率を削減します。
データベースレベルの補足ログ:
-- 最小補足ログを有効化
alter database add supplemental log data;
-- プライマリキーおよび一意なインデックスの補足ログを有効化
alter database add supplemental log data (primary key, unique index) columns;テーブルレベルの補足ログ:
-- 最小補足ログを有効化
alter database add supplemental log data;
-- 特定テーブルのプライマリキー補足ログを有効化
alter table <table_name> add supplemental log data (primary key) columns;
-- または特定テーブルの全カラムに対する補足ログを有効化
alter table <table_name> add supplemental log data (all) columns;ステップ 3:細かい粒度の権限の付与
Oracle のバージョンおよびアーキテクチャに合ったスクリプトを選択してください。
Oracle 9i、10g、および 11g
-- rdsdt_dtsacct というデータベースアカウントを作成し、権限を付与
create user rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant resource to rdsdt_dtsacct;
grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
grant select on V_$LOGMNR_LOGS to rdsdt_dtsacct;
grant select on all_objects to rdsdt_dtsacct;
grant select on all_tab_cols to rdsdt_dtsacct;
grant select on dba_registry to rdsdt_dtsacct;
grant select any table to rdsdt_dtsacct;
grant select any transaction to rdsdt_dtsacct;
grant select on v_$log to rdsdt_dtsacct;
grant select on v_$logfile to rdsdt_dtsacct;
grant select on v_$archived_log to rdsdt_dtsacct;
grant select on v_$parameter to rdsdt_dtsacct;
grant select on v_$database to rdsdt_dtsacct;
grant select on v_$active_instances to rdsdt_dtsacct;
grant select on v_$instance to rdsdt_dtsacct;
grant select on v_$logmnr_contents to rdsdt_dtsacct;
grant select on sys.USER$ to rdsdt_dtsacct;
grant select on SYS.OBJ$ to rdsdt_dtsacct;
grant select on SYS.COL$ to rdsdt_dtsacct;
grant select on SYS.IND$ to rdsdt_dtsacct;
grant select on SYS.ICOL$ to rdsdt_dtsacct;
grant select on SYS.CDEF$ to rdsdt_dtsacct;
grant select on SYS.CCOL$ to rdsdt_dtsacct;
grant select on SYS.TABPART$ to rdsdt_dtsacct;
grant select on SYS.TABSUBPART$ to rdsdt_dtsacct;
grant select on SYS.TABCOMPART$ to rdsdt_dtsacct;
grant select on v$database to rdsdt_dtsacct;
grant select on dba_objects to rdsdt_dtsacct;
grant select on DBA_TAB_COMMENTS to rdsdt_dtsacct;
grant select on dba_tab_cols to rdsdt_dtsacct;Oracle 12c ~ 19c(マルチテナントアーキテクチャ)
まずプラガブル・データベース(PDB)で、次にコンテナデータベース(CDB)で以下のコマンドを実行します。
-- PDB に切り替えて権限を付与
ALTER SESSION SET container = ORCLPDB1;
create user rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant resource to rdsdt_dtsacct;
grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
grant select on all_objects to rdsdt_dtsacct;
grant select on all_tab_cols to rdsdt_dtsacct;
grant select on dba_registry to rdsdt_dtsacct;
grant select any table to rdsdt_dtsacct;
grant select any transaction to rdsdt_dtsacct;
grant select on v_$log to rdsdt_dtsacct;
grant select on v_$logfile to rdsdt_dtsacct;
grant select on v_$archived_log to rdsdt_dtsacct;
grant select on v_$parameter to rdsdt_dtsacct;
grant select on v_$database to rdsdt_dtsacct;
grant select on v_$active_instances to rdsdt_dtsacct;
grant select on v_$instance to rdsdt_dtsacct;
grant select on v_$logmnr_contents to rdsdt_dtsacct;
grant select on sys.USER$ to rdsdt_dtsacct;
grant select on SYS.OBJ$ to rdsdt_dtsacct;
grant select on SYS.COL$ to rdsdt_dtsacct;
grant select on SYS.IND$ to rdsdt_dtsacct;
grant select on SYS.ICOL$ to rdsdt_dtsacct;
grant select on SYS.CDEF$ to rdsdt_dtsacct;
grant select on SYS.CCOL$ to rdsdt_dtsacct;
grant select on SYS.TABPART$ to rdsdt_dtsacct;
grant select on SYS.TABSUBPART$ to rdsdt_dtsacct;
grant select on SYS.TABCOMPART$ to rdsdt_dtsacct;
grant select on V_$PDBS to rdsdt_dtsacct;
grant select on v$database to rdsdt_dtsacct;
grant select on dba_objects to rdsdt_dtsacct;
grant select on DBA_TAB_COMMENTS to rdsdt_dtsacct;
grant select on dba_tab_cols to rdsdt_dtsacct;
grant select_catalog_role TO rdsdt_dtsacct;
-- CDB に切り替えて権限を付与
ALTER SESSION SET container = CDB$ROOT;
alter session set "_ORACLE_SCRIPT"=true;
create user rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant select on v_$logmnr_contents to rdsdt_dtsacct;
grant LOGMINING TO rdsdt_dtsacct;
grant EXECUTE_CATALOG_ROLE to rdsdt_dtsacct;
grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
grant select on v$database to rdsdt_dtsacct;
grant select on dba_objects to rdsdt_dtsacct;
grant select on DBA_TAB_COMMENTS to rdsdt_dtsacct;
grant select on dba_tab_cols to rdsdt_dtsacct;Oracle 12c ~ 19c(ノンマルチテナントアーキテクチャ)
-- rdsdt_dtsacct というデータベースアカウントを作成し、権限を付与
create user rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
grant create session to rdsdt_dtsacct;
grant connect to rdsdt_dtsacct;
grant resource to rdsdt_dtsacct;
grant select on V_$LOGMNR_LOGS to rdsdt_dtsacct;
grant select on all_objects to rdsdt_dtsacct;
grant select on all_tab_cols to rdsdt_dtsacct;
grant select on dba_registry to rdsdt_dtsacct;
grant select any table to rdsdt_dtsacct;
grant select any transaction to rdsdt_dtsacct;
grant select on v_$log to rdsdt_dtsacct;
grant select on v_$logfile to rdsdt_dtsacct;
grant select on v_$archived_log to rdsdt_dtsacct;
grant select on v_$parameter to rdsdt_dtsacct;
grant select on v_$database to rdsdt_dtsacct;
grant select on v_$active_instances to rdsdt_dtsacct;
grant select on v_$instance to rdsdt_dtsacct;
grant select on v_$logmnr_contents to rdsdt_dtsacct;
grant select on sys.USER$ to rdsdt_dtsacct;
grant select on SYS.OBJ$ to rdsdt_dtsacct;
grant select on SYS.COL$ to rdsdt_dtsacct;
grant select on SYS.IND$ to rdsdt_dtsacct;
grant select on SYS.ICOL$ to rdsdt_dtsacct;
grant select on SYS.CDEF$ to rdsdt_dtsacct;
grant select on SYS.CCOL$ to rdsdt_dtsacct;
grant select on SYS.TABPART$ to rdsdt_dtsacct;
grant select on SYS.TABSUBPART$ to rdsdt_dtsacct;
grant select on SYS.TABCOMPART$ to rdsdt_dtsacct;
grant LOGMINING TO rdsdt_dtsacct;
grant EXECUTE_CATALOG_ROLE to rdsdt_dtsacct;
grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
grant select on v$database to rdsdt_dtsacct;
grant select on dba_objects to rdsdt_dtsacct;
grant select on DBA_TAB_COMMENTS to rdsdt_dtsacct;
grant select on dba_tab_cols to rdsdt_dtsacct;同期タスクの作成
DTS コンソールの「データ同期」ページを開きます。
あるいは、Data Management (DMS) コンソールにログインし、上部ナビゲーションバーの DTS をクリックして、左側ナビゲーションウィンドウから DTS (DTS) > データ同期 を選択します。
左上隅で、同期インスタンスを配置するリージョンを選択します。
タスクの作成 をクリックし、ソースおよび宛先データベースを設定します。
セクション パラメーター 説明 該当なし タスク名 DTS が自動的に生成します。ビジネス要件を反映した記述的な名前を指定してください。タスク名は一意である必要はありません。 ソースデータベース データベースタイプ Oracle を選択します。 アクセス方法 ソースデータベースへのアクセス方法を選択します。この例では、ECS 上の自己管理データベース を使用します。その他のアクセス方法については、「事前準備の概要」をご参照ください。 インスタンスリージョン 自己管理 Oracle データベースが配置されているリージョン。 ECS インスタンス ID Oracle データベースをホストする Elastic Compute Service (ECS) インスタンスの ID。 ポート番号 Oracle データベースのサービスポート。デフォルト: 1521。 Oracle タイプ ソース Oracle データベースのアーキテクチャです。[Non-RAC インスタンス] を選択して [SID] を指定するか、[RAC または PDB インスタンス] を選択して [サービス名] を指定します。この例では、[Non-RAC インスタンス] を使用します。 データベースアカウント Oracle データベースアカウント。必要な権限については、「必要なデータベースアカウント権限」をご参照ください。 データベースパスワード データベースアカウントのパスワード。 宛先データベース データベースタイプ AnalyticDB for PostgreSQL を選択します。 アクセス方法 Alibaba Cloud インスタンス を選択します。 インスタンスリージョン 宛先 AnalyticDB for PostgreSQL インスタンスが配置されているリージョン。 インスタンス ID 宛先 AnalyticDB for PostgreSQL インスタンスの ID。 データベース名 AnalyticDB for PostgreSQL インスタンス内の宛先データベースの名前。 データベースアカウント 宛先インスタンスのデータベースアカウント。必要な権限については、「必要なデータベースアカウント権限」をご参照ください。 データベースパスワード データベースアカウントのパスワード。 ページ下部の [接続性のテストと続行] をクリックします。DTS は、自動的にそのサーバーの CIDR ブロックを Alibaba Cloud データベースインスタンスおよび ECS でホストされるデータベースのホワイトリストまたはセキュリティグループルールに追加します。データセンターまたはサードパーティクラウド内の自己管理データベースの場合は、DTS サーバーの CIDR ブロックを手動で追加します。詳細については、「オンプレミスデータベースのセキュリティ設定に DTS サーバーの CIDR ブロックを追加する」をご参照ください。
警告DTS サーバー CIDR ブロックをデータベースのホワイトリストまたは ECS のセキュリティグループルールに追加すると、セキュリティリスクが発生する可能性があります。実行前に、ユーザー名およびパスワードの強化、公開ポートの制限、API 呼び出しの認証、ホワイトリストルールの定期監査などの予防措置を講じてください。あるいは、Express Connect、VPN Gateway、または Smart Access Gateway を使用して、データベースを DTS に接続することもできます。
同期オブジェクトおよび高度な設定を構成します。基本設定 高度な設定
パラメーター 説明 同期タイプ 増分同期 がデフォルトで選択されています。また、スキーマ同期 および 初期完全同期 も選択してください。事前チェックが完了すると、DTS は既存データを宛先へ同期し、その後の増分同期の基盤とします。 競合テーブルの処理モード 宛先にソーステーブルと同名のテーブルが存在する場合の処理方法を制御します。事前チェックを行いエラーを報告オブジェクト名のマッピング(推奨):同名のテーブルが存在すると事前チェックが失敗し、タスクを開始できません。必要に応じて、オブジェクト名マッピング機能を使用して同期テーブルの名前を変更してください。詳細については、「」をご参照ください。エラーを無視して続行:名前の競合チェックをスキップします。スキーマが一致し、レコードのプライマリキーが宛先の既存レコードと同一の場合、初期完全同期では既存レコードが維持され、増分同期では上書きされます。スキーマが異なる場合、初期化が失敗したり、一部のカラムのみが同期されたりする可能性があります。慎重に使用してください。 テーブルのマージ はい: 同じスキーマを持つ複数のソーステーブルを単一の送信先テーブルにマージします。OLAP シナリオ(シャード化された OLTP テーブルを統合したい場合など)で有用です。DTS は、送信先テーブルに __dts_data_source列(TEXT 型)を追加し、その値の形式を<DTS インスタンス ID>:<データベース名>:<スキーマ名>:<テーブル名>とします。選択されたすべてのソーステーブルが送信先テーブルにマージされます。マージしたくないテーブルについては、別個のタスクを作成してください。同期中にソーススキーマを変更する DDL 操作を実行しないでください。詳細については、「マルチテーブルマージ機能の有効化」をご参照ください。いいえ(デフォルト): テーブルをマージしません。同期対象の DDL および DML 操作 同期する DDL および DML 操作。サポートされる操作については、「同期可能な SQL 操作」をご参照ください。特定のオブジェクトに対して操作を選択するには、選択済みオブジェクト セクションで該当オブジェクトを右クリックします。 オブジェクトの選択 ソースオブジェクト セクションからオブジェクトを選択し、矢印アイコンをクリックして 選択済みオブジェクト に移動します。カラム、テーブル、またはデータベースを選択できます。テーブルまたはカラムを選択した場合、ビュー、トリガー、ストアドプロシージャは同期されません。 データベースおよびテーブル名の変更 単一のオブジェクトの名前を変更するには、[選択されたオブジェクト]でそのオブジェクトを右クリックします。詳細については、「単一のオブジェクトの名前をマップする」をご参照ください。複数のオブジェクトを一度に名前を変更するには、選択されたオブジェクトの右上隅にある[一括編集]をクリックします。詳細については、「複数のオブジェクト名を一度にマップする」をご参照ください。 データのフィルター WHERE 条件を指定して行をフィルターします。詳細については、「SQL 条件を使用したデータのフィルター」をご参照ください。 パラメーター 説明 アラートの設定 タスクのアラートを設定します。タスクが失敗した場合や同期遅延がしきい値を超えた場合、アラート連絡先に通知が送信されます。アラートをスキップする場合は いいえ を選択し、アラートのしきい値および連絡先を設定する場合は はいDTS タスク作成時のモニタリングとアラート機能の設定 を選択してください。詳細については、「」をご参照ください。 接続失敗時の再試行時間 タスク開始後に接続失敗時に DTS が再試行する時間範囲です。有効値:10 ~ 1440 分。デフォルト:720 分。30 を超える値を設定してください。再試行ウィンドウ内に DTS が再接続できた場合、タスクは再開します。それ以外の場合はタスクが失敗します。複数のタスクが同じソースまたは宛先データベースを共有する場合、最も短い再試行ウィンドウが優先されます。再試行中も DTS インスタンスの課金が発生します。 オブジェクト名の引用符による囲み 以下のいずれかの条件に該当する場合、スキーマ同期および増分同期時にオブジェクト名をシングルクォートまたはダブルクォートで囲みます:ソースデータベースが大文字小文字を区別し、オブジェクト名に大文字と小文字が混在している場合;ソーステーブル名が英字で始まらない、または英字、数字、アンダースコア(_)、ナンバーシャープ(#)、ドル記号($)以外の文字を含む場合;スキーマ、テーブル、またはカラム名が宛先データベースでキーワード、予約キーワード、または無効な文字となっている場合。タスク完了後、クエリ実行時には引用符で囲んだオブジェクト名を指定してください。 

ページ下部の 次へ:データベースおよびテーブルフィールドの設定 をクリックします。AnalyticDB for PostgreSQL インスタンスへ同期するテーブルのプライマリキー列および分散キー列を設定します。

ページ下部の 次へ:タスク設定の保存と事前チェック をクリックします。
- DTS はタスク開始前に事前チェックを実行します。事前チェックに合格した場合のみタスクを開始できます。 - 事前チェックが失敗した場合、各失敗項目の横にある 詳細の表示 をクリックし、問題を修正してから再度事前チェックを実行してください。 - 事前チェックでアラートが生成された場合:無視できないアラートについては、詳細の表示 をクリックして問題を修正し、再チェックを行ってください。無視できるアラートについては、アラートの詳細の確認 をクリックし、ダイアログボックスで 無視 をクリックし、OK をクリックしてから 再チェック をクリックしてください。アラートを無視すると、データの不整合が発生する可能性があります。
成功率が 100% になるまで待機し、次へ:インスタンスの購入 をクリックします。
インスタンスの購入 ページで、課金方法およびインスタンスクラスを設定します。
パラメーター 説明 課金方法 サブスクリプション:インスタンス作成時に前払い。長期利用にコスト効果が高いです。従量課金:時間単位で課金されます。短期利用に適しています。不要になったらインスタンスを解放し、不要な課金を回避してください。 インスタンスクラス 必要な同期速度に基づいてインスタンスクラスを選択します。クラスの比較については、「データ同期インスタンスの仕様」をご参照ください。 サブスクリプション期間 サブスクリプション課金方法でのみ利用可能です。期間(1~9 か月、または 1~3 年)および作成するインスタンス数を設定します。 Data Transmission Service(従量課金)利用規約 のチェックボックスを読み、選択してください。
購入して開始 をクリックします。タスクリストでタスクの進行状況を監視できます。
次のステップ
同期遅延およびタスクの健全性をモニタリングするには、「DTS タスクを作成するときにモニタリングとアラートを設定する」で説明されているように、アラートを設定します。
同期対象オブジェクトの名前を変更するには、「オブジェクト名のマッピング」をご参照ください。
詳細については、「マルチテーブルマージ機能を有効化する」をご参照ください。