Share via


Oracle パブリッシャのトラブルシューティング

更新 : 2006 年 12 月 12 日

このトピックでは、Oracle パブリッシャを構成および使用する際に発生する可能性のあるいくつかの問題を示します。

Oracle クライアントおよびネットワーキング ソフトウェアに関連するエラーが発生する

ディストリビュータ上の Microsoft SQL Server が実行されるアカウントには、Oracle クライアント ネットワーク ソフトウェアがインストールされているディレクトリ (およびすべてのサブディレクトリ) に対する読み取り権限と実行権限を付与する必要があります。これらの権限が付与されていなかったり、Oracle クライアント コンポーネントが正しくインストールされていない場合は、次のエラー メッセージが表示されます。

"Connection to server failed with [Microsoft OLE DB Provider for Oracle].Oracle client and networking components were not found.These components are supplied by Oracle Corporation and are part of the Oracle Version 7.3.3 or later client software installation.Provider is unable to function until these components are installed."

適切な Oracle クライアントがディストリビュータにインストールされている場合は、そのクライアントのインストールが完了した後に、SQL Server をいったん停止して再起動したか確認してください。これは、SQL Server でクライアント コンポーネントを認識するために必要です。

権限が付与されていること、およびコンポーネントが正しくインストールされていることを確認したにもかかわらず、このエラーが継続して発生する場合は、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI のレジストリ設定が正しいかどうかを確認してください。

  • Oracle 10g の場合、正しい設定は次のようになります。
    • OracleOciLib = oci.dll
    • OracleSqlLib = orasql10.dll
    • OracleXaLib = oraclient10.dll
  • Oracle 9i の場合、正しい設定は次のようになります。
    • OracleOciLib = oci.dll
    • OracleSqlLib = orasql9.dll
    • OracleXaLib = oraclient9.dll

SQL Server ディストリビュータが Oracle データベース インスタンスに接続できない

SQL Server ディストリビュータが Oracle パブリッシャに接続できない場合は、次の点を確認してください。

  • 必要な Oracle ソフトウェアがディストリビュータにインストールされているかどうか。
  • Oracle データベースがオンラインになっており、SQL*Plus などのツールを使用して Oracle データベースに接続できるかどうか。
  • レプリケーションが Oracle パブリッシャに接続する際に使用するログインに十分な権限があるかどうか。詳細については、「Oracle パブリッシャの構成」を参照してください。
  • Oracle パブリッシャの構成中に定義された TNS 名が tnsnames.ora ファイルに記載されているかどうか。
  • 正しい Oracle ホームおよびパスが使用されているかどうか。SQL Server ディストリビュータに Oracle バイナリのセットが 1 つしかインストールされていない場合でも、Oracle ホーム関連の環境変数が正しく設定されていることを確認してください。環境変数の値を変更した場合は、SQL Server を停止してから再起動して、変更を有効にする必要があります。

接続の構成とテストの詳細については、「Oracle パブリッシャの構成」の「SQL Server ディストリビュータへの Oracle クライアント ネットワーク ソフトウェアのインストールと構成」を参照してください。

Oracle パブリッシャが別のディストリビュータに関連付けられている

Oracle パブリッシャは、1 つの SQL Server ディストリビュータにのみ関連付けることができます。別のディストリビュータを Oracle パブリッシャに関連付ける場合は、関連付けられているディストリビュータを削除してから、別のディストリビュータを使用する必要があります。ディストリビュータを最初に削除しない場合、次のエラー メッセージのいずれかが表示されます。

  • "Oracle サーバー インスタンス '<OraclePublisherName>' は、'<SQLServerDistributorName>' をディストリビュータとして使用するように構成されています。'<NewSQLServerDistributorName>' をディストリビュータとして使用するためには、Oracle サーバー インスタンスの現在のレプリケーション構成を削除する必要があります。その場合、サーバー インスタンス上のすべてのパブリケーションが削除されます。"
  • "Oracle サーバー '<OracleServerName>' は、既にディストリビュータ '<SQLServerDistributorName>.<DistributionDatabaseName>' のパブリッシャ '<OraclePublisherName>' として定義されています。パブリッシャを削除するか、パブリック シノニム '<SynonymName>' を削除して、再作成してください。"

