Oracle support
==============

LiveCompareを使用して、Oracleデータベースのデータを任意の数のPostgreSQLまたはPGDデータベースと比較できます。

たとえば、データ接続で\ ``technology = oracle``
を定義できます。次に、他の設定を使用してOracleへの接続を定義できます。

-  ``host``

-  ``port``

-  ``service``

-  ``user``

-  ``password``

他のすべてのデータ接続はPostgreSQLである必要があります。

次に、OracleデータベースとPostgreSQLデータベースの単純な比較の例を示します。

.. code:: ini

   [General Settings]
   logical_replication_mode = off
   max_parallel_workers = 4
   oracle_user_tables_only = on
   oracle_ignore_unsortable = on
   column_intersection = on
   force_collate = C
   difference_tie_breakers = oracle

   [Oracle Connection]
   technology = oracle
   host = 127.0.0.1
   port = 1521
   service = XE
   user = LIVE
   password = live

   [Postgres Connection]
   technology = postgresql
   dsn = dbname=liveoracle user=william

   [Output Connection]
   dsn = dbname=liveoutput user=william

   [Table Filter]
   schemas = schema_name = live

ここで、Oracleの\ ``schema_name``
はユーザーテーブルサンドボックスです。すべてのテーブル名はデフォルトでスキーマ修飾されます。

-  Postgres ``<schema_name> . <table_name>``

-  Oracle ``<user> . <table_name``

``schema_qualified_table_names = off``
を設定することにより、スキーマ修飾テーブル名を無効にできます。これは、\ ``oracle_user_tables_only = on``
の場合にのみ実行できます。この設定は、接続されているOracleユーザーに属するテーブルのみを検索するようにLiveCompareに指示します。スキーマ修飾テーブル名が無効になっている場合、Postgresでは、ロールまたは構成でデフォルトの\ ``search_path``
を設定する必要があります。または、接続 ``start_query``
パラメーターを使用して、適切な\ ``search_path``
を設定できます。たとえば、

.. code:: ini

   [General Settings]
   logical_replication_mode = off
   max_parallel_workers = 4
   oracle_user_tables_only = on
   oracle_ignore_unsortable = on
   column_intersection = on
   force_collate = C
   difference_tie_breakers = oracle
   schema_qualified_table_names = off

   [Oracle Connection]
   technology = oracle
   host = 127.0.0.1
   port = 1521
   service = XE
   user = LIVE
   password = live

   [Postgres Connection]
   technology = postgresql
   dsn = dbname=liveoracle user=william
   start_query = SET search_path = myschema1, myschema2, public

   [Output Connection]
   dsn = dbname=liveoutput user=william

   [Table Filter]
   tables = table_name in (mytable1, mytable2)

``schema_qualified_table_names = off`` の場合、\ ``Table Filter``
、\ ``Row Filter`` 、および\ ``Column Filter``
で非修飾テーブル名を使用することもできます。

..  Note::
   `Output Connection` は、LiveCompareから進行状況とレポート情報を書き込むために必要です。

PGDデータベースをOracleと比較する必要があり、 ``Initial Connection``
、\ ``node_name`` 、および\ ``replication_sets`` 機能 :ref:`PGD support <EDB Postgres Distributed support>` で説明を利用したい場合、次のように最後のデータ接続をOracleにポイントできます。

.. code:: ini

   [General Settings]
   logical_replication_mode = bdr
   max_parallel_workers = 4
   oracle_user_tables_only = on
   oracle_ignore_unsortable = on
   column_intersection = on
   force_collate = C
   difference_tie_breakers = oracle

   [Initial Connection]
   dsn = port=5432 dbname=live user=postgres

   [BDR Connection]
   node_name = node1

   [Oracle Connection]
   technology = oracle
   host = 127.0.0.1
   port = 1521
   service = XE
   user = LIVE
   password = live

   [Output Connection]
   dsn = port=5432 dbname=liveoutput user=postgres

   [Table Filter]
   replication_sets = set_name = bdrgroup

PGDクラスター全体を単一のOracleデータベースと比較することもできます。たとえば、

.. code:: ini

   [General Settings]
   logical_replication_mode = bdr
   max_parallel_workers = 4
   oracle_user_tables_only = on
   oracle_ignore_unsortable = on
   column_intersection = on
   force_collate = C
   difference_tie_breakers = oracle
   all_bdr_nodes = on

   [Initial Connection]
   dsn = port=5432 dbname=live user=postgres

   [Oracle Connection]
   technology = oracle
   host = 127.0.0.1
   port = 1521
   service = XE
   user = LIVE
   password = live

   [Output Connection]
   dsn = port=5432 dbname=liveoutput user=postgres

   [Table Filter]
   replication_sets = set_name = bdrgroup

要件
----

LiveCompareは、そのままでPostgreSQLデータベースで動作します。追加のソフトウェアをインストールする必要はありません。ただし、Oracleに接続できるようにするには、LiveCompareに追加のソフトウェアが必要です。

Oracleインスタントクライアント
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Oracle Instant
Clientをダウンロードしてインストールするか、使用するオペレーティングシステムによっては特定のフォルダーに抽出する必要があります。

-  **MacOSX** Oracle Instant Client `64-bit <http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html>`_ をダウンロードし、
   ``~/lib`` で抽出します。

-  **Linux** Oracle Instant Client `32-bit <http://www.oracle.com/technetwork/topics/linuxsoft-082809.html>`_ 
   `64-bit <http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html>`_ をダウンロードしてシステムにインストールし、
   ``LD_LIBRARY_PATH`` を設定します。

