はじめに

この記事では、Qlik ReplicateのソースとしてOracleデータベースを利用し、Oracleデータベースの変更データをキャプチャーしてターゲットシステムへデータ移行・転送をおこなうための設定方法をご説明します。尚、ここでは設定手順の概要とポイントについて解説しますが、詳細につきましてはQlik ReplicateヘルプサイトにあるQlik Replicateの「Setup and User Guide」の「Using Oracle as a Source」の項をご参照ください。また、Amazon RDS for Oracleは設定内容が異なるため、同様に「Setup and User Guide」をご参照ください。

【検証環境】

  • Qlik Replicate 6.6.0 SR1 on Windows
  • Oracle Database 18c on Windows (Standard Edition2, コンテナ・データベースとして作成を無効化して構成)

サポートされているデータベースエディション

Qlik Replicateでは以下のOracleデータベースのエディションをサポートされています。

  • Oracle Enterprise Edition
  • Oracle Standard Edition
  • Oracle Express Edition
  • Oracle Personal Edition

サポート対象のバージョンなどの詳細につきましては、Qlik Replicateヘルプサイトにある「Support Platforms and Endpoints」 (Qlik Replicate Support Matrix)をご参照ください。

変更データキャプチャー (CDC) の方式の選択

Oracle の変更データをキャプチャーは、OracleのREDO ログ(およびArchiveログ)を読み取って行われます。このREDOログを読み取る方式として、 Binary ReaderLogMiner の 2 つの方法が提供されており、いずれかを選択します。以下それぞれの特長をご説明します。

Binary Reader

  • Binary ReaderはQlik Replicate固有の方式で、OCILobRead APIを通じてバイナリ形式でREDOログの内容の全体をQlik Replicateに転送します。
  • そのため、データ転送のネットワーク帯域の利用は多くなりますが、対象となる変更の選別はQlik Replicate側で行われるため、Oracle データベースをホストするサーバーの CPU /メモリ消費は低くなる傾向があります。
  • 変更データ量が多い場合、また同一データソースからのレプリケートタスクを複数実行する場合には、Binary Readerの方がより効率的かつ高速に処理ができます。
  • Oracle PDB(プラガブルデータベース)に対してはこのBinary Readerのみが利用可能です。(LogMinerではPDBがサポートされていません。)

LogMiner

  • OracleのユーティリティであるLogMinerの仕組みを利用した変更データキャプチャー方式です。
  • Oracleデータベース側でレプリケーションの対象となる変更のみが選別され、Qlik Replicate側にSQLステートメントとして転送されます。
  • そのため、Binary Readerの方式と比較して、変更データ転送のためのネットワーク帯域の利用は少なくなりますが、Oracle データベースをホストするサーバーの CPU/メモリ 消費は多くなる傾向があります。
  • LogMiner では、暗号化オプションや圧縮オプションなど、ほとんどの Oracle オプションがサポートされています。(Binary Reader ではサポートが限定的です。)
  • Oracle Automatic Storage Management (ASM)を使ってREDOログファイルを管理している場合には、Binary Readerと比較してよりシンプルな設定方法を提供します。

また、暗号化と圧縮についての対応状況はそれぞれ以下の通りとなっています。

image

image

制限について

Qlik ReplicateのOracleエンドポイント利用において、以下の様な制限がありますので、利用に当たっては事前に確認が必要です。以下はあくまでも一例となり、全ての一覧についてはQlik ReplicateヘルプサイトにあるQlik Replicateの「Setup and User Guide」をご参照ください。

  • 長いオブジェク名 (30 バイト以上) はサポートされていません。
  • 関数ベースのインデックスはサポートされていません。
  • マルチテナントコンテナデータベース (CDB) はサポートされていません。
  • Oracle 12の場合のみ、LOB列への変更はサポートされていません。
  • 空のBLOB/CLOB列はターゲットにおいてNULLにマッピングされます。・・など

Oracleクライアントの導入

Qlik Replicate側にはOracle Instant Clientを導入する必要があります。インストールファイルのダウンロード、及び導入方法については以下のOracle社のサイトをご参照ください。(Basic Packageおよび、SQL*Plusを使ってOracleへの接続の確認を行う場合にはSQL*Plus Packageを導入します。)
https://www.oracle.com/database/technologies/instant-client/downloads.html

権限の設定

Qlik ReplicateからOracleデータベースへアクセスを行うユーザーには必要な権限を付与する必要があります。以下の例は、レプリケートの処理を行うための「replicate_user」を新たに作成し、必要な権限を与えています。権限にはBinary Reader、LogMinerの両方に必要なものと、それぞれ利用する場合のみに必要な権限があります。

/* Qlik Replicate用のユーザー作成 */
CREATE USER replicate_user
IDENTIFIED BY "replicate_password"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;

