Oracle support#
LiveCompareを使用して、Oracleデータベースのデータを任意の数のPostgreSQLまたはPGDデータベースと比較できます。
たとえば、データ接続でtechnology = oracle
を定義できます。次に、他の設定を使用してOracleへの接続を定義できます。
hostportserviceuserpassword
他のすべてのデータ接続はPostgreSQLである必要があります。
Oracleへの接続に使用するuser
には、比較するテーブルからデータを読み取るために必要な特権が必要です。具体的には、これらの権限はCONNECT
、SELECT ANY TABLE 、およびSELECT_CATALOG_ROLE
です。これらは次のコマンドで付与できます。
GRANT CONNECT, SELECT ANY TABLE, SELECT_CATALOG_ROLE TO username;
username は、Oracleへの接続に使用するユーザーです。
次に、OracleデータベースとPostgreSQLデータベースの単純な比較の例を示します。
[General Settings]
logical_replication_mode = off
max_parallel_workers = 4
oracle_user_tables_only = on
oracle_ignore_unsortable = on
column_intersection = on
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
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 機能
EDB Postgres Distributed support で説明を利用したい場合、次のように最後のデータ接続をOracleにポイントできます。
[General Settings]
logical_replication_mode = bdr
max_parallel_workers = 4
oracle_user_tables_only = on
oracle_ignore_unsortable = on
column_intersection = on
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
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接続にのみ適用する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
共通ハッシュ#
デフォルトでは、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;