適用対象:SQL Server
この記事では、Oracle Publisherの設定や使用時に起こりうるいくつかの問題を挙げています。
Oracle クライアントおよびネットワーキング ソフトウェアに関連するエラーが発生する
ディストリビューター上でMicrosoft SQL Serverが動作するアカウントに、Oracleクライアントネットワークソフトウェアがインストールされているディレクトリおよびすべてのサブディレクトリの読み取りおよび実行権限を付与しなければなりません。 権限を付与しなかったり、Oracleクライアントコンポーネントが正しくインストールされていない場合、以下のエラーメッセージが表示されます。
"[Microsoft OLE DB Provider for Oracle] によるサーバーへの接続に失敗しました。 Oracle クライアントおよびネットワーク コンポーネントが見つかりません。 これらのコンポーネントは、Oracle Corporation によって提供され、Oracle バージョン 7.3.3 以降のクライアント ソフトウェエア インストールの一部です。 これらのコンポーネントがインストールされるまで、プロバイダーは機能しません。"
ディストリビューターで適切な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 Publisherに接続できない場合、以下を確認してください:
必要な Oracle ソフトウェアがディストリビューターにインストールされているかどうか。
Oracleのデータベースはオンラインで、SQL*Plusのようなツールを使って接続できます。
レプリケーションが Oracle パブリッシャーへの接続に使用するログインには、十分な権限があります。 詳細については、「Configure an Oracle Publisher」(Oracle パブリッシャーの構成) をご覧ください。
tnsnames.oraファイルには、Oracle Publisherの設定時に定義したTNS名が記載されています。
正しいオラクルホームとパスを使っています。 SQL Server ディストリビューターに Oracle バイナリのセットが 1 つしかインストールされていない場合でも、Oracle ホーム関連の環境変数が正しく設定されていることを確認してください。 環境変数の値を変更した場合は、SQL Server を停止してから再起動して、変更を有効にする必要があります。
接続の構成とテストの詳細については、「Configure an Oracle Publisher (Oracle パブリッシャーの構成)」の「Installing and Configuring Oracle Client Networking Software on the SQL Server Distributor (SQL Server ディストリビューターへの Oracle クライアント ネットワーク ソフトウェアのインストールと構成)」を参照してください。
Oracle Publisherは別のディストリビューターと提携しています
Oracle パブリッシャーは、1 つの SQL Server ディストリビューターにのみ関連付けることができます。 Oracle Publisherに別のディストリビューターが関連付けられている場合は、他のディストリビューターを使う前にそのディストリビューターを解除してください。 ディストリビューターを先に切り捨てなければ、以下のいずれかのエラーメッセージが表示されます。
"Oracle サーバー インスタンス '<OraclePublisherName>' は、'<SQLServerDistributorName>' をディストリビューターとして使用するように構成されています。 '<NewSQLServerDistributorName>' をディストリビューターとして使用するためには、Oracle サーバー インスタンスの現在のレプリケーション構成を削除する必要があります。その場合、サーバー インスタンス上のすべてのパブリケーションが削除されます。"
Oracle サーバー '<OracleServerName>' は、ディストリビューター '><>.DistributionDatabaseName' 上で、既にパブリッシャー 'OraclePublisherName' として定義されています。 パブリッシャーを削除するか、パブリック シノニム '<SynonymName>' を削除して、再作成してください。"
Oracle Publisherをドロップすると、Oracleデータベース内のレプリケーションオブジェクトは自動的にクリーンアップされます。 ただし、場合によってはOracleのレプリケーションオブジェクトを手動でクリーンアップする必要があります。 レプリケーションで作成した Oracle レプリケーション オブジェクトを手動でクリーン アップするには、次の手順を実行します。
DBA 権限で Oracle パブリッシャーに接続します。
SQL コマンド
DROP PUBLIC SYNONYM MSSQLSERVERDISTRIBUTOR;を実行します。SQL コマンド
DROP USER <replication_administrative_user_schema>``CASCADE;を実行します。
プライマリキーの欠如に関してSQL Serverエラー21663が報告されました
トランザクション パブリケーションのアーティクルには、有効な主キーが必要です。 有効な主キーがない場合、記事を追加しようとした際に以下のエラーメッセージが表示されます。
"ソース テーブル [<TableOwner>].[<TableName>>] に有効な主キーが見つかりません。"
プライマリキーの要件については、「 Oracle Publishersの設計考慮事項と制限」の「Unique Indexes and Constraints」セクションをご覧ください。
SQL Serverエラー21642が、重複リンクサーバーログインに関して報告されました
Oracle Publisherを最初に設定すると、プロセスはPublisherとDistributor間の接続用にリンクされたサーバーエントリを作成します。 リンク サーバーには、Oracle TNS サービスと同じ名前が付けられます。 同じ名前のリンクサーバーを作成しようとすると、以下のエラーメッセージが表示されます。
"異種パブリッシャーにはリンク サーバーが必要です。 リンク サーバー '<LinkedServerName>' は既に存在します。 リンク サーバーを削除するか、または別のパブリッシャー名を選択してください。"
このエラーは、リンクサーバーを直接作成しようとした場合や、以前Oracle PublisherとSQL Server Distributorの関係を切り離し、現在再構成しようとしている場合に発生します。 パブリッシャーを再構成しようとしているときにこのエラーが表示される場合は、sp_dropserver (Transact-SQL) を使用してリンク サーバーを削除してください。
リンク サーバー接続で Oracle パブリッシャーに接続する必要がある場合は、別の TNS サービス名を作成してから、sp_addlinkedserver (Transact-SQL) を呼び出すときにこの名前を使用します。 TNS サービス名の作成の詳細については、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の値を確認してください:
[マイ コンピューター]を右クリックし、 [プロパティ]をクリックします。
[詳細設定] タブをクリックし、 [環境変数]をクリックします。
[環境変数] ダイアログ ボックスの [システム環境変数] ボックスで、 [Path] 変数をクリックし、 [編集]をクリックします。
「システム変数編集」ダイアログボックスで、sqlplus.exe を含むフォルダへのパスが変数値のテキストボックスにない場合は、その文字列を編集してそれを含めてください。
開いている各ダイアログ ボックスで [OK] をクリックして作業を終了し、変更を保存します。
ディストリビューターで sqlplus.exe が見つからない場合は、ディストリビューターで最新のOracleクライアントソフトウェアをインストールしてください。 詳細については、「Configure an Oracle Publisher」(Oracle パブリッシャーの構成) をご覧ください。
SQL Server エラー 21620 が発生する
バージョン8.1より前のOracleデータベースに接続している場合、Oracleの公開にはDistributorにインストールされたOracleクライアントソフトウェアがバージョン9のものである必要があります。 バージョン8.1以降のOracleデータベースに接続する場合は、Oracleクライアントソフトウェアバージョン10以降を使いましょう。
Oracle パブリッシャーを構成する前に、Oracle パブリッシングはディストリビューターのシステム パスを介してアクセスできる SQL*PLUS のバージョンが、バージョン 9 以降であることを確認します。 もしそうでなければ、以下のエラーメッセージが表示されます:
"システムの Path 変数からアクセスできる SQL*PLUS のバージョンが古いため、Oracle パブリッシングをサポートできません。 ディストリビューターに Oracle クライアント コードの現在のバージョンがインストールされていることを確認してください。"
ディストリビューターに複数のバージョンのOracleクライアントソフトウェアをインストールしている場合は、最新バージョンが少なくともバージョン9であること、そしてシステムパス変数がまずこのバージョンを参照していることを確認しましょう(他のバージョンへの参照は、最新のバージョンが先に表示される限り表示しても構いません)。 システムパス変数の編集についての詳細は、この記事の前半の「SQL Server is Raised」セクションをご覧ください。
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クライアントソフトウェアのインストールディスクからインストールしてください。 詳細については、「Configure an Oracle Publisher」(Oracle パブリッシャーの構成) をご覧ください。
Oracle OLEDBプロバイダーがインストールされている場合は、登録されていることを確認してください。 プロバイダーDLLを登録するには、DLLがインストールされているディレクトリから以下のコマンドを実行し、その後SQL Serverインスタンスを停止して再起動します:
-
regsvr32 OraOLEDB10.dllまたはregsvr32 OraOLEDB.dll。
SQL Serverエラー21626またはエラー21627が発生します
Oracleのパブリッシング環境が正しく設定されているかを確認するために、SQL Serverは設定時に指定したログイン情報を使い、Oracle Publisherに接続しようとします。 SQL Server DistributorがOracle Publisherに接続できない場合、以下のエラーメッセージが表示されます。
- "Oracle OLEDB プロバイダー OraOLEDB.Oracle を使用して Oracle データベース サーバー '%s' に接続できません。"
このエラーメッセージが表示された場合は、Oracle Publisherの設定時に指定したログインとパスワードでSQL*PLUSを直接実行してOracleデータベースに接続しているか確認してください。 詳細については、この記事の冒頭の「The SQL Server Distributor Can't Connect to the Oracle Database Instance」のセクションをご覧ください。
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 Publisherの設定が失敗します。
レジストリ設定を表示および変更するには、次の手順を実行します。
[スタート] を選択し、 [実行] を選択します。
「実行」ダイアログボックスで「regedit」と入力し、「OK」を選択してください。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\Providers に移動します。
プロバイダーの下に「
OraOLEDB.Oracle」というフォルダを見つけてください。 このフォルダー内で、値が 1 の DWORD 値名 AllowInProcess を見つけます。AllowInProcessが0に設定されている場合は、レジストリエントリを1に更新してください:
エントリを右クリックしてから 「Modify」を選択してください。
[文字列の編集] ダイアログ ボックスで、 [値のデータ] ボックスに「 1 」と入力します。
SQL Serverエラー21684が発生します
管理者アカウントに十分な権限がない場合、以下のエラーメッセージが表示されます。
"Oracle パブリッシャー '%s' の管理者ログインに関連付けられた権限が不十分です。"
ユーザーに付与された権限を確認するには、以下のクエリを実行します: 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:最大開いているカーソル数を超えた」
この問題を回避するには、Oracle データベースの max_open_cursors 設定に、高い値 (1000 以上) を設定します。 この設定の詳細については Oracle のマニュアルを参照してください。
Oracle エラー ORA-01555
次の Oracle データベース エラーは、スナップショット レプリケーションに関連するものではありません。このエラーは、Oracle でのデータの読み取り一貫性ビューの構築方法に関連します。
「ORA-01555:スナップショットが古すぎる」
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: FILEOPEN操作用の存在しないディレクトリまたはファイル」
Publisherの再構成が必要な変更
レプリケーションメタデータのテーブルや手続きを変更する場合は、Publisherを解除して再設定する必要があります。 Publisherを再設定するには、Publisherを解除し、SQL Server Management Studio、Transact-SQL、またはRMOを使って再度設定する必要があります。 Publisherの設定に関する詳細は「Oracle Publisherの設定」をご覧ください。
Oracle Publisher(SQL Server Management Studio)を廃止するには
SQL Server の Oracle パブリッシャーのディストリビューターに接続し、サーバー ノードを展開します。
[レプリケーション]を右クリックし、 [ディストリビューターのプロパティ]をクリックします。
[ディストリビューターのプロパティ] ダイアログ ボックスの [パブリッシャー] ページで、Oracle パブリッシャーのチェック ボックスをオフにします。
OK をクリックします。
Oracle パブリッシャーを削除するには (Transact-SQL)
- sp_dropdistpublisherを実行します。 詳細については、「sp_dropdistpublisher (Transact-SQL)」を参照してください。