/* Binary Reader、LogMinerの両方に必要な権限付与 */
GRANT SELECT ANY TRANSACTION TO replicate_user;
GRANT SELECT on V_$ARCHIVED_LOG TO replicate_user;
GRANT SELECT on V_$LOG TO replicate_user;
GRANT SELECT on V_$LOGFILE TO replicate_user;
GRANT SELECT on V_$DATABASE TO replicate_user;
GRANT SELECT on V_$THREAD TO replicate_user;
GRANT SELECT on V_$PARAMETER TO replicate_user;
GRANT SELECT on V_$NLS_PARAMETERS TO replicate_user;
GRANT SELECT on V_$TIMEZONE_NAMES TO replicate_user;
GRANT SELECT on V_$TRANSACTION TO replicate_user;
GRANT SELECT on V_$CONTAINERS TO replicate_user;
GRANT SELECT on ALL_INDEXES TO replicate_user;
GRANT SELECT on ALL_OBJECTS TO replicate_user;
GRANT SELECT on DBA_OBJECTS TO replicate_user /*Oracleのバージョンが11.2.0.3より前の場合に必要*/ ;
GRANT SELECT on ALL_TABLES TO replicate_user;
GRANT SELECT on ALL_USERS TO replicate_user;
GRANT SELECT on ALL_CATALOG TO replicate_user;
GRANT SELECT on ALL_CONSTRAINTS TO replicate_user;
GRANT SELECT on ALL_CONS_COLUMNS TO replicate_user;
GRANT SELECT on ALL_TAB_COLS TO replicate_user;
GRANT SELECT on ALL_IND_COLUMNS TO replicate_user;
GRANT SELECT on ALL_LOG_GROUPS TO replicate_user;
GRANT SELECT on SYS.DBA_REGISTRY TO replicate_user;
GRANT SELECT on SYS.OBJ$ TO replicate_user;
GRANT SELECT on SYS.ENC$ TO replicate_user;
GRANT SELECT on DBA_TABLESPACES TO replicate_user;
GRANT SELECT on ALL_TAB_PARTITIONS TO replicate_user;
GRANT SELECT on ALL_ENCRYPTED_COLUMNS TO replicate_user;
GRANT SELECT on ALL_VIEWS TO replicate_user /*Viewが利用されている場合に必要*/ ;
GRANT SELECT ANY TABLE TO replicate_user /*テーブルリストのパターンを使用する場合に追加。特定のテーブルを対象とする場合にはSELECT on <any-replicated-table>;でも可*/ ;
GRANT ALTER ANY TABLE TO replicate_user /*Qlik ReplicateがSupplemental loggingを自動的に追加する場合に必要。 特定のテーブルを対象とする場合にALTER on <any-replicated-table>;でも可*/ ;
GRANT SELECT on V_$STANDBY_LOG TO replicate_user /*Oracleスタンバイデータベースにアクセスする場合に必要*/ ;
GRANT SELECT on all_nested_tables TO replicate_user /*Oracleのネスト表にアクセスする場合に必要*/ ;
GRANT SELECT on all_nested_table_cols TO replicate_user /*Oracleのネスト表にアクセスする場合に必要*/ ;

/* Binary Readerを利用する場合に必要な権限(各権限の解説については「Setup and User Guide」をご参照ください。)*/
GRANT CREATE SESSION TO replicate_user;
GRANT SELECT on V_$TRANSPORTABLE_PLATFORM TO replicate_user;
GRANT SELECT on V_$DATABASE_INCARNATION TO replicate_user;
GRANT CREATE ANY DIRECTORY TO replicate_user;
GRANT EXECUTE on DBMS_FILE_TRANSFER TO replicate_user;
GRANT EXECUTE on DBMS_FILE_GROUP TO replicate_user;

/* LogMinerを利用する場合に必要な権限 */
GRANT CREATE SESSION TO replicate_user;
GRANT EXECUTE on DBMS_LOGMNR TO replicate_user;
GRANT SELECT on V_$LOGMNR_LOGS TO replicate_user;
GRANT SELECT on V_$LOGMNR_CONTENTS TO replicate_user;
GRANT LOGMINING TO replicate_user /*Oracleのバージョンが12c以降の場合に必要*/ ;

Archive Logの設定

Qlik ReplicateでOracleデータベースの変更データキャプチャーを行うには、OracleでArchive LogモードがONになっている必要があります。データベースの現在のArchive Logモードを確認するには以下のコマンドを実行します。

SQL> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG

上記の様にNOARCHIVELOGのモードとなっている場合には以下の手順でARCHIVELOGのモードへ変更する必要があります。

/* データベース停止 */
shutdown immediate

/* データベースをMOUNT状態で起動 */
startup mount

/* Archive Logモード切替 */
alter database archivelog;

/* データベースをMOUNT状態で起動 */
alter database open;

/* Archive Logモード確認 */
select log_mode from v$database;

Archive Logのログの状況は以下のコマンドでも確認することができます。

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            D:\app\oracle\product\18.0.0\dbhome_1\RDBMS
Oldest online log sequence     9
Next log sequence to archive   11
Current log sequence           11

