Oracle support#

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

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

  • host

  • port

  • service

  • user

  • password

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

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

[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 を設定できます。たとえば、

[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 で非修飾テーブル名を使用することもできます。

注釈

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

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

[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データベースと比較することもできます。たとえば、

[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 をダウンロードし、 ~/lib で抽出します。

  • Linux Oracle Instant Client 32-bit 64-bit をダウンロードしてシステムにインストールし、 LD_LIBRARY_PATH を設定します。

  • Windows Oracle Instant Client 32-bit 64-bit をダウンロードし、 LiveCompareフォルダーに抽出します。

cx_Oracle Pythonモジュール#

LiveCompareがOracleデータベースに接続できるように、Pythonモジュール

cx_Oracle をインストールしてシステムに使用できるようにする必要があります。

現在、cx_OracleはLinuxディストリビューションリポジトリからインストールできないため、

the instructions on the cx_Oracle website に従ってシステムにインストールします。

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と同じソート動作と一致させることができます。

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側のユーザーの追加の特権が必要になる場合があります。例

GRANT EXECUTE ON sys.dbms_crypto TO testuser;