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 の場合にのみ実行できます。つまり、LiveCompareは、接続されているOracleユーザーに属するテーブルのみを検索します。スキーマ修飾テーブル名が無効になっている場合、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 でも非修飾テーブル名を使用できます。

また、 LiveCompareから進行状況とレポート情報を書き込むにはOutput Connection が必要であることに注意してください。

PGDデータベースをOracleと比較する必要があり、 Initial Connection 、 node_name 、およびreplication_sets 機能(前述)を利用したい場合は、次のように、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 Instant Client

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 Databaseに接続できるように、Pythonモジュール cx_Oracle をシステムにインストールして使用できるようにする必要があります。

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

the instructions in cx_Oracle website に従ってください

システムにインストールします。

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

pip3 install --user cx_Oracle --upgrade

相違点

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

BLOBおよびCLOBデータ型

LiveCompareは、PostgreSQLの同等のフィールドのタイプがtext である場合、OracleのCLOB フィールドを比較できます。 OracleのBLOB フィールドについても同じことが言えます。PostgreSQLでの同等のフィールドは、 bytea 型である必要があります。

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

ORA-00932: inconsistent datatypes: expected - got BLOB

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

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

LiveCompareは、比較セッションにOracleとPostgreSQLが含まれることを検出した場合、ユーザーが他の値に設定していない限り、 LiveCompareはすでにforce_collate = C を設定しています。

共通ハッシュ

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

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

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

  • このようにして、完全な行表現は両側でMD5を使用してハッシュされます。

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

  • block_hash の使用時に不一致がある場合、LiveCompareはPostgresとPostgresの比較の場合と同様に、自動的に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 12c以降でstandard_hash 関数を使用します。 Oracle 11gでは、 standard_hash ファンクションは利用できないため、LiveCompareは代わりに dbms_crypto.hash ファンクションの使用を試みますが、Oracle側のユーザーに追加の権限が必要になる場合があります。次に例を示します。

GRANT EXECUTE ON sys.dbms_crypto TO testuser;