-  **Windows** Oracle Instant Client `32-bit <http://www.oracle.com/technetwork/topics/winsoft-085727.html>`_  `64-bit <http://www.oracle.com/technetwork/topics/winx64soft-089540.html>`_ 
   をダウンロードし、 LiveCompareフォルダーに抽出します。

cx_Oracle Pythonモジュール
^^^^^^^^^^^^^^^^^^^^^^^^^^

LiveCompareがOracleデータベースに接続できるように、Pythonモジュール
 `cx_Oracle <https://oracle.github.io/python-cx_Oracle/>`_ をインストールしてシステムに使用できるようにする必要があります。

現在、cx_OracleはLinuxディストリビューションリポジトリからインストールできないため、
 `the instructions on the cx_Oracle website <https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html>`_ に従ってシステムにインストールします。

postgresオペレーティングシステムユーザーでLiveCompareを実行することをお勧めします。次に、次のコマンドを使用して、\ ``postgres``
ユーザーのみがPIPを介して\ ``cx_Oracle``
モジュールをインストールできます。

::

   pip3 install --user cx_Oracle --upgrade

の違い
------

LiveCompareは違いを見つけた場合、PostgreSQL接続にのみ適用するDMLスクリプトを生成します。
Oracle接続に適用するDMLスクリプトは生成されません。

BLOBおよび CLOBデータ型
-----------------------

PostgreSQLの同等のフィールドが\ ``text``
型である場合、LiveCompareはOracleの CLOBフィールドを比較できます。
OracleのBLOBフィールドにも同じことが当てはまります。
PostgreSQLの同等のものは\ ``bytea`` 型です。

ただし、デフォルトでは、LiveCompareはBLOB /
CLOBフィールドが主キーにある場合、またはテーブルに主キーがない場合、BLOB
/
CLOBフィールドを処理しません。その場合、テーブルは無視され、LiveCompareログには次のようなメッセージが記録されます。

::

   ORA-00932: inconsistent datatypes: expected - got BLOB

テーブルに主キーがない場合にBLOB /
CLOBフィールドを無視するようにLiveCompareに指示することにより、この動作をワークアラウンドできます。
``General Settings`` セクションで次の2つの設定を有効にします。

::

   oracle_ignore_unsortable = on
   column_intersection = on

互換性のない照合順序
--------------------

Oracleでは、一般的に次の初期化パラメーターが設定されます。

::

   NLS_COMP = BINARY
   NLS_SORT = BINARY

これは、 ``NLS_LANG``
および他の言語設定に関係なく、Oracleのすべての\ ``ORDER BY``
操作が文字バイナリコードを使用して実行されることを意味します。

Postgresでは、同じ動作を示す同等の照合順序は\ ``C`` 照合順序です。
Postgresデータベースが別の照合順序で初期化された場合、デフォルトでは、LiveCompareはPK値をソートするときに問題を検出する場合があります。これにより、誤検出が発生する可能性があります。

これをワークアラウンドするには、Postgresで照合順序たとえば\ ``C``
照合順序を強制して、Oracleと同じソート動作と一致させることができます。

.. code:: ini

   force_collate = C

比較セッションにOracleおよびPostgreSQLが関係することをLiveCompareが検出した場合、LiveCompareは別の値に設定しない限り
``force_collate = C`` を既に設定しています。

共通ハッシュ
------------

デフォルトでは、PostgreSQLとOracleを比較する場合でも、LiveCompareには\ ``comparison_algorithm = block_hash``
があります。ただし、 *共通ハッシュ* は、次のルールに従って構築されます。

-  すべての列値を連結することにより、行はテキストとして完全に表されます。

-  Postgres側では、タイムスタンプ、数値、およびbyteaデータ型がOracleを模倣するように処理されます。

-  この方法では、完全な行表現が両側でMD5を使用してハッシュされます。

-  これにより、\ ``comparison_algorithm`` を\ ``block_hash``
   および\ ``row_hash`` に設定して使用できます。

-  ``block_hash``
   の使用時に不一致があった場合、PostgresとPostgresの比較の場合と同様に、LiveCompareは\ ``row_hash``
   に、次に\ ``full_row`` にフォールバックします。

-  OracleのBLOB、
   CLOB、およびNCLOBフィールドは、最初の2000文字にのみ制限されています。
   ``comparison_algorithm = full_row`` では、 BLOBおよび
   CLOB全体の比較ができます。

-  Oracleでは、完全な行表現の幅が4000文字以下である必要があります。完全な行表現が4000文字を超えている場合、LiveCompareはその特定のテーブルの比較を中止し、次のエラーメッセージがログに追加されます。

::

   ORA-01489: result of string concatenation is too long

以降のLiveCompareバージョンでは、これらの特定のテーブルでの\ ``full_row``
比較にフォールバックします。今のところ、回避策は、
``comparison_algorithm = full_row``
を使用して、これらのテーブルでのみ個別の比較セッションを構成することです。
Oracle
10gでLiveCompareを使用するには、常に\ ``comparison_algorithm = full_row``
を設定する必要があります。

共通ハッシュは、Oracle 12c以降で\ ``standard_hash``
ファンクションを使用します。 Oracle 11gでは、\ ``standard_hash``
ファンクションを使用できないため、LiveCompareは代わりに\ ``dbms_crypto.hash``
ファンクションを使用しようとします。ただし、Oracle側のユーザーの追加の特権が必要になる場合があります。例

.. code:: sql

   GRANT EXECUTE ON sys.dbms_crypto TO testuser;
