ヘッダーをスキップ
Oracle® Services for Microsoft Transaction Server開発者ガイド
11gリリース2 (11.2) for Microsoft Windows
B58888-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

3 リカバリのシナリオ管理

この章では、Microsoft Transaction Server連携のOracleトランザクション・リカバリを作成し、スケジューリングする方法について説明します。

この章の項目は次のとおりです。

Microsoft Transaction Serverの構成要件

Oracle Services for Microsoft Transaction Server(OraMTS)のインストールまたは移行後に、Microsoft Transaction ServerおよびOracle Database環境を構成する必要があります。

コンピュータにMicrosoft Transaction Serverがインストールされている場合、Windowsコンピュータでは構成の必要はありません。

Microsoft Transaction Serverを構成するには、Oracle Databaseがインストールされているコンピュータで次のタスクを実行します。

  1. データベースに対してoramtsadmin.sqlスクリプトを実行し、Microsoft Transaction Server管理者ユーザー・アカウント(デフォルト・ユーザー名はmtssys)を作成します。

  2. 自動トランザクション・リカバリをスケジューリングします。

    「Microsoft Transaction Serverの自動トランザクション・リカバリのスケジューリング」を参照してください。

  3. Oracle Fail Safe構成を持っている場合は、oramtsadmin.sqlスクリプトの実行前または実行後にレジストリの値を変更します。

    「Oracle Fail Safe構成用のレジストリ値の変更」を参照してください。

Microsoft Transaction Serverトランザクション・リカバリの概要

Oracle DatabaseでMicrosoft Transaction Serverを使用するには、分散トランザクション機能が必要です。Microsoft Transaction Server連携のOracleトランザクションは、次のいずれかで障害が発生すると、インダウト・トランザクションになります。

Oracle MTS Recovery Serviceは、失敗したトランザクションが開始されたコンピュータで、インダウト・トランザクションを解決します。

通常、Oracle MTS Recovery Serviceは、自動的に作成され、Oracle Services for Microsoft Transaction Serverとともに起動されます。ただし、Oracle Databaseリリース11.2.0.3から11.2.0.xでは、インストール時に選択したオプションによっては、Oracle MTS Recovery Serviceが作成されてもインストール終了時に起動されない場合があります。この場合、手動でこれを起動する必要があります。

各コンピュータにOracle MTS Recovery Serviceを1つのみインストールできます。Microsoft Transaction Server対応の各データベースでスケジューリングされたリカバリ・ジョブによって、Oracle MTS Recovery Serviceがインダウト・トランザクションを解決できるようになります。

Oracle MTS Recovery Serviceにより、Microsoft Transaction Serverのインダウト・トランザクションが次の順序で解決されます。

  1. DBMSリカバリ・ジョブにより、MTS連携のインダウト・トランザクションが検出されます。

  2. DBMSリカバリ・ジョブでは、インダウト・トランザクションのXIDから、リカバリ・サービスのエンドポイントのアドレスが抽出され、MTS/MS DTCトランザクションの結果に対するリカバリ・サービスが要求されます。

  3. リカバリ・サービスにより、トランザクションの結果に対するMS DTCが要求されます。

  4. リカバリ・サービスでは、DBMSジョブ・プロセスに対してトランザクションの結果が報告されます。

  5. DBMSリカバリ・ジョブにより、インダウト・トランザクションがコミットまたは終了されます。

Microsoft Transaction Serverの自動トランザクション・リカバリのスケジューリング

OraMTSは、サーバーベースのリカバリを使用して、MSDTCによって開始されたインダウト・トランザクションを解決します。これを行うには、OraMTS管理者は、UTL_HTTPを通じてWindows中間層ノードにアクセス可能である必要があります。「自動トランザクション・リカバリの構成」に示すように、oramtsadmin.sqlにより、UTL_HTTPに対する実行権限がOraMTS管理者に付与されます。


注意:

Oracleバージョン11g 以上では、「アクセス制御リスト(ACL)の作成」で説明するとおり、DBAはアクセス制御リスト(ACL)を作成する必要があります。

