![]() ![]() ![]() ![]() ![]() ![]() ![]() |
ロギング・ラスト・リソース(LLR)トランザクション最適化は、非XAリソースがグローバル・トランザクションに参加できるようにする、パフォーマンス向上のためのオプションです。
LLRリソースは、トランザクション処理にローカル・トランザクションを使用します。Oracle Tuxedoトランザクション・マネージャは、トランザクションの他のすべてのリソースを準備し、LLRリソースのローカル・トランザクションの結果に基づいてグローバル・トランザクションに対するコミットの決定を下します。
LLR参加リソースによるグローバルな2フェーズ・コミット(2PC)トランザクションでは、Oracle Tuxedoトランザクション・マネージャは次の基本的な手順に従います。
リカバリでは、LLR表に残されたトランザクション・レコードは、完了するトランザクションと見なされます。
LLRライブラリでは、XA操作およびLLRサーバー/TMS用のいくつかの共通APIをエミュレートするXAスイッチが用意されています。${TUXDIR}/udataobj
にあるRMファイル内のLLRライブラリは、次のように構成します。
[LLR XAスイッチ名]:[LLR XAスイッチ変数]:[リンク・オプション]
表20-1に、LLRライブラリの詳細を示します。
一般的には、LLR XAスイッチ変数はtuxllrsw_[name]
、LLR XAスイッチ名はtuxllr_[name]
です。関連ライブラリ名はlibllr[name]
で、この[name]
はRM IDおよび実装IDから構成されます。たとえば、ora
はOracleデータベースを示し、esql
は埋込みSQLを示します。
UBBCONFIG
ファイル内のOPENINFO
は、次の形式で構成します。
表20-2に、その詳細を示します。
SqlNet、AccおよびDBの詳細は、 Oracleオンライン・ドキュメントを参照してください。
|
TuxLLR
は、Tuxedo LLRのための特定のオプション・フィールドであり、LLR表名を定義します。定義されない場合は、デフォルト名が使用されます。
LLR表は、LLRサーバーが関係するトランザクションのコミット中のTLOGを格納するために使用されます。この表のデフォルト名はTUXLLR_[DOMAINID]
です。[DOMAINID]
が空の場合は、DOM
が使用されます。TuxLLR
を使用してLLR表の名前を指定する場合は、同じ非XAリソース内で異なるTuxedoドメインには必ず異なるLLR表が使用されていることを確認します。そうでない場合は、リカバリが正しく機能しないことがあります。
さらに、LLRスイッチによって使用されるRMのユーザー・アカウントに、LLR表を作成および更新する権限があることを確認します。そうでない場合は、エラーが発生することがあります。
たとえば、Oracleデータベースで次のようなメッセージが表示されます。
ORA-01950: 表領域'string'に対する権限がありません
これは、そのユーザーに、指定された表領域でエクステントを割り当てる権限がないことが原因です。この問題を解決するには、ユーザーに適切なシステム権限を付与するか、表領域におけるユーザー領域リソースを付与します。
LLR_DELSWAPSIZE numeric_value
LLR_DELDELAY numeric_value
SCANUNIT
の乗数を指定します。この値は0より大きくなければなりません。このパラメータを指定しない場合、SCANUNIT * LLR_DELDELAY
が約30秒になるようにデフォルト値が設定されますが、SCANUNIT
の値が30秒より大きいときは、LLR_DELDELAY
は1に設定されます。
Oracle Tuxedoでは、XAスイッチ名の接頭辞がtuxllr_
の場合、Oracle Tuxedo固有のLLR XAスイッチとしてXAスイッチが使用されます。
アプリケーション・サーバーは、LLR XAスイッチで構築されているかぎり、Oracle TuxedoでLLRサーバーとして扱われます。同じグループ内で同じLLR XAスイッチで構築されたTMSサーバーは、LLR TMSとして扱われます。LLRサーバーが所属するグループがLLRグループです。LLRサーバーが関係するトランザクションがLLR関連トランザクションです。このトランザクションのTLOGレコードは、Oracle Tuxedoの従来のTLOGファイルではなく、LLR表に格納されます。
LLRサーバー/TMSでは、正しいLLR XAスイッチを使用する必要があります。これは、RMおよびその実装が、XAスイッチを提供するLLRライブラリと同じである必要があることを意味します。
1つのローカル・トランザクションで、埋込みSQLを使用してOracleデータベース表にレコードを挿入するLLRサーバー(server.pc)の例を次に示します。
…
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
char mylog[200];
int mypid;
EXEC SQL END DECLARE SECTION;
int tpsvrinit(int argc, char *argv[])
{
tpopen();
mypid=getpid();
return(0);
}
void tpsvrdone()
{
tpclose();
}
void ECHO(TPSVCINFO *rqst)
{
strncpy(mylog, rqst->data,rqst->len);
mylog[rqst->len-1] = 0;
EXEC SQL INSERT INTO TUX_RAC_TAB(OWNER, DATA) VALUES(:mypid, :mylog);
tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);/*do not commit the local transaction*/
}
…
tuxllr_oraesql:tuxllrsw_oraesql: -lllroraesql -L${ORACLE_LIB} -lclntsh
*RESOURCE
…
MODEL SHM
SCANUNIT 5
MAXGTT 600
LLR_DELDELAY 6
LLR_DELSWAPSIZE 500
…
*MACHINES
“m1” LMID=L1 TLOGSIZE=100
…
*GROUPS
GRP1 LMID=L1 GRPNO=10 TMSNAME="TMS_LLRORAESQL" TMSCOUNT=2
OPENINFO="tuxllr_oraesql:ORACLE_XA+SqlNet=orcl.tux1+ACC=P/scott/tiger”
…
server1 SRVGRP=GRP1 SRVID=10
…
…
${PROC} ${PROCFLAGS} iname=server.pc
buildserver -r tuxllr_oraesql -o server1 -f server.c
buildtms -r tuxllr_oraesql -o TMSLLRORAESQL
…
LLR表内の完了した2PCグローバル・トランザクションID(gtrid)のTLOGレコードは、遅延方式でパージされます。このパージはタイマーに基づきます。LLR_DELDELAY
パラメータを使用してこれを構成できます。
新規に導入されたBB内のスワップ領域が、完了したLLR関連gtridを一時的に格納するために使用されます。BBLにより、スワップ領域内のこれらのgtridが各ローカル・キャッシュ・スキャン・ユニットに移動され、タイムアウトすると、gtridに従ってLLR表内の対応するTLOGのレコードがパージされます。LLR_DELSWAPSIZE
属性を使用してスワップ領域のサイズを指定できます。
スワップ領域が小さすぎる場合、その時点でスワップ領域に格納できない完了したgtridは、関連するコーディネータTMSプロセスによって一時的にキャッシュされます。
予期しないノード・クラッシュ(例: BBの消失)があると、完了したレコードがLLR表に残り、時間どおりにパージされません。各レコードは、Tuxedoリカバリ中のトランザクション表内のエントリを必要とします。BB内のトランザクション表のサイズは、MAXGTT
で指定します。MAXGTT
がこれらのレコードを格納するのに十分な大きさでない場合、ノードが復元されるときにBBLの起動が失敗します。これが発生した場合は、MAXGTT
の値を増やして再試行してください。
少なくとも、スキャン単位内のすべての完了したLLR関連2PCのgtridを格納できるように、十分なLLR_DELSWAPSIZE
を指定することをお薦めします。
BBLでは、LLR表内の完了したgtridレコードはパージされません。それは、このジョブを行うため、システムの提供するLLRヘルパー・プロセスを起動します。このプロセスはまた、Tuxedoのリカバリ中にBBLがLLRデータ内のレコードを取得するのに役立ちます。
注意: | ".llr "ディレクトリが$APPDIR の下に作成され、LLRによって使用される一時ファイルが格納されます。 |
tpopen/tpclose
を介して接続を管理する必要があります。OPENINFO
をGROUP
セクションに指定する必要がありますtpsuspend
およびtpresume
はサポートされていませんlibllroraesql
固有)
![]() ![]() ![]() |