3 リカバリのシナリオ管理
これらのトピックでは、Microsoft Transaction Server連携のOracleトランザクション・リカバリを作成し、スケジューリングする方法について説明します。
3.1 Microsoft Transaction Serverの構成要件
Oracle Services for Microsoft Transaction Server(OraMTS)のインストールまたは移行後に、Microsoft Transaction ServerおよびOracle Database環境を構成する必要があります。
コンピュータにMicrosoft Transaction Serverがインストールされている場合、Windowsコンピュータでは構成の必要はありません。
Microsoft Transaction Serverを構成するには、Oracle Databaseがインストールされているコンピュータで次のタスクを実行します。
-
データベースに対して
oramtsadmin.sql
スクリプトを実行し、Microsoft Transaction Server管理者ユーザー・アカウント(デフォルト・ユーザー名はmtssys
)を作成します。 -
自動トランザクション・リカバリをスケジューリングします。
「Microsoft Transaction Serverの自動トランザクション・リカバリのスケジューリング」を参照してください。
-
Oracle Fail Safe構成を持っている場合は、
oramtsadmin.sql
スクリプトの実行前または実行後にレジストリの値を変更します。「Oracle Fail Safe構成用のレジストリ値の変更」を参照してください。
3.2 Microsoft Transaction Serverトランザクション・リカバリの概要
Oracle DatabaseでMicrosoft Transaction Serverを使用するには、分散トランザクション機能が必要です。Microsoft Transaction Server連携のOracleトランザクションは、次のいずれかで障害が発生すると、インダウト・トランザクションになります。
-
Microsoft Transaction Serverのアプリケーション
-
ネットワーク
Oracle MTS Recovery Serviceは、失敗したトランザクションが開始されたコンピュータで、インダウト・トランザクションを解決します。Oracle MTS Recovery Serviceは、Oracle Services for Microsoft Transaction Serverとともに自動的にインストールされます。各コンピュータにOracle MTS Recovery Serviceを1つのみインストールできます。Microsoft Transaction Server対応の各データベースでスケジューリングされたリカバリ・ジョブによって、Oracle MTS Recovery Serviceがインダウト・トランザクションを解決できるようになります。
Oracle MTS Recovery Serviceにより、Microsoft Transaction Serverのインダウト・トランザクションが次の順序で解決されます。
-
DBMSリカバリ・ジョブにより、MTS連携のインダウト・トランザクションが検出されます。
-
DBMSリカバリ・ジョブでは、インダウト・トランザクションのXIDから、リカバリ・サービスのエンドポイントのアドレスが抽出され、MTS/MS DTCトランザクションの結果に対するリカバリ・サービスが要求されます。
-
リカバリ・サービスにより、トランザクションの結果に対するMS DTCが要求されます。
-
リカバリ・サービスでは、DBMSジョブ・プロセスに対してトランザクションの結果が報告されます。
-
DBMSリカバリ・ジョブにより、インダウト・トランザクションがコミットまたは終了されます。
3.3 Microsoft Transaction Serverの自動トランザクション・リカバリのスケジューリング
OraMTSは、サーバーベースのリカバリを使用して、MSDTCによって開始されたインダウト・トランザクションを解決します。これを行うには、OraMTS管理者は、UTL_HTTP
を通じてWindows中間層ノードにアクセス可能である必要があります。「自動トランザクション・リカバリの構成」に示すように、oramtsadmin.sql
により、UTL_HTTP
に対する実行権限がOraMTS管理者に付与されます
注意:
Oracleバージョン11g以上では、「アクセス制御リスト(ACL)の作成」で説明するとおり、DBAはアクセス制御リスト(ACL)を作成する必要があります。
3.3.1 アクセス制御リスト(ACL)の作成
Oracle Databaseバージョン11g 以上では、DBAは、アウトバウンドHTTP接続を作成する権限をOraMTS管理者に付与するアクセス制御リスト(ACL)を作成する必要があります。例3-1で、これを説明しています。
例3-1 ACLリストの作成とOraMTS管理者の追加
BEGIN -- Create the new ACL, naming it "OraMTSadmin.xml", with a description. -- This provides the OraMTS administrative user e.g. MTSADMIN user FOO -- the privilege to connect DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('OraMTSadmin.xml', 'Allow usage to the UTL network packages', 'FOO', TRUE, 'connect'); -- Now grant privilege to resolve DNS names to the OraMTS administrative user DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('OraMTSadmin.xml' , 'FOO', TRUE,'resolve'); -- Specify which hosts this ACL applies to, in this case we are allowing -- access to all hosts. if one knew the list of all Windows middle-tier, -- these could be added one by one. DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('OraMTSadmin.xml','*'); END;
3.3.2 自動トランザクション・リカバリの構成
自動トランザクション・リカバリは、データベース・ジョブをスケジューリングすることで実行します。インダウト・トランザクションに対するデータベース・ジョブは、Microsoft Transaction Serverトランザクションに登録しているデータベースごとにスケジューリングする必要があります。
トランザクション・リカバリは、utl_oramts.sql
およびprvtoramts.plb
スクリプトをトリガーしてPL/SQLパッケージutl_oramts
を作成するoramtsadmin.sql
スクリプトを実行することで構成されます。また、Microsoft Transaction Serverトランザクションと連携したインダウト・トランザクションを表示するデータベース・ビューoramts_2pc_pending
が作成されます。
oramtsadmin.sql
スクリプト:
-
Microsoft Transaction Server管理者ユーザー・アカウントの作成
-
トランザクション・リカバリのデータベース・ジョブを1分おきに自動的にスケジューリング
データベース・ジョブが実行されると、データベースでMicrosoft Transaction Serverと連携した未解決のグローバル・トランザクションがないかどうかが確認されます。インダウト・トランザクションのトランザクション識別子(XID)の情報により、トランザクションが開始されたコンピュータが示されます。そのコンピュータのOracle MTS Recovery Serviceがトランザクションを解決します。
-
リカバリ後のクリーンアップを30分おきにスケジューリング
次のタスクを実行し、データベースでの自動トランザクション・リカバリをスケジューリングします。
3.3.2.1 データベースのジョブ・キュー・プロセスの設定および起動
初期化パラメータJOB_QUEUE_PROCESSES
では、1インスタンスで起動されるジョブ・スレーブの最大数を指定します。
ジョブ・キュー・プロセスを設定して起動するには、次のようにします。
3.3.2.2 自動トランザクション・リカバリの作成とスケジューリング
oramtsadmin.sql
スクリプトでは、デフォルト・ユーザー名mtssys
でMicrosoft Transaction Server管理者ユーザー・アカウントを作成します。Microsoft Transaction Serverトランザクション・リカバリ・ジョブは、管理者ユーザー・アカウントで実行されます。
oramtsadmin.sql
スクリプトでは、utl_oramts.sql
スクリプトを実行して、管理者ユーザー・アカウントに次の権限およびロールを付与します。
自動トランザクション・リカバリを作成してスケジューリングするには、次のようにします。
utl_oramts
という単一のPL/SQLパッケージがMicrosoft Transaction Server管理者のスキーマに作成されます。utl_oramts
では、次のパブリック・プロシージャを提供し、次のビューを作成します。
3.3.2.2.1 utl_oramts.show_indoubtプロシージャ
このプロシージャを使用して、データベース内のMicrosoft Transaction Serverインダウト・トランザクションを表示します。このプロシージャでは、dbms_output
パッケージを使用して結果を表示します。
説明
このプロシージャは、SERVEROUTPUT
がON
に設定されている必要があります。
SQL> SET SERVEROUTPUT ON SQL> EXECUTE utl_oramts.show_indoubt;
次の情報が表示されます。
========================================================= currently indoubt transactions ========================================================= formatid : 21255235 gtrid : C2229A505904974D81FB7316B147325900000000 bqual : 5BAB6A6B55CD294AA20335839110829C0100000000901944700050 local txid : 142.11.202 tx state : prepared protocol : HTTP endpoint : middletier-1@foo.com:2030 ========================================================= formatid : 21255235 gtrid : 259DF9C8DFC5574F8876F0DF4E15CCAD00000000 bqual : 2C8DCED5B9816244BA2B73CC013EEB870100000000901944700050 local txid : 2.18.185 tx state : prepared protocol : HTTP endpoint : middletier-2@foo.com:2030
3.3.2.2.2 utl_oramts.recover_automaticプロシージャ
このプロシージャは、トランザクション・リカバリ・ジョブで実行されます。utl_oramts.recover_automatic
に対して自動データベース・ジョブがスケジューリングされます。ジョブが実行されると、データベースでMicrosoft Transaction Serverと連携した未解決のグローバル・トランザクションがないかどうかが確認されます。インダウト・トランザクションのXIDの情報により、トランザクションが開始されたコンピュータが示されます。Oracle MTS Recovery Serviceが通知を受け、トランザクションを解決します。
3.3.2.2.3 utl_oramts.forget_RMsプロシージャ
このプロシージャを使用して、トランザクション・マネージャ(MS DTC)からの解決済トランザクションの消去を要求します。このプロシージャは、リカバリ後のクリーンアップ・ジョブで実行されます。
3.3.2.2.4 oramts_2pc_pendingビュー
oramts_2pc_pending
ビューは、oramtsadmin.sql
を実行することで作成されます。oramts_2pc_pending
は、データベース内のインダウト・トランザクションを表示します。このビューは次の列で構成されています。
Formatid
これは、データベース内のグローバル・トランザクションのformatid
です。
global_transaction_id
これは、Microsoft Transaction Serverトランザクションに対応するOracleグローバル・トランザクションのトランザクション識別子です。実際には、Microsoft Transaction ServerトランザクションのGlobal Unique Identifier(GUID)です。
branch_id
これには、Oracleトランザクションのブランチ識別子が示されます。1つのMicrosoft Transaction Serverトランザクションが複数のOracleグローバル・トランザクションを持つ場合があります。これは、同じMicrosoft Transaction Serverトランザクション内に存在するMicrosoft Transaction Server/COM+コンポーネントの数に依存します。これらのトランザクションはすべて、下位のグローバル・トランザクション識別子を持ちますが、異なるブランチ識別子を持ちます。
local_tx_id
ローカルのOracleトランザクションは、各Microsoft Transaction Serverトランザクションに対応します。この列は、このローカル・トランザクションに対応する識別子を示します。
state
これには、ペンディング、ヒューリスティックにコミット、ヒューリスティックに終了などのトランザクションの状態が示されます。
protocol
これは、データベース内のトランザクション・リカバリ・ジョブがOracle MTS Recovery Serviceとの通信に使用するプロトコルです。
endpoint
これは、Microsoft Transaction Serverトランザクションが開始されたWindowsコンピュータのエンドポイントです。HTTP接続の場合、これはホスト名およびポート番号に変換されます。
3.4 Microsoft Transaction Serverインダウト・トランザクションの表示
データベース内のMicrosoft Transaction Server連携のインダウト・トランザクションを表示するには、SQL*Plusを使用してoramts_2pc_pending
ビューを問い合せます。
3.5 Oracle Fail Safe構成用のレジストリ値の変更
通常の構成では、MS DTCとOracle MTS Recovery Serviceは同じコンピュータで稼働します。これにより、トランザクション・リカバリに必要な情報がOracleとMicrosoft Transaction Serverの統合レイヤーで使用できるようになります。
Microsoft Transaction ServerアプリケーションがWindowsクラスタの一部となるような構成(たとえば、アプリケーションがクラスタ内の別のノードまたはホストにフェイルオーバー可能な構成)では、MS DTCはクラスタ全体のリソースとして稼働します。すべてのクラスタ・ノードが、任意のクラスタ・ノードで稼働しているMS DTCの1つのインスタンスを使用します。
Oracle Fail Safe構成を採用している場合、Microsoft Transaction Serverトランザクションに登録しているクラスタ内の全ノードに次のレジストリ情報を必ずレプリケートしてください。
Oracle Fail Safe構成用にレジストリ値を変更するには、次のようにします。