アクセス制御リスト(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;

自動トランザクション・リカバリの構成

自動トランザクション・リカバリは、データベース・ジョブをスケジューリングすることで実行します。インダウト・トランザクションに対するデータベース・ジョブは、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分おきにスケジューリング

次のタスクを実行し、データベースでの自動トランザクション・リカバリをスケジューリングします。

データベースのジョブ・キュー・プロセスの設定および起動

初期化パラメータJOB_QUEUE_PROCESSESでは、1インスタンスで起動されるジョブ・スレーブの最大数を指定します。

ジョブ・キュー・プロセスを設定して起動するには、次のようにします。

  1. SYSDBA権限があることを確認します。

  2. Oracle Databaseがインストールされているコンピュータにログオンします。

  3. SQL*Plusを起動します。

    C:\> sqlplus /NOLOG
    
  4. データベースにSYSDBAとして接続します。

    SQL> CONNECT / AS SYSDBA
    
  5. 初期化パラメータJOB_QUEUE_PROCESSESを設定します。

    JOB_QUEUE_PROCESSES = 1
    

    このパラメータのデフォルト値は0です。メッセージの伝播先が多数ある場合は、このパラメータに1より大きい値を設定します。

  6. Oracle Databaseを停止します。

    SQL> SHUTDOWN
    
  7. Oracle Databaseを再起動します。

    SQL> STARTUP
    
  8. SQL*Plusを終了します。

    SQL> EXIT
    

自動トランザクション・リカバリの作成とスケジューリング

oramtsadmin.sqlスクリプトでは、デフォルト・ユーザー名mtssysでMicrosoft Transaction Server管理者ユーザー・アカウントを作成します。Microsoft Transaction Serverトランザクション・リカバリ・ジョブは、管理者ユーザー・アカウントで実行されます。

oramtsadmin.sqlスクリプトでは、utl_oramts.sqlスクリプトを実行して、管理者ユーザー・アカウントに次の権限およびロールを付与します。

  • CREATE SESSIONロール

  • SELECT_CATALOG_ROLEロール

  • FORCE_ANY_TRANSACTION権限

  • DBMS_JOBSパッケージでEXECUTE権限を付与

  • DBMS_TRANSACTIONパッケージでEXECUTE権限を付与

自動トランザクション・リカバリを作成してスケジューリングするには、次のようにします。

  1. SYSDBA権限があることを確認します。

  2. Oracle Databaseがインストールされているコンピュータにログオンします。

  3. SQL*Plusを起動します。

    C:\> sqlplus /NOLOG 
    
  4. データベースにSYSDBAとして接続します。

    SQL> CONNECT / AS SYSDBA
    
  5. oramtsadmin.sqlスクリプトを実行します。

    SQL> @ORACLE_BASE\ORACLE_HOME\oramts\admin\oramtsadmin.sql;
    

    Microsoft Transaction Serverの管理者ユーザー名およびパスワードをそれぞれ指定するよう求められます。デフォルトのユーザー名mtssysおよびパスワードmtssysを受け入れることも、変更することもできます。

  6. 手順5でパスワードを変更しなかった場合は、次のスクリプトを使用して、変更できます。

    SQL> ALTER USER USERNAME IDENTIFIED BY new_password;
    

    このタスクの完了後にユーザー名を変更するには、そのユーザーを削除してoramtsadmin.sqlスクリプトを再実行し、要求されたら別のユーザー名を指定します。

  7. SQL*Plusを終了します。

    SQL> EXIT
    

utl_oramtsという単一のPL/SQLパッケージがMicrosoft Transaction Server管理者のスキーマに作成されます。utl_oramtsでは、次のパブリック・プロシージャを提供し、次のビューを作成します。

utl_oramts.show_indoubtプロシージャ

このプロシージャを使用して、データベース内のMicrosoft Transaction Serverインダウト・トランザクションを表示します。このプロシージャでは、dbms_outputパッケージを使用して結果を表示します。

説明: このプロシージャを使用する場合、SERVEROUTPUTONに設定する必要があります。

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
utl_oramts.recover_automaticプロシージャ

このプロシージャは、トランザクション・リカバリ・ジョブで実行されます。utl_oramts.recover_automaticに対して自動データベース・ジョブがスケジューリングされます。ジョブが実行されると、データベースでMicrosoft Transaction Serverと連携した未解決のグローバル・トランザクションがないかどうかが確認されます。インダウト・トランザクションのXIDの情報により、トランザクションが開始されたコンピュータが示されます。Oracle MTS Recovery Serviceが通知を受け、トランザクションを解決します。

utl_oramts.forget_RMsプロシージャ

このプロシージャを使用して、トランザクション・マネージャ(MS DTC)からの解決済トランザクションの消去を要求します。このプロシージャは、リカバリ後のクリーンアップ・ジョブで実行されます。

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接続の場合、これはホスト名およびポート番号に変換されます。

Microsoft Transaction Serverインダウト・トランザクションの表示

データベース内のMicrosoft Transaction Server連携のインダウト・トランザクションを表示するには、SQL*Plusを使用してoramts_2pc_pendingビューを問い合せます。

  1. Microsoft Transaction Server管理者ユーザー・アカウントを使用して、SQL*Plusを起動します。

    C:\> sqlplus mtsadmin_user/ mtsadmin_password
    
  2. 次のコマンドを入力します。

    SQL> SELECT * FROM oramts_2pc_pending;
    

    これにより、インダウト・トランザクションが開始されたコンピュータが表示されます。

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構成用にレジストリ値を変更するには、次のようにします。

  1. MS DTCおよびOracle MTS Recovery Serviceがインストールされているコンピュータにログオンします。

  2. コマンド・プロンプトからレジストリ エディタを起動します。

    C:\> regedt32
    

    「レジストリ エディタ」ウィンドウが表示されます。

  3. HKEY_LOCAL_MACHINE\Software\Oracle\OracleMTSRecoveryServiceに移動します。

  4. ここに指定されているレジストリ情報をクラスタ内の全ノードにコピーします。

  5. キーを追加したコンピュータを再起動します。