Oracle® Databaseインストレーションおよび構成ガイド 11gリリース2 (11.2) for Fujitsu BS2000/OSD E49830-02 |
|
前 |
次 |
この章では、BS2000/OSDのトランザクション・モニターであるopenUTMをOracle Database 11gリリース2 (11.2)との調整された相互運用に使用する方法を説明します。内容は次のとおりです。
Universal Transaction Monitor (openUTM)は、多数の端末から同時に使用できるユーザー・プログラムの実行を制御します。
openUTMアプリケーションは、処理ステージの構造化された順序で構成され、処理ステージでは特定のユーザーに対してアクセス権が提供されます。これらのステージは、順番に全体で実行されるか、まったく実行されないopenUTMトランザクションで構成されます。
複数のユーザーがopenUTMで同時に作業している場合、共有データベースへの同時アクセスも通常必要になります。データベースおよびデータ通信システム(DB/DCシステム)であるOracle Database/openUTMは、Oracle Databaseに対するopenUTMアプリケーションによるアクセスを同期化し、データベースの整合性のある状態を保ちます。システム障害が発生した場合、DB/DCシステムが自動リカバリを実行することで、データベースの整合性が保たれます。
OracleおよびopenUTMの同期化はXAインタフェースを介して実行されます。XAシステムは、データベース・システムとトランザクション監視を調整するためのX/Openインタフェースです。XAインタフェースの概念の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』のOracle XAを使用したアプリケーションの開発に関する説明を参照してください。
第3章、「Oracle Databaseのインストールおよび削除」に従ってOracle Databaseをインストールすると、Oracle DatabaseソフトウェアのopenUTM関連のソフトウェアがインストールされます。配布されたopenUTMファイルは、次のファイルで構成されます。
このファイルにはXAインタフェースの接続モジュールが含まれています。
次のファイルでは、プロシージャおよびプログラムのサンプルが提供されます。
UTM.DEMO.P.COMPILE.C UTM.DEMO.P.COMPILE.COBOL UTM.DEMO.P.KDCDEF UTM.DEMO.P.KDCROOT UTM.DEMO.P.PROBIND UTM.DEMO.P.PROSTRT UTM.DEMO.CSELEMP.PC UTM.DEMO.SELDEP.PCO UTM.DEMO.SELEMP.PCO UTM.DEMO.UPDEMP.PCO UTM.DEMO.ERRSQL.C UTM.DEMO.ERRTXT.C
『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を確認した後に、次の手順を実行してインストールします。
Oracle Databaseに接続するすべてのopenUTMユーザーに、DBA_PENDING_TRANSACTIONS
表に対してSELECT
権限を付与します。次の例を使用して、ユーザーscott
にSELECT
権限を付与します。
grant select on DBA_PENDING_TRANSACTIONS to scott;
openUTMユーザーは、オープン文字列内で項目Acc
で識別されます。この章の「オープン文字列の定義」の項を参照してください。
BS2000上のOracle Database 11gでは、openUTM V6.0以上がサポートされます。openUTMではXAインタフェースがサポートされます。BS2000上のOracle Database 11gは、このXAインタフェースを介してopenUTMと連携します。
openUTMとの調整された相互運用のためのOracle Databaseアプリケーションの開発に関する手順について、この項で説明します。主要な手順は次のとおりです。
openUTMプログラム・ユニットを作成
構成を定義
KDCROOT表モジュールおよびopenUTMプログラム・ユニットを変換
openUTMアプリケーション・プログラムをリンク
openUTMアプリケーションを起動
さらに、この項では、オープン文字列の定義方法およびOracle XAライブラリでのプリコンパイラの使用方法についても説明します。
openUTMプログラム・ユニットを作成
(openUTMのマニュアル『Programming Applications with KDCS for COBOL, C, and C++』、および『Oracle Databaseユーザーズ・ガイドfor Fujitsu BS2000/OSD』を参照)
構成を定義
(openUTMのマニュアル『Generating Applications』および『Administering Applications』を参照)
Oracle Database/openUTMアプリケーションを実行するには、次の情報が必要です。
アプリケーションに関する情報
アクセス保護されたユーザー名およびパスワード
端末および通信パートナに関する情報
トランザクション・コードに関する情報
これらのプロパティは構成を集合的に形成し、この構成はKDCFILE
ファイルに格納されます。構成定義はKDCDEF
ユーティリティによって実行されます。
この項では、Oracle Databaseへの接続時に重要な3つのコマンドについて説明します。次のコマンドがあります。
DATABASE
Oracle Database/openUTMアプリケーションが生成されたら、openUTMがOracle Databaseと通信することを指定する必要があります。次のコマンドを入力して、データベースとのopenUTMの通信を指定します。
DATABASE TYPE=XA,ENTRY=XAOSWD
ここでTYPE=XA
はXAインタフェースの使用を指定し、ENTRY=XAOSWD
はOracle DatabaseのXAスイッチの名前(動的登録の場合)を指定します。
OPTION
OPTION
コマンドで対応するGEN
オペランドを指定した場合、KDCDEF
ユーティリティによってKDCROOT
表モジュールのソースコードも生成されます。OPTION
の構文は次のとおりです。
OPTION [DATA=filename][,GEN={KDCFILE|ROOTSRC|NO|ALL}] [,ROOTSRC=filename][,SHARETAB=filename] [,TEST={N[o]|Y[ES]}]
MAX
もう一つの重要なオペランドはAPPLIMODE
で、これはMAX
コマンドで指定されます。これはシステム障害後の再起動動作を定義します。MAX
の構文は次のとおりです。
MAX APPLINAME=name[,APPLIMODE={S[ECURE]|F[AST]}] [,ASYNTASKS=number][...]
APPLIMODE
=SECURE
は、アプリケーション障害の後に、openUTMアプリケーションとOracle Databaseの調整されたウォーム・スタートを使用してopenUTMが継続することを意味します。
APPLIMODE
=FAST
を指定した場合は、openUTMに再起動情報が格納されていないためopenUTMアプリケーションの再起動は実行されません。エラーが発生した場合、アプリケーションは最初から起動されます。openUTMアプリケーションの障害後に開いたままのトランザクションは、自動的にロールバックされます。
KDCFILE
およびKDCROOT
表モジュールを作成するためのサンプルのプロシージャは、UTM.DEMO.P.KDCDEF
ファイルを参照してください。
KDCROOT
表モジュールおよびopenUTMプログラム・ユニットを変換
KDCROOT
表モジュールのソースはBS2000のAssemblerを使用してコンパイルされる必要があり、openUTMプログラム・ユニットは、対応するプログラミング言語のコンパイラを使用してコンパイルされる必要があります。KDCROOT
表モジュールのコンパイルは、サンプルのプロシージャUTM.DEMO.P.KDCROOT
を参照してください。
openUTMアプリケーション・プログラムをリンク
openUTMアプリケーション・プログラムは、KDCROOT
表モジュールをopenUTMプログラム・ユニットにリンクすることによって生成されます。
stubモジュールXAOSTUBを含む必要があります。
INC-MOD LIB=
ORAUID
.XAO.LIB,ELEM=XAOSTUB
注意: バインド・プロシージャを記述するかわりに、サンプルのプロシージャUTM.DEMO.P.PROBIND を使用して、必要なときに変更を適用します。
独自のバインド・プロシージャを記述する必要がある場合は、記述する前にサンプルを慎重に確認してください。 |
openUTMアプリケーションを起動
openUTMアプリケーションを開始するためのサンプルのプロシージャは、ファイルUTM.DEMO.P.PROSTRT
にあります。
openUTMアプリケーションを起動する場合は、openUTMの開始パラメータとともにOracle Databaseの開始パラメータを指定する必要があります。
openUTMの開始パラメータについては、openUTMのマニュアル『Using openUTM Applications under BS2000/OSD』を参照してください。
Oracle Database 10gとの調整された相互運用のためにXAインタフェースを使用するための開始パラメータは、次のとおりです。
.RMXA RM="Oracle_XA",OS="<ORACLE open string>"
この項では、オープン文字列の構成方法について説明します。トランザクション・モニターは、データベースを開くためにこの文字列を使用します。オープン文字列内の最大文字数は256文字で、オープン文字列の最大数は8個です。次のように文字列を構成します。
Oracle_XA{+required_fields...}[+optional_fields...]
required_fields
は次のとおりです。
Acc
=P/user/access_info
SesTm
=session_time_limit
optional_fields
は次のとおりです。
DB
=db_name
MaxCur
=maximum_no_of_open_cursors
SqlNet
=connect_string
DbgFl
=value_from_1_to_15
注意: 次の点に注意してください。
|
オープン文字列の必須フィールドは次のとおりです。
項目 | 意味 |
---|---|
Acc |
ユーザー・アクセス情報を指定します。 |
P |
明示的なユーザーおよびパスワード情報が提供されていることを示します。 |
user |
有効なOracle Databaseのユーザー名。 |
access_info |
対応する現在のパスワード。 |
たとえば、Acc
=P/scott/tiger
は、ユーザーおよびパスワードの情報が提供されていることを示します。この場合、ユーザーはscott
でパスワードはtiger
です。
正しい処理を行うには、scott
にはDBA_PENDING_TRANSACTIONS
表に対してSELECT
権限が必要です。
項目 | 意味 |
---|---|
SesTm |
システムで自動的に削除されるまでに、トランザクションが非アクティブで存在できる最大時間を指定します。 |
session_time_limit |
この値は、グローバル・トランザクションを開始し、そのトランザクションのコミットまたはロールバックの完了に必要な最大時間に対応する必要があります。 |
オープン文字列のオプションのフィールドを次の表に示します。
項目 | 意味 |
---|---|
DB |
データベースの名前を指定します。 |
db_name |
Oracle Databaseプリコンパイラがデータベースの識別に使用する名前を指定します。
Oracle Databaseプリコンパイラのデフォルトのデータベースのみを使用する(SQL文でAT句を使用しない)アプリケーション・プログラムでは、オープン文字列の 注意: このデフォルトのデータベースは、 明示的に指定したデータベースを使用するアプリケーションは、 たとえば、 |
プリコンパイラ(特にPro*C)の詳細は、この章で後述する項「openUTMでのプリコンパイラの使用」を参照してください。
項目 | 意味 |
---|---|
MaxCur |
データベースのオープン時に割り当てられるカーソルの数を指定します。これは、プリコンパイラ・オプションmaxopencursors と同じ用途で機能します。 |
maximum_no_of_open_cursors |
オープン・カーソルの数を指定します。デフォルトは10です。 |
たとえば、MaxCur
=5
は、処理で5つのオープン・カーソルのキャッシュを試みることを示します。
maxopencursors
の詳細は、『Oracle Database Oracleプリコンパイラのためのプログラマーズ・ガイド』を参照してください。
項目 | 意味 |
---|---|
SqlNet |
SQL*Net接続文字列を指定します。 |
connect_string |
システムにログオンするために使用される文字列を示します。これには、サポートされている任意のOracle Net Services接続文字列を使用できます。 |
たとえば、次のようになります。
SqlNet
=MADRID_FINANCE
は、TNSNAMES.ORA
内のエントリがプロトコル、ホストおよびポート番号を参照することを示します。詳細は、このブックの第9章、「Oracle Net Services」を参照してください。
項目 | 意味 |
---|---|
DbgFl |
デバッグを有効(デバッグ・フラグ)にするかどうかを指定します。詳細は、この章で後述するデバッグに関する説明を参照してください。 |
この項に、前述の情報を使用したオープン文字列の例を示します。
注意: 文字列が1行を超える場合は、openUTMドキュメントの文字列情報を分割する方法に関する説明を参照してください。 |
Bequeathプロトコルの場合:
Oracle_XA+Acc=P/scott/tiger+SesTm=0+DbgFl=15
その他のプロトコルの場合:
Oracle_XA+SqlNet=MADRID_FINANCE+Acc=P/scott/tiger+SesTm=0 Oracle_XA+DB=finance+SqlNet=MADRID_FINANCE+Acc=P/scott/tiger +SesTM=0
オプションのフィールドLogDir
、Loose_Coupling
、SesWT
およびThreads
はサポートされていません。
オープン文字列のフィールドの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』の「Oracle XAを使用したアプリケーションの開発」を参照してください。
プリコンパイラとのインタフェースは、次の2つのオプションから選択できます。
デフォルトのデータベースでのプリコンパイラの使用
指定されたデータベースでのプリコンパイラの使用
すべてのプリコンパイラ・プログラムは、オプションrelease_cursor
をno
に設定して実行する必要があります。プリコンパイラ・プログラムはCまたはCOBOLで記述できます。次の例では、プリコンパイラPro*Cが使用されています。
デフォルトのデータベースでPro*Cにインタフェースするには、オープン文字列で使用されるDB
=db_name
フィールドが存在しないことを確認してください。このフィールドが存在しないことは、ORAENV
ファイルで定義されているとおりのデフォルト接続を示し、各プロセスで1つのデフォルト接続のみが許可されていることを示します。
デフォルトのPro*C接続を識別するオープン文字列の例を次に示します。
Oracle_XA+SqlNet=MADRID_FINANCE+Acc=P/scott/tiger+SesTm=0
ここで、DB
=db_name
が存在せず、空のデータベースID文字列であることを示しています。
SELECT文の構文を次に示します。
EXEC SQL SELECT ENAME FROM EMP;
指定されたデータベースでPro*Cにインタフェースするには、オープン文字列にDB
=db_name
フィールドを含めます。参照するすべてのデータベースは、対応するオープン文字列で指定した同じdb_name
を参照する必要があります。
アプリケーションには、デフォルトのデータベースだけでなく、次に示すとおり、1つ以上の指定されたデータベースが含まれている場合があります。
たとえば、あるデータベースで従業員の給与を更新し、別のデータベースで部門番号(deptno
)を、3つ目のデータベースで管理者情報を更新するとします。トランザクション・マネージャで次のオープン文字列を構成します。
Oracle_XA+SqlNet=MADRID_FINANCE1+Acc=P/scott/tiger+SesTm=0 Oracle_XA+DB=MANAGERS+SqlNet=MADRID_FINANCE2+ Acc=P/scott/tiger+SesTm=0 Oracle_XA+DB=PAYROLL+SqlNet=MADRID_FINANCE3+ Acc=P/scott/tiger+SesTm=0
最初のオープン文字列にはDB
=db_name
フィールドがありません。
アプリケーション・プログラムでは、次のような宣言を入力します。
EXEC SQL DECLARE PAYROLL DATABASE; EXEC SQL DECLARE MANAGERS DATABASE;
ここでも、db_name
フィールドを含まない最初のオープン文字列に対応するデフォルトの接続には宣言は必要ありません。
更新を実行するときは、次のような文を入力します。
EXEC SQL AT PAYROLL update emp set sal=4500 where empno=7788; EXEC SQL AT MANAGERS update emp set mgr=7566 where empno=7788; EXEC SQL update emp set deptno=30 where empno=7788;
最後の文ではデフォルトのデータベースを参照しているため、AT句はありません。
次の例に示すとおり、AT句で文字ホスト変数を使用できます。
EXEC SQL BEGIN DECLARE SECTION; db_name1 CHARACTER(10); db_name2 CHARACTER(10) EXEC SQL END DECLARE SECTION; . . set db_name1 = 'PAYROLL' set db_name2 = 'MANAGERS' . . EXEC SQL AT :db_name1 UPDATE... EXEC SQL AT :db_name2 UPDATE...
詳細は、Pro*COBOLプログラマーズ・ガイドおよびPro*C/C++プログラマーズ・ガイドの同時ログオンに関する説明を参照してください。
注意:
|
この項では、問題またはシステム障害が発生した場合にデータをリカバリする方法を説明します。この後の項で、トレース・ファイルとペンディング・トランザクションのリカバリの両方について説明します。
Oracle XAライブラリでは、すべてのエラーおよびトレース情報がトレース・ファイルに記録されます。この情報は、XAエラー・コードを補足するときに役立ちます。たとえばオープン障害が発生した場合の原因として、オープン文字列が正しくなかったか、Oracle Databaseインスタンスの検索が正常に実行されなかったか、ログイン認可に失敗したかを示すことができます。トレース・ファイルの名前は次のとおりです。
ORAXALOG.pid-db_name-date.TRC
各パラメータの意味は次のとおりです。
pid
はプロセス識別子(TSN)です。
db_name
は、オープン文字列フィールドDB
=db_name
で指定したデータベース名です。
date
は、トレース・ファイルが作成された日付です。
この項では、トレース・ファイルの2つの種類について説明します。
次の例に、1999年4月2日にオープンされたアプリケーション・タスク1234のトレース・ファイルを示します。リソース・マネージャが開かれたときに、このアプリケーションのDB
フィールドはオープン文字列で指定されていませんでした。
ORAXALOG.1234-NULL-990402.TRC
次の例に、1998年12月15日にタスク5678
によって作成されたトレース・ファイルを示します。リソース・マネージャがオープンされたときに、DB
フィールドはオープン文字列でFINANCE
と指定されていました。
ORAXALOG.5678-FINANCE-981215.TRC
トレース・ファイルの各エントリには、次のような情報が含まれています。
1032.2: xa_switch rtn ORA-22
ここで1032
は情報が記録された時間、2
はリソース・マネージャ識別子、xa_switch
はモジュール名、ORA-22
は返されたOracle Database情報です。
オープン文字列にDbgFl
(デバッグ・フラグ)を指定できます。詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』のOracle XAに関する説明を参照してください。
デバッグ・レベルに応じて(low:DbgFl=1、high:DbgFl=15
)、トレース・ファイルORAXALOG
.pid-db_name-date
.TRC
にいくつかのエントリが含まれます(前述の項を参照)。
インダウト・トランザクションまたはペンディング・トランザクションとは、準備はできているがデータベースに対してまだコミットされていないトランザクションです。通常、openUTMは、すべての障害およびインダウトまたはペンディング・トランザクションのリカバリを解決します。ただし、データベース管理者は、たとえばインダウト・トランザクションが次の場合に、UTM-F (APPLIMODE
=FAST
)を使用してインダウト・トランザクションを無視する必要がある場合があります。
他のトランザクションが必要とするデータをロックしている場合
適切な時間の経過後も解決されない場合
注意: インダウト・トランザクションを無視することによって、openUTMとデータベース間で矛盾が発生することがあります。たとえば、データベース管理者によってDBトランザクションがコミットされ、openUTMアプリケーションがウォーム・スタート・フェーズでそのトランザクションをロールバックした場合、Oracle Databaseはこのコミットされたトランザクションをロールバックできないため、矛盾が発生します。 |
Oracle DatabaseのSYS
アカウントには4つの表があり、正規のOracle DatabaseアプリケーションおよびOracle Database/openUTMアプリケーションによって生成されたトランザクションが含まれています。これらを次に示します。
DBA_2PC_PENDING
DBA_2PC_NEIGHBORS
DBA_PENDING_TRANSACTIONS
V$GLOBAL_TRANSACTION
注意: これらの表の使用方法の詳細は、『Oracle Database管理者ガイド』の2フェーズ・コミット時の障害およびインダウト・トランザクションの手動による無視に関する説明を参照してください。 |
Oracle Database/openUTMアプリケーションによって生成されたトランザクションの場合は、次の列情報がDBA_2PC_NEIGHBORS
表に明確に適用されます。
DBID
列は常にxa_orcl
です。
DBUSER_OWNER
列は常にdb_namexa.oracle.com
です。
db_name
は、オープン文字列で常にDB
=db_name
と指定されることに注意してください。オープン文字列にこのフィールドを指定しないと、この列の値はOracle Database/openUTMアプリケーションが生成するトランザクションではNULLxa.oracle.com
になります。
たとえば、次のサンプルのSQL文を使用すると、Oracle Database/openUTMアプリケーションによって生成されたインダウト・トランザクションの詳細情報を取得できます。
SELECT * FROM DBA_2PC_PENDING p, DBA_2PC_NEIGHBORS n WHERE p.LOCAL_TRAN_ID = n.LOCAL_TRAN_ID AND n.DBID = 'xa_orcl';