Oracle パブリッシャが削除されると、Oracle データベース内のレプリケーション オブジェクトが自動的にクリーンアップされます。ただし、Oracle レプリケーション オブジェクトを手動でクリーンアップすることが必要な場合もあります。レプリケーションで作成した Oracle レプリケーション オブジェクトを手動でクリーン アップするには、次の手順を実行します。

  1. DBA 権限で Oracle パブリッシャに接続します。
  2. SQL コマンド DROP PUBLIC SYNONYM MSSQLSERVERDISTRIBUTOR; を実行します。
  3. SQL コマンド DROP USER <replication_administrative_user_schema>``CASCADE; を実行します。

主キーの欠如に関する SQL Server エラー 21663 が発生する

トランザクション パブリケーションのアーティクルには、有効な主キーが必要です。有効な主キーがない場合は、アーティクルを追加しようとすると、次のエラー メッセージが表示されます。

"ソース テーブル [<TableOwner>].[<TableName>] に有効な主キーが見つかりません。"

主キーの要件の詳細については、トピック「Oracle パブリッシャの設計上の注意点および制限」の「一意のインデックスおよび制約」を参照してください。

複製リンク サーバーのログインに関する SQL Server エラー 21642 が発生する

Oracle パブリッシャを最初に構成するときに、パブリッシャとディストリビュータ間の接続用にリンク サーバー エントリが作成されます。リンク サーバーには、Oracle TNS サービスと同じ名前が付けられます。同じ名前でリンク サーバーを作成しようとすると、次のエラー メッセージが表示されます。

"異種パブリッシャにはリンク サーバーが必要です。リンク サーバー '<LinkedServerName>' は既に存在します。リンク サーバーを削除するか、または別のパブリッシャ名を選択してください。"

このエラーは、リンク サーバーを直接作成しようとしたり、Oracle パブリッシャと SQL Server ディストリビュータ間のリレーションシップを以前に削除し、再構成しようとしている場合に発生する可能性があります。パブリッシャを再構成しようとしているときにこのエラーが表示される場合は、sp_dropserver (Transact-SQL) を使用してリンク サーバーを削除してください。

リンク サーバー接続で Oracle パブリッシャに接続する必要がある場合は、別の TNS サービス名を作成してから、sp_addlinkedserver (Transact-SQL) を呼び出すときにこの名前を使用します。TNS サービス名の作成の詳細については、Oracle のマニュアルを参照してください。

入れ子になったトランザクションに関する SQL Server エラー 7395 が発生する

Oracle パブリッシャへのリンク サーバー接続で入れ子になったトランザクションを実行しようとすると、次のエラーが表示されます。

"リンク サーバー '<ServerName>' の OLE DB プロバイダ "MSDAORA" では入れ子になったトランザクションを開始できません。XACT_ABORT オプションが OFF に設定されているので、入れ子になったトランザクションが必要です。"

ストアド プロシージャを使用して Oracle パブリッシャを構成またはメンテナンスする場合、プロシージャを明示的なトランザクションに含めないでください。

SQL Server エラー 21617 が発生する

Oracle パブリッシングでは、Oracle アプリケーション SQL*PLUS を使用して、パブリッシャ サポートコードのパッケージを Oracle データベースにダウンロードします。Oracle パブリッシャを構成する前に、SQL Server は SQL*PLUS がディストリビュータのシステム パスを介してアクセス可能であることを確認します。SQL*PLUS を読み込めない場合、次のエラー メッセージが表示されます。

"SQL*PLUS を実行できません。現在のバージョンの Oracle クライアント コードがディストリビュータにインストールされていることを確認してください。"