Archive Logのファイル一覧は以下で確認することができます。

select name, sequence# from v$archived_log;

※検証環境などでArchive Logのモードを切り替えた直後などに、OracleをソースとしてQlik Replicateのタスクを実行すると「Cannot retrieve Oracle archived Redo log destination ids」のエラーとなる場合があります。これは、V$ARCHIVED_LOGにレコードが格納されておらずDEST_IDを取得できないことが原因ですが、「ALTER SYSTEM SWITCH LOGFILE;」実行してREDOログを切り替えることで当テーブルにレコードが登録されてエラーを回避することができます。

Supplemental Loggingの設定

同様に、Supplemental LoggingもOracleデータベース上で有効化されている必要があります。データベースのSupplemental Loggingが有効化されているかをを確認するには以下のコマンドを実行します。

/* Supplemental Loggingの設定の確認 */
select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEME
--------
NO

上記の様に無効となっている場合には以下の手順でSupplemental Loggingが有効化する必要があります。

/* Supplemental Loggingをデータベースで有効化 */
alter database add supplemental log data;/* Supplemental Loggingの設定の確認 */select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEME
--------
YES

LogMinerの設定

LogMinerを利用する場合には、LogMinerの設定が必要となります。(Binary Readderを利用する場合には当手順は不要です。)LogMinerの設定はREDOログ・ファイル分析のためのLogMinerの使用を参考に設定を実施する必要があります。まず、以下のコマンドでREDOログファイルの状況を確認します。

/* REDOログの一覧 */
select group#, status, sequence#, members from v$log;
/* REDOログのファイル名の確認 */
select group#, member from v$logfile;

LogMinerを起動する前に、ここでは手動でREDOログ・ファイルのリストを作成します。以下のコマンドでREDOログファイルを追加します。

execute sys.dbms_logmnr.add_logfile(logfilename =>'D:\APP\ORACLE\ORADATA\ORCL\REDO01.LOG',options => dbms_logmnr.new); 

REDOログファイルをさらに追加する場合には以下のコマンドで追加します。

execute sys.dbms_logmnr.add_logfile(logfilename =>'D:\APP\ORACLE\ORADATA\ORCL\REDO02.LOG',options => sys.dbms_logmnr.addfile); 

追加したREDOログファイルの一覧は以下で確認することができます。

select * from V$LOGMNR_LOGS;

LogMinerを起動します。LogMinerは、REDOデータをユーザーに返す際に、オブジェクトIDをオブジェクト名に変換するためにディクショナリを必要としますが、ここではオンライン・カタログを利用するオプションを指定しています。起動したまま次のステップに進みますが、設定変更などのためにLogMinerを停止するには「execute sys.dbms_logmnr.end_logmnr();」を実行します。

execute sys.dbms_logmnr.start_logmnr(options => sys.dbms_logmnr.dict_from_online_catalog);

REDOログファイルの内容は V$LOGMNR_CONTENTS ビューで参照することができます。例えば、HR.EMPLOYEESテーブルに対する更新を確認する場合には、以下の形で確認することができます。

select operation, sql_redo, sql_undo from v$logmnr_contents where seg_owner = 'HR' and seg_name = 'EMPLOYEES';

Qlik Replicate上でのエンドポイント接続の作成

Qlik Replicate上でOracleに接続を行う前に、事前にsqlplusなどを通じてQlik Replicateが導入されているサーバーから、Oracleに問題なく接続できることを確認しておくことが望まれます。コマンドラインから「sqlplus ユーザー名/パスワード@ホスト名[:ポート番号][/サービス名]」で接続を行います。以下はqmi-wn-blというホスト名のサーバー上に配置されたorclというサービス名のOracleデータベースへ、replicate_userのユーザー名、replicate_passwordのパスワードで接続を行っています。

C:\Users\vagrant>sqlplus replicate_user/replicate_password@qmi-wn-bl:1521/orcl
SQL*Plus: Release 18.0.0.0.0 - Production on Sat Jun 20 09:20:41 2020
Version 18.5.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.
Last Successful login time: Sat Jun 20 2020 08:42:12 -07:00
Connected to:
Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL>

スタートメニューから[Qlik Replicate Console]を開きます。

image

[Manage Endpoint Connections]をクリックします。

image

[New Endpoint Connections]をクリックします。

image

以下の形でエンドポイント名を入力して、[Role]から[Source]、[Type]から[Oracle]を選択し、接続情報及び認証情報を入力します。([Connection string]には「//サーバー名:ポート番号/サービス名」の形式で入力します。)

image

[Advanced]タブを開き、[Oracle LogMiner]、[Replicate Log Reader] (Binary Reader)のいずれかのREDOログへのアクセス方式を選択します。

image

[Test Connection]をクリックし、接続に問題が無いかテストを行います。

image