Oracle Support¶
LiveCompareを使用して、 オラクルデータベースのデータを任意の数のPostgreSQLまたはBDRデータベースと比較できます。
例、データ接続でtechnology = oracleを定義できます。他の設定を使用して、
オラクルへの接続を定義できます。
hostportserviceuserpassword
他のすべてのデータ接続はPostgreSQLである必要があります。
オラクルデータベースと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
ここで、
オラクルのschema_nameはユーザテーブルサンドボックスです。すべてのテーブル名はデフォルトでスキーマ修飾されています:
Postgres:<schema_name> . <table_name>
オラクル:<user> . <table_name
schema_qualified_table_names = offを設定することにより、スキーマで修飾されたテーブル名を無効にすることができます。これは、oracle_user_tables_only = onの場合にのみ実行できます。つまり、LiveCompareは、接続されているオラクルユーザに属するテーブルのみを検索します。スキーマ修飾テーブル名が無効になっている場合、
Postgresでは、ロールまたは設定でデフォルトのsearch_pathを設定する必要があります。または、接続start_queryパラメータを使用して、適切な例を設定できます。
[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が必要であることにノートしてください。
BDRデータベースをオラクルと比較する必要があり、Initial Connection、node_nameおよびreplication_sets機能(前述)を利用したい場合は、次のようにオラクルへの最後のデータ接続を指定できます。
[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
例、 BDRクラスター全体を単一のオラクルデータベースと比較することもできます。
[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データベースで動作することにノートしてください。
ただし、 オラクルに接続できるオーダーにするには、LiveCompareに追加のソフトウェアが必要です。
オラクル Instant Client¶
オラクル Instant Clientをダウンロードしてインストールする必要があります(または、使用するオペレーティングシステムに応じて特定のフォルダに抽出します)。
MacOSX : オラクル Instant Clientのダウンロード 64-bit )
~/libで抽出します。- Linux : オラクル Instant Clientのダウンロード 32-bit )
64-bit )
それをシステムにインストールしてから、
LD_LIBRARY_PATHを設定します。- Windows : オラクル Instant Clientのダウンロード 32-bit )
64-bit ) それをLiveCompareフォルダーに抽出します。
cx_Oracle Pythonモジュール¶
Pythonモジュール cx_Oracle は、LiveCompareがオラクルデータベースに接続できるように、システムにインストールして使用可能にする必要があります。
現在、cx_OracleはLinuxディストリビューションリポジトリからインストールできないため、 the instructions in cx_Oracle website に従ってシステムにインストールしてください。
LiveCompareはpostgresオペレーティングシステムユーザで実行することが推奨されているため、次のコマンドを使用して、postgresユーザに対してのみPIPを介してcx_Oracleモジュールをインストールできます。
pip3 install --user cx_Oracle --upgrade
違い¶
LiveCompareで違いが見つかった場合、 PostgreSQL接続にのみ適用されるDMLスクリプトが生成されます。 オラクル接続に適用されるDMLスクリプトは生成されません。
BLOBおよびCLOBデータ型¶
LiveCompareは、 PostgreSQLの同等のフィールドがtext型である場合、
オラクルのCLOBフィールドを比較できます。同じことがオラクルのBLOBフィールドにも当てはまります。PostgreSQLの同等のフィールドはPostgreSQL型でなければなりません。
ただし、デフォルトでは、LiveCompareはBLOB / CLOBフィールドがプライマリキーにある場合、またはテーブルにプライマリキーがない場合、BLOB / CLOBフィールドをハンドルしません。その場合、テーブルは無視され、LiveCompareログに次のようなメッセージが表示されます。
ORA-00932: inconsistent datatypes: expected - got BLOB
テーブルにプライマリキーがない場合、General Settingsセクションで次の2つの設定を有効にすることで、BLOB
/
CLOBフィールドを無視するようLiveCompareに指示することで、この動作を回避できます。
oracle_ignore_unsortable = on
column_intersection = on
互換性のない照合¶
オラクルでは、通常、次の初期化パラメーターが設定されています。
NLS_COMP = BINARY
NLS_SORT = BINARY
つまり、NLS_LANGおよびその他の言語設定に関係なく、
オラクルのすべてのORDER BY操作は文字バイナリコードを使用して実行されます。
Postgresでは、同じ動作を示す同等の照合順序はC照合順序です。
Postgresデータベースが別の照合順序で初期化された場合、デフォルトでLiveCompareはPK値を並べ替えときに問題を検出する可能性があり、誤検出につながる可能性があります。
これを回避するには、
Postgresで照合順序(たとえば、C照合順序)を強制することができます。これにより、
オラクルの同じソート動作と一致します。
force_collate = C
LiveCompareは、比較セッションにオラクルとPostgreSQLが関係していることを検出した場合、ユーザが他の値を設定していない限り、LiveCompareはすでにforce_collate = Cを設定します。
共通ハッシュ¶
デフォルトでは、
PostgreSQLとオラクルを比較する場合でも、LiveCompareにはcomparison_algorithm = block_hashがあります。ただし、これらのルールに従って「共通ハッシュ」が構築されます。
すべての列の値を連結することにより、行はテキストとして完全に表されます。 Postgres側では、タイムスタンプ、数値、およびbyteaデータ型が処理されてオラクルを模倣します。
この方法では、完全な行表現形式が両側でMD5を使用してハッシュされます。
これにより、
comparison_algorithmをblock_hashおよびrow_hashに設定して使用できます。block_hashの使用時に不一致がある場合、LiveCompareは自動的に Postedの場合と同様に、 Postgresに、次にfull_rowにフォールバックします。 Postgresの比較。OracleのBLOB、CLOB、NCLOBフィールドは、最初の2000文字に制限されていオラクル のみ(
comparison_algorithm = full_rowはBLOBとCLOB全体の比較を許可します); オラクルでは、行全体の表現形式が4000文字を超えてはなりません。
行全体の表現形式が4000文字を超える場合、LiveCompareはその特定のテーブルの比較をアボートし、ログに次のエラーメッセージが表示されます。
ORA-01489: result of string concatenation is too long
それ以降のLiveCompareバージョンは、これらの特定のテーブルのfull_row比較にフォールバックします。今のところ、回避策は、comparison_algorithm = full_rowを使用して、これらのテーブルのみで個別の比較セッションを構成することです。
Common Hashは、 オラクル
12c以降でstandard_hashファンクションを使用します。 オラクル
11gでは、standard_hashファンクションは使用できないため、LiveCompareは代わりにdbms_crypto.hashファンクションを使用しようとしますが、
オラクル側のユーザに追加の権限が必要になる場合が例ます。
GRANT EXECUTE ON sys.dbms_crypto TO testuser;