ディストリビュータで SQL*PLUS を検索してください。Oracle 10g クライアント インストールの場合、この実行可能ファイルの名前は sqlplus.exe で、通常は %ORACLE_HOME%/bin にインストールされています。SQL*PLUS のパスがシステム パスに含まれていることを確認するには、システム変数 Path の値を調べます。

  1. [マイ コンピュータ] を右クリックし、[プロパティ] をクリックします。
  2. [詳細設定] タブをクリックし、[環境変数] をクリックします。
  3. [環境変数] ダイアログ ボックスの [システム環境変数] ボックスで、[Path] 変数をクリックし、[編集] をクリックします。
  4. [システム変数の編集] ダイアログ ボックスで、[変数値] ボックスに sqlplus.exe を含むフォルダへのパスが表示されていない場合は、このパスを含むように文字列を編集します。
  5. 開いている各ダイアログ ボックスで [OK] をクリックして作業を終了し、変更を保存します。

ディストリビュータで sqlplus.exe が見つからない場合は、Oracle クライアント ソフトウェアの現在のバージョンをディストリビュータにインストールします。詳細については、「Oracle パブリッシャの構成」を参照してください。

SQL Server エラー 21620 が発生する

Oracle データベースのバージョン 8.1 よりも前のバージョンに接続している場合、Oracle パブリッシングでは、ディストリビュータにインストールされている Oracle クライアント ソフトウェアが、バージョン 9 からのものである必要があります。Oracle データベースのバージョン 8.1 以降に接続している場合は、Oracle クライアント ソフトウェアのバージョン 10 以降を使用することをお勧めします。ディストリビュータ用の Oracle クライアント ソフトウェアの選択に関する最新のガイドラインについては、この Microsoft Web サイトを参照してください。

Oracle パブリッシャを構成する前に、Oracle パブリッシングはディストリビュータのシステム パスを介してアクセスできる SQL*PLUS のバージョンが、バージョン 9 以降であることを確認します。バージョン 9 以降でない場合、次のエラー メッセージが表示されます。

"システムの Path 変数からアクセスできる SQL*PLUS のバージョンが古いため、Oracle パブリッシングをサポートできません。ディストリビュータに Oracle クライアント コードの現在のバージョンがインストールされていることを確認してください。"

ディストリビュータに Oracle クライアント ソフトウェアの複数のバージョンがインストールされている場合は、最新のバージョンが少なくともバージョン 9 であり、システム パス変数でそのバージョンが最初に参照されていることを確認します (最新のバージョンが最初に参照されていれば、他のバージョンが参照されていてもかまいません)。システム パス変数の編集に関する詳細については、このトピックで既に説明した「SQL Server エラー 21617 が発生する」を参照してください。

SQL Server エラー 21624 または SQL Server エラー 21629 が発生する

64 ビット ディストリビュータの場合、Oracle パブリッシングでは、Oracle OLEDB Provider for Oracle (OraOLEDB.Oracle) が使用されます。ディストリビュータに Oracle OLEDB プロバイダがインストールおよび登録されていることを確認してください。このプロバイダがインストールおよび登録されていない場合、次のエラー メッセージのいずれかまたは両方が表示されます。

  • "ディストリビュータ '%s' に登録済みの Oracle OLEDB プロバイダ OraOLEDB.Oracle が見つかりません。ディストリビュータに現在のバージョンの Oracle OLEDB プロバイダがインストールおよび登録されていることを確認してください。"
  • "Oracle 用の Oracle OLEDB プロバイダ OraOLEDB.Oracle が登録されていることを示す CLSID レジストリ キーがディストリビュータに存在しません。ディストリビュータに Oracle OLEDB プロバイダがインストールおよび登録されていることを確認してください。"

Oracle クライアント ソフトウェア バージョン 10g を使用している場合、プロバイダは OraOLEDB10.dll です。バージョン 9i の場合、プロバイダは OraOLEDB.dll です。プロバイダは %ORACLE_HOME%\BIN (たとえば、C:\oracle\product\10.1.0\Client_1\bin) にインストールされます。ディストリビュータに Oracle OLEDB プロバイダがインストールされていない場合は、Oracle が提供する Oracle クライアント ソフトウェア インストール ディスクからインストールしてください。詳細については、「Oracle パブリッシャの構成」を参照してください。

