Oracle Support¶
LiveCompareを使用して、Oracleデータベースのデータを任意の数のPostgreSQLまたはBDRデータベースと比較できます。
たとえば、データ接続でtechnology = oracle
を定義できます。他の設定を使用して、Oracleへの接続を定義できます。
hostportserviceuserpassword
他のすべてのデータ接続は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>オラクル:
<user> . <table_name
schema_qualified_table_names = off
を設定することで、スキーマ修飾テーブル名を無効にすることができます。これは、oracle_user_tables_only = on
の場合にのみ実行できます。これは、接続されている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
が必要であることに注意してください。
BDRデータベースを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
次のように、 BDRクラスタ全体を単一の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をダウンロードしてインストールする必要があります(または、使用しているオペレーティングシステムによっては特定のフォルダーに抽出します)。
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が違いを見つけると、PostgreSQL接続にのみ適用されるDMLスクリプトを生成します。 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
比較セッションに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の使用時に不一致がある場合、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;