Oracle RAC による 2 フェーズ・コミット分散トランザクションの構成
Oracle 10g 用の Real Application Cluster (RAC) 構成では、 複数の Oracle RAC ノードにわたる 2 フェーズ・コミット分散トランザクションを Oracle がリカバリーするときに、 トランザクション・マネージャーに関して固有の問題が発生します。1 つのノードが失敗して、 失敗したノードに必要なリカバリー・アクションを Oracle RAC が完了する前に、Oracle が業務用の他の生存ノードを開いた場合に、 問題が発生することがあります。アプリケーション・サーバーでトランザクション・アフィニティーを維持する機能を使用すると、 この問題を回避することができます。
このタスクについて
ORA- 24756: トランザクションが存在しません。
このエラーが
発生した場合、Oracle データベース管理者が、
ロールバックまたはコミット・プロセスを強制することによって、未確定トランザクションを
手動で解決する必要が生じることがあります。ただし、手操作による介入を希望しない場合は、
トランザクションのリカバリーのために、自動で透過的なストラテジーを構成することができます。ORA-01591 インダウト分散トランザクションがロックを保持しています。
この結果、
データベースの一部は使用できなくなります。複数の RAC ノードにわたる 複数のトランザクション・ブランチに及ぶグローバル・トランザクションの可能性を除去することが、透過的な リカバリー・ストラテジーの鍵になります。 トランザクション・ブランチは、グローバル・トランザクションに登録されている データベース接続に対応しています。グローバル 2 フェーズ・コミット・トランザクションのすべての接続が 同じノードから作成されている場合は、トランザクション・リカバリーの問題は発生しません。 2 フェーズ・トランザクションでのエラーを防止するように、アプリケーション・サーバーで Oracle RAC を 構成します。
アプリケーション・サーバーでは、着信接続用の トランザクション・アフィニティーが維持されるので、この機能を使用して、 2 フェーズ・コミット・トランザクションでの Oracle RAC 用の自動リカバリーを構成できます。 この構成を実装すると、特定のアプリケーション・サーバーからの接続はすべて同じ Oracle ノードで受信され、 接続は同じノードで完了されます。この構成では、 トランザクションが複数のノードにわたる状況は回避されるため、 1 つ以上の Oracle ノードがダウンしても、リカバリーの問題は発生しません。
手順
タスクの結果
srvctl start service -d -s
RAC ノード
が動作を停止した場合は、Oracle RAC のクリーンアップおよびリカバリーが完了するまで、
Oracle は DTP サービスをフェイルオーバーしません。
Oracle ノードが再び稼働しても、
Oracle DTP サービスは、新しく再始動された RAC ノードには戻りません。代わりに、
再始動された RAC ノードに手動でサービスを移動する必要があります。Oracle サービスで DTP を 構成すると、Oracle JDBC プロバイダーからアプリケーション・サーバーにロード・バランシングを 転送することになります。ワークロードの分散は、 Oracle ではなく、アプリケーション・サーバーによって行われます。 これは、ロード・バランシングを実装しない、1 つの 1 次ノードのみを使用するサービスを作成したからです。この構成によって、 トランザクション・プロセスが複数の RAC ノードにわたる状況は回避され、 1 つ以上の RAC ノードが失敗したときに発生する可能性のあるリカバリー問題が軽減されます。