Oracle OLEDB プロバイダがインストールされている場合は、そのプロバイダが登録されていることを確認してください。プロバイダの DLL を登録するには、DLL がインストールされているディレクトリから次のコマンドを実行し、SQL Server インスタンスを停止して再起動します。

  1. regsvr32 OraOLEDB10.dll または regsvr32 OraOLEDB.dll

SQL Server エラー 21626 または SQL Server エラー 21627 が発生する

Oracle パブリッシング環境が正しく構成されていることを確認するために、SQL Server により、構成時に指定したログイン資格情報を使用して、Oracle パブリッシャへの接続が試行されます。SQL Server ディストリビュータが Oracle パブリッシャに接続できない場合、次のエラー メッセージのいずれかが表示されます。

  • "Oracle OLEDB プロバイダ OraOLEDB.Oracle を使用して Oracle データベース サーバー '%s' に接続できません。"
  • "Microsoft OLEDB プロバイダ MSDAORA を使用して Oracle データベース サーバー '%s' に接続できません。"

このエラー メッセージが表示された場合は、Oracle パブリッシャの構成時に指定したのと同じログインとパスワードを使用して SQL*PLUS を直接実行することにより、Oracle データベースへの接続を確認してください。詳細については、このトピックで既に説明した「SQL Server Server ディストリビュータが Oracle データベース インスタンスに接続できない」を参照してください。

SQL Server エラー 21628 が発生する

64 ビット ディストリビュータの場合、Oracle パブリッシングでは、Oracle OLEDB Provider for Oracle (OraOLEDB.Oracle) が使用されます。Oracle プロバイダを SQL Server と同じプロセスで実行可能にするために、SQL Server によってレジストリ エントリが作成されます。このレジストリ エントリの読み取りまたは書き込みに問題がある場合、次のエラー メッセージが表示されます。

"ディストリビュータ '%s' のレジストリを更新し、Oracle OLEDB プロバイダ OraOLEDB.Oracle を SQL Server と同じプロセスで実行可能にすることができません。SQL Server が所有しているレジストリ キーの変更が現在のログインに許可されていることを確認してください。"

Oracle パブリッシングでは、このレジストリ エントリが存在し、64 ビット ディストリビュータの場合は 1 に設定されている必要があります。このエントリが存在しない場合は、SQL Server によって作成されます。このエントリは存在するが、0 に設定されている場合は、設定は変更されず、Oracle パブリッシャの構成は失敗します。

レジストリ設定を表示および変更するには、次の手順を実行します。

  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。
  2. [ファイル名を指定して実行] ダイアログ ボックスで、「regedit」と入力し、[OK] をクリックします。
  3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\Providers に移動します。
    [Providers] の下に、[OraOLEDB.Oracle] という名前のフォルダがあります。このフォルダの中に、[AllowInProcess] という名前の DWORD 値があり、値は 1 になっている必要があります。
  4. [AllowInProcess]0 に設定されている場合は、このレジストリ エントリを 1 に更新します。
    1. エントリを右クリックし、[変更] をクリックします。
    2. [文字列の編集] ダイアログ ボックスで、[値のデータ] ボックスに「1」と入力します。

SQL Server エラー 21684 が発生する

管理ユーザー アカウントに十分な権限がない場合は、次のエラー メッセージが表示されます。

"Oracle パブリッシャ "%s" のレプリケーション管理ユーザーの権限が不十分です。スクリプト /MSSQL/Install/oracleadmin.sql を参照し、必要な権限を確認してください。"

ユーザーに与えられた権限を確認するには、クエリ SELECT * from session_privs を実行します。出力は次のようになります。

PRIVILEGE
------------------
CREATE SESSION
CREATE TABLE
CREATE PUBLIC SYNONYM
DROP PUBLIC SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER

レプリケーション ユーザー スキーマの権限に関する問題が発生する

レプリケーション ユーザー スキーマには、「Oracle パブリッシャの構成」の「手動によるユーザー スキーマの作成」で説明されている権限が必要です。

Oracle エラー ORA-01000

パブリケーションへアーティクルを追加処理中に、レプリケーションは Oracle パブリッシャでカーソルを使用します。この処理中にパブリッシャで使用できるカーソルの最大数を超える可能性があります。最大数を超えると、次のエラーが発生します。

"ORA-01000: maximum open cursors exceeded"

この問題を回避するには、Oracle データベースの max_open_cursors 設定に、高い値 (1000 以上) を設定します。この設定の詳細については Oracle のマニュアルを参照してください。

Oracle エラー ORA-01555

次の Oracle データベース エラーは、スナップショット レプリケーションに関連するものではありません。このエラーは、Oracle でのデータの読み取り一貫性ビューの構築方法に関連します。

"ORA-01555: Snapshot too old"

Oracle では、ロールバック セグメントと呼ばれるオブジェクトを使用して、SQL ステートメントの発行時点のデータの読み取り一貫性ビューを構築します。"Snapshot too old" エラーは、ロールバック情報が他の同時接続セッションによって上書きされた場合に発生する可能性があります。Oracle 9i よりも前のバージョンでは、このエラーの発生頻度を減らす方法として、ロールバック セグメントのサイズや数を増やしたり、大きいトランザクションを特定のロールバック セグメントに割り当てる方法が推奨されていました。

Oracle 9i では、ロールバック セグメントに代わる、UNDO テーブルスペースの概念が導入されました。Oracle 9i で "Snapshot too old" エラーを回避するには、次の方法をお勧めします。

  • 十分な空き領域を持つ UNDO テーブルスペースを作成する。
  • 作成したテーブルスペースに保証される保有期間を設定する (Oracle 10G 以上)。
  • Oracle の初期化パラメータ UNDO_MANAGEMENT および UNDO_RETENTION を構成する。

"Snapshot too old" エラーを回避する方法の詳細については、Oracle のマニュアルを参照してください。

Oracle エラー ORA-22285

テーブルに BFILE 列が含まれている場合、この列のデータはファイル システムに格納されます。レプリケーション管理ユーザー アカウントには、次の構文を使用して、このデータが格納されているディレクトリへのアクセスを許可する必要があります。

GRANT READ ON DIRECTORY <directory_name> TO <replication_administrative_user_schema>

アクセスが許可されていない場合は、ログ リーダー エージェントにより次のエラーが発生します。

"ORA-22285: non-existent directory or file for FILEOPEN operation"

パブリッシャの再構成が必要になる変更

レプリケーション メタデータ テーブルまたはプロシージャを変更した場合は、パブリッシャを削除して再構成する必要があります。パブリッシャを再構成するには、パブリッシャを削除し、SQL Server Management Studio、Transact-SQL、または RMO を使用してパブリッシャを再構成する必要があります。パブリッシャの構成の詳細については、「Oracle パブリッシャの構成」を参照してください。

Oracle パブリッシャを削除するには ( SQL Server Management Studio )

  1. SQL Server Management Studio の Oracle パブリッシャのディストリビュータに接続し、サーバー ノードを展開します。
  2. [レプリケーション] を右クリックし、[ディストリビュータのプロパティ] をクリックします。
  3. [ディストリビュータのプロパティ] ダイアログ ボックスの [パブリッシャ] ページで、Oracle パブリッシャのチェック ボックスをオフにします。
  4. [OK] をクリックします。

Oracle パブリッシャを削除するには (Transact-SQL)

参照

概念

Oracle パブリッシャの構成
Oracle パブリッシングの概要
レプリケーションのトラブルシューティング

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

追加内容 :
  • SQL Server エラー 21684に関する情報を追加しました。

2006 年 4 月 14 日

追加内容 :
  • Oracle クライアント コンポーネントのインストール後に SQL Server インスタンスを停止して再起動するという推奨事項を追加しました。