この章の次の項では、TimesTenデータベースの問題を診断するためのTimesTenユーティリティおよびその他のツールの使用方法について説明します。
ttIsql
ユーティリティを使用すると、対話形式でSQL文を実行して、TimesTenデータベースに関するステータス情報をレポートできます。
TimesTenのすべてのSQL操作は、ttIsql
のCommand>
プロンプトから実行できます。
例1-1 ttIsqlユーティリティの使用
demoデータベースに対してttIsql
ユーティリティを起動するには、次のように入力します。
% ttIsql demo
次のような出力が表示されます。
Copyright (c) 1996-2011, Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. connect "DSN=demo"; Connection successful: DSN=demo;UID=ttuser;DataStore=c:\temp\demo; DatabaseCharacterSet=US7ASCII;ConnectionCharacterSet=US7ASCII; DRIVER=C:\WINDOWS\system32\ttdv70.dll;Authenticate=0;PermSize=20;TypeMode=0; (Default setting AutoCommit=1) Command>
SQL文またはttIsql
コマンドをCommand>
プロンプトから実行できます。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のttIsqlユーティリティの使用に関する説明では、最も一般的なttIsql
コマンドの使用方法を説明しています。問題の解決によく使用されるttIsql
コマンドは、次のとおりです。
monitor
は、SYS.MONITOR
表の内容をフォーマットします。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のデータベース構造情報の表示に関する説明を参照してください。
dssize
は、データベースのサイズ情報を出力します。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のデータベース構造情報の表示に関する説明を参照してください。
showplan
は、このトランザクションでの選択、更新および削除のオプティマイザの実行計画を出力します。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の問合せオプティマイザ計画の確認と変更に関する説明を参照してください。
isolation
は、分離レベルを設定または表示します。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のトランザクションの操作に関する説明を参照してください。
timing
は、問合せのタイミングを出力します。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のtiming ODBC関数コールに関する説明を参照してください。
optprofile
は、現在のオプティマイザ・フラグの設定と結合順序を出力します。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の問合せオプティマイザ計画の確認と変更に関する説明を参照してください。
ttIsql
機能の完全なリストについては、『Oracle TimesTen In-Memory Databaseリファレンス』のユーティリティに関する説明にあるttIsql
ユーティリティのオプションとコマンドのリストを参照してください。
ttStatus
ユーティリティを使用すると、TimesTenデーモンのステータスと、すべてのTimesTen接続の状態を確認できます。
例1-2 ttStatusによってTimesTenデーモンが稼働していないことが示される
この例のttStatus
出力は、TimesTenデーモンが稼働していないことを示しています。デーモンが突然停止したときのトラブルシューティングについては、「TimesTenのデーモン、サブデーモンからレスポンスがない」を参照してください。
Windowsの場合:
C:\>ttStatus ttStatus: Could not connect to the TimesTen service. If the TimesTen service is not running, please start it by running "ttDaemonAdmin -start".
UNIXプラットフォームの場合:
$ ttStatus ttStatus: Could not connect to the TimesTen daemon. If the TimesTen daemon is not running, please start it by running "ttDaemonAdmin -start".
例1-3 ttStatusによってTimesTenデーモンが稼働していることが示される
この例のttStatus
の出力は、TimesTenデーモンが稼働していることを示しています。demo
という1つのデータベースが認識されています。
最初の行は、TimesTenインスタンスのMYINSTANCE
に対して、TimesTenデーモンがプロセス884としてポート17000で稼働していることを示しています。2行目は、TimesTen Serverがプロセス2308としてポート17002で稼働していることを示しています。
現在、データベースには、1ユーザー接続と6サブデーモン接続の合計7つの接続があります。2047接続まで表示することができます。
データベースのキャッシュ・エージェントおよびレプリケーション・エージェントの再起動ポリシーはmanual
に設定されています。
注意: この例は、Windowsで作成されています。UNIXプラットフォームでの結果は、データベース・パスおよび共有メモリー・キーの書式以外は同じです。 |
C:\>ttStatus TimesTen status report as of Mon Aug 6 22:03:04 2012 Daemon pid 884 port 17000 instance MYINSTANCE TimesTen server pid 2308 started on port 17002 ------------------------------------------------------------------------ Data store c:\temp\demo There are 7 connections to the data store Replication policy : Manual Cache Agent policy : Manual PL/SQL enabled. ------------------------------------------------------------------------ Data store c:\temp\demo Shared Memory KEY Global\DBI45b94095.1.SHM.4 HANDLE 0x278 Type PID Context Connection Name ConnID Process 4616 0x00d08820 demo 1 Subdaemon 2136 0x00526768 Worker 2042 Subdaemon 2136 0x0072e750 Flusher 2043 Subdaemon 2136 0x007348b8 Checkpoint 2044 Subdaemon 2136 0x067b0068 Aging 2045 Subdaemon 2136 0x067c0040 Monitor 2047 Subdaemon 2136 0x068404c8 HistGC 2046 Replication policy : Manual Cache agent policy : Manual ------------------------------------------------------------------------ End of report
例1-4 ttStatusによってレプリケーション情報が示される
この例のttStatus
の出力は、TimesTenデーモンが稼働していることを示しています。demo
、subscriber1ds
およびmasterds
の3つのデータベースが認識されています。subscriber1ds
およびmasterds
データベースがレプリケートされたデータベースです。この例のttStatus
の出力は、レプリケートされたデータベースのレプリケーション・エージェントが起動されていることを示しています。masterds
とsubscriber1ds
の間には、双方向レプリケーションが設定されています。各レプリケーション・エージェントには、データベースへの接続が5つあります。
C:\>ttStatus TimesTen status report as of Mon Aug 6 22:03:04 2012 Daemon pid 5088 port 17000 instance MYINSTANCE TimesTen server pid 4344 started on port 17002 ------------------------------------------------------------------------ Data store c:\temp\subscriber1ds There are 12 connections to the data store Shared Memory KEY Global\DBI45b9471c.2.SHM.2 HANDLE 0x280 Type PID Context Connection Name ConnID Process 1244 0x00d08fb0 subscriber1ds 1 Replication 4548 0x00aed2f8 LOGFORCE 4 Replication 4548 0x00b03470 TRANSMITTER 5 Replication 4548 0x00b725a8 RECEIVER 6 Replication 4548 0x00b82808 REPHOLD 2 Replication 4548 0x00b98980 REPLISTENER 3 Subdaemon 2752 0x00526768 Worker 2042 Subdaemon 2752 0x0072a758 Flusher 2043 Subdaemon 2752 0x007308c0 Checkpoint 2044 Subdaemon 2752 0x00736a28 HistGC 2046 Subdaemon 2752 0x067f02f8 Aging 2045 Subdaemon 2752 0x068364a0 Monitor 2047 Replication policy : Manual Replication agent is running. Cache agent policy : Manual ------------------------------------------------------------------------ Data store c:\temp\masterds There are 12 connections to the data store Shared Memory KEY Global\DBI45b945d0.0.SHM.6 HANDLE 0x2bc Type PID Context Connection Name ConnID Process 5880 0x00d09008 masterds 1 Replication 3728 0x00aed570 LOGFORCE 4 Replication 3728 0x00b036e8 TRANSMITTER 5 Replication 3728 0x00b168b8 REPHOLD 3 Replication 3728 0x00b1ca20 REPLISTENER 2 Replication 3728 0x00b22b88 RECEIVER 6 Subdaemon 3220 0x00526768 Worker 2042 Subdaemon 3220 0x0072e768 Flusher 2043 Subdaemon 3220 0x007348d0 Checkpoint 2044 Subdaemon 3220 0x067b0068 Aging 2045 Subdaemon 3220 0x067c0040 Monitor 2047 Subdaemon 3220 0x068404c8 HistGC 2046 Replication policy : Manual Replication agent is running. Cache agent policy : Manual ------------------------------------------------------------------------ Data store c:\temp\demo There are no connections to the data store Replication policy : Manual Cache agent policy : Manual ------------------------------------------------------------------------ End of report
例1-5 ttStatusによってキャッシュ・グループ情報が示される
この例では、rep1
データベースで実行されているキャッシュ・エージェントを表示します。データベースには、キャッシュ・グループが1つあります。キャッシュ・エージェントには、データベースへの接続が5つあります。
C:\>ttStatus TimesTen status report as of Mon Aug 6 22:03:04 2012 Daemon pid 1012 port 17000 instance MYINSTANCE No TimesTen server running ---------------------------------------------------------------- Data store c:\data\rep1 There are 12 connections to the data store Shared Memory KEY Global\DBI45ef98ac.1.SHM.56 HANDLE 0x260 Type PID Context Connection Name ConnID Cache Agent 3380 0x00bbddf0 Handler 2 Cache Agent 3380 0x00c3f318 Aging 3 Cache Agent 3380 0x07380398 Timer 4 Cache Agent 3380 0x073cfa18 ttora70 6 Cache Agent 3380 0x073ff010 ttora70 7 Process 2084 0x00c48ee8 rep1 1 Subdaemon 1632 0x006bc430 Worker 2042 Subdaemon 1632 0x06630458 Flusher 2045 Subdaemon 1632 0x0664f978 Checkpoint 2044 Subdaemon 1632 0x0665ee60 HistGC 2043 Subdaemon 1632 0x066de720 Aging 2046 Subdaemon 1632 0x0670dc78 Monitor 2047 Replication policy : Manual Cache agent policy : Manual TimesTen's Cache agent is running for this data store ----------------------------------------------------------------- End of report
例1-6 ttStatusによって古いインスタンスへの接続が示される
この例では、データベースの古いインスタンスへの接続を示します。これは、データベースを無効化する際に、一部のユーザーがメモリー内にまだ格納されている無効化の対象となるデータベースのコピーを切断していない場合に発生します。すべてのユーザーが切断した後に、メモリーを解放できます。
C:\>ttStatus TimesTen status report as of Mon Aug 6 22:03:04 2012 Daemon pid 5088 port 17000 instance MYINSTANCE TimesTen server pid 4344 started on port 17002 ----------------------------------------------------------------- Data store c:\temp\sample There are no connections to the data store Obsolete or not yet active connection(s): Process 4696 context 0xd08800 name sample connid 1, obsolete connection, shmKey 'Global\DBI45b94c6f.3.SHM.4' Replication policy : Manual Cache agent policy : Manual ----------------------------------------------------------------- End of report
ttCapture
ユーティリティは、TimesTenシステムの構成および状態に関する情報をファイルに捕捉し、テクニカル・サポートはこのファイルの情報を利用して、ttCapture
実行時のシステムのスナップショットを確認することができます。ttCapture
ユーティリティは、ttcapture.
date.time.
log
というファイルを生成します。デフォルトでは、ファイルは、ttCapture
ユーティリティの呼出し元であるディレクトリに書き込まれます。ttCapture
-dest
オプションを使用すると、出力ファイルを別のディレクトリに書き込むように指示できます。
ttCapture
を再度実行すると、新しいファイルに情報が書き込まれます。
Windowsプラットフォームの場合は、ttCapture
を実行するとttcapture.
date.time
.nfo
というファイルも作成されます。このファイルには、msinfo32
ユーティリティからの出力が含まれます。
TimesTenデータベースで問題が発生した場合は、問題が発生しているときまたは発生直後、早急にそのデータベースに対して、DSN
オプションを指定してttCapture
を実行します。
注意: ディレクトリ名およびファイル名に空白が含まれる場合は、必ず二重引用符で囲んでください。 |
テクニカル・サポートにお問い合せいただく場合は、ttcapture.
date.number.
log
ファイルをサービス・リクエストにアップロードしてください。Windowsをご使用の場合は、ttcapture.
date.time
.nfo
ファイルもアップロードする必要があります。
他のオプションの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttCaptureに関する項を参照してください。
TimesTenでは、TimesTenデーモンを使用してデータベースへのアクセスを管理します。デーモンの稼働時に、エラー、警告および情報メッセージが生成されます。これらのメッセージは、TimesTenのシステム管理およびアプリケーションのデバッグに役立ちます。
デフォルトでは、情報メッセージは次の場所に格納されます。
場所やサイズなど、ログの構成に関する情報については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の情報メッセージの変更に関する説明を参照してください。
ttTraceMon
ユーティリティを使用すると、多数のTimesTenコンポーネントについて様々なトレース情報を記録できます。各TimesTenコンポーネントは、様々な詳細レベルでトレースできます。ttTraceMon
をshow
サブコマンド付きで指定すると、トレース可能なすべてのTimesTenコンポーネントとそれらの現在のトレース・レベルを表示できます。ttTraceMon
のオプションの完全なリストについては、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttTraceMon」の項を参照してください。
トレースの出力をファイルに行うと、TimesTenのトレース処理は、アプリケーションのパフォーマンスに大きく影響し、大量のディスク領域を消費します。また、AWTキャッシュ・グループを使用している場合は、ttTraceMon
でORACON
コンポーネントのトレースを試行するときに、レプリケーション・エージェントを再起動する必要があります。ttTraceMon
ユーティリティは、問題を診断するときにのみ使用してください。診断が終了したら、トレースをデフォルト値にリセットしてください。
例1-7 コンポーネントのデフォルトのトレース・レベル
この例は、demoデータベースに対するほとんどのトレース・コンポーネントがレベル0(OFF)に設定されていることを示しています。ERR
およびDEADLOCK
コンポーネントのトレースは、どちらもデフォルトでは1に設定されています。詳細は、「ERRトレース」を参照してください。
% ttTraceMon -e show demo AGING ... 0 API ... 0 ASYNCMV ... 0 AUTOREFRESH ... 0 CG ... 0 CGRID ... 0 CGRIDC ... 0 CKPT ... 0 DEADLOCK ... 1 EE ... 0 ERR ... 1 FLOW ... 0 HEAP ... 0 LATCH ... 0 LOCK ... 0 LOG ... 0 LOGF ... 0 OPT ... 0 ORACON ... 0 PLOAD ... 0 PT ... 0 REPL ... 0 SM ... 0 SQL ... 0 TEST ... 0 TRACE ... 0 XA ... 0 XACT ... 0
ほとんどのTimesTenコンポーネントの出力は、テクニカル・サポートでのみ使用されます。ただし、SQL
、API
、LOCK
、ERR
、AGING
およびAUTOREFRESH
コンポーネントの出力は、アプリケーションの問題のトラブルシューティングで役立つ場合があります。
この項の以降の内容は次のとおりです。
新しいトレースは、ttTraceMon
datastore
を指定して開始します。たとえば、demo
データベースでトレースを開始するには、次のように入力します。
% ttTraceMon demo Trace monitor; empty line to exit Trace >
Trace
プロンプトで、トレース・タイプとそのレベルを指定します。たとえば、レベル3でSQL
コンポーネントのトレースを開始するには、次のように入力します。
Trace > level sql 3
この時点で、アプリケーションを実行でき、TimesTenのトレース情報がトレース・バッファに書き込まれます。トレース・バッファの内容を読み取るには、次の2つの方法があります。
Trace
プロンプトで、outfile
コマンドを使用して、トレース・バッファのデータを出力するファイルを指定します(アプリケーションの実行前に行う必要があります)。これは、アプリケーションを実行する前に行う必要があります。トレース情報がファイルに書き込まれるとき、新しいトレース情報はファイルの既存の内容に連結されます。
Trace
プロンプトで、dump
コマンドを使用してトレース・バッファ・データを画面に表示します。
注意: トレース・バッファには、新しいトレースごとに内容が累積されます。トレース・バッファを消去するには、ttTraceMon プロンプトでflush コマンドを使用します。flush コマンドを使用してコンポーネントを指定すると、特定のコンポーネントのバッファされたトレース・レコードが消去されます。 |
トレース・バッファから出力される各レコードの書式は次のとおりです。
timestamp sequence component level connection processid operation
レコードのフィールドは次のように定義されています。
timestamp
は、操作が実行された時刻です。
sequence
は、トレース行を識別する連番です。
component
は、トレース対象のTimesTenコンポーネント(SQL
、API
、LOCK
、ERR
など)です。
level
は、そのトレース行に関連付けられたトレース・レベルです。トレース・レベルの範囲はコンポーネントによって異なりますが、すべてのコンポーネントで、最も低いトレース・レベルは冗長度が最低の出力を生成し、最も高いトレース・レベルは冗長度が最高の出力を生成します。たとえば、レベル4でSQL
トレースを行うと、出力にはレベル2(prepare)、3(execute)および4(open、close、fetch)の行が含まれます。
注意: いくつかのコンポーネントのトレース・レベルは、連続した範囲の数値ではありません。コンポーネントでサポートされているレベルに対応しない数値を入力した場合、入力した数値より小さく、最も高いサポート・レベルでトレースが発生します。たとえば、コンポーネントのトレース・レベルが1、2、3、4、6で、5を入力すると、レベル1、2、3、4のトレース・イベントが生成されます。 |
connection
は、トレースを生成した接続を識別する内部接続IDです。この数値は、ttStatus
出力で表示されるConnID
に対応しています。接続IDは、トランザクションIDの最初の要素としても使用されます。
processid
は、トレースを生成したプロセスのオペレーティング・システム・プロセスIDです。
operation
は、発生した操作(SQL文、API操作、エラー・メッセージなど)です。
たとえば、レベル3のSQLトレース後のトレース・バッファの行は、次のようになります。
10:39:50.231 5281 SQL 2L 1C 3914P Preparing: select cust_num from customer
ttTraceMon
をSQLコンポーネントで使用すると、TimesTenエンジンによって準備または実行されているSQL
に関する情報が提供されます。表1-1に、SQLトレース・レベルを示します。「+」サインの付いた各レベルには、該当するレベルで説明されているトレース情報に加え、該当レベルより上のすべてのレベルの情報も含まれます。
表1-1 SQLトレース・レベル
レベル | 出力 |
---|---|
2 |
準備されているSQLコマンド。 |
3 |
+ 実行中のSQLコマンド。 |
4 |
+ コマンドをプールする効果(準備されたコマンドはすでにプールに存在するため、準備は行われない)、再準備の必要性(索引が作成されたためなど)、および破棄されるコマンド。 このレベルでは、 |
5 |
+ コマンド番号などの内部データ(通常、ユーザー・レベルでのデバッグには役立ちません)。 |
注意: SQLのトレースは、レベル3または4で実行することをお薦めします。SQLトレースでは、オプティマイザに関する情報は表示されません。オプティマイザのトレースは、レベル4で別のコンポーネント(OPT )によって管理され、ユーザーが使用するようには設計されていません。 |
例1-8 SQLトレース
この例では、demo
データベースに対してSQLトレースをレベル4で実行するためにttTraceMon
を実行します。SQLトレースの出力は、SQLtrace.txt
ファイルに書き込みます。その後、トレースで過去のSQL文がレポートされないようにバッファをフラッシュします。
% ttTraceMon demo Trace monitor; empty line to exit Trace > outfile SQLtrace.txt Trace > level sql 4 Trace > flush
この時点で、次のSQL文を含むアプリケーションを実行します。
SELECT * FROM departments WHERE department_id = 10;
トレース情報がSQLtrace.txt
ファイルに書き込まれます。
12:19:36.582 269 SQL 2L 3C 29570P Preparing: select * from departments where department_id = 10 12:19:36.583 270 SQL 4L 3C 29570P sbSqlCmdCompile ()(E): (Found already compiled version: refCount:01, bucket:28) cmdType:100, cmdNum:1000146. 12:19:36.583 271 SQL 4L 3C 29570P Opening: select * from departments where department_id = 10; 12:19:36.583 272 SQL 4L 3C 29570P Fetching: select * from departments where department_id = 10; 12:19:36.583 273 SQL 4L 3C 29570P Closing: select * from departments where department_id = 10; 5 records dumped
アプリケーションが完了したら、SQLトレースをオフにし、ttTraceMon
を終了します。
Trace > level sql 0 Trace > {press ENTER – blank line}
APIトレースは、データベースへの接続、接続属性の変更、トランザクションのコミットなどのデータベース操作のために生成されます。表1-2に、APIトレース・レベルを示します。「+」サインの付いた各レベルには、該当するレベルで説明されているトレース情報に加え、該当レベルより上のすべてのレベルの情報も含まれます。
表1-2 APIトレース・レベル
レベル | 出力 |
---|---|
1 |
サブデーモンが実行したロールバックのすべての試行。アプリケーションが異常終了し、サブデーモンがその接続をリカバリする場合に実行されます。 |
2 |
+ ある程度の領域不足の状態。 |
3 |
+ データベースに対する作成、接続、切断、チェックポイント、バックアップおよび圧縮の各操作と、各接続のコミットおよびロールバック、その他のいくつかの操作。 |
4 |
+ TimesTenの内部APIレベルで処理されるその他のほとんどの操作。ストレージ・マネージャおよび索引に対して実行され、内部で実行される多数の操作は表示されません。 |
注意: レベル3でのトレースをお薦めします。 |
例1-9 APIトレース
この例では、demo
データベースに対してAPIトレースをレベル3で実行するためにttTraceMon
を実行します。APIトレースの出力は、APItrace.txt
ファイルに書き込まれます。APIトレースをバッファに保存する前に、flush
コマンドを使用してバッファを空にします。
% ttTraceMon demo Trace monitor; empty line to exit Trace> outfile APItrace.txt Trace> level api 3 Trace > flush
ここでアプリケーションを実行します。アプリケーションが完了したら、APIトレースを無効にし、ttTraceMon
を終了します。
Trace > level api 0 Trace > {press ENTER – blank line}
APItrace.txt
の内容は、次の出力例に似ています。出力は、データベースへの接続、接続キャラクタ・セットの設定、分離レベルの設定およびトランザクションのコミットを示しています。
11:54:26.796 1016 API 3L 2C 4848P sb_dbConnect()(X) 11:54:26.796 1017 API 3L 2C 4848P sb_dbConnCharsetSet()(E) 11:54:26.796 1018 API 3L 2C 4848P sb_dbConnSetIsoLevel()(E) 11:54:39.795 1019 API 3L 2C 4848P sb_dbConnSetIsoLevel()(E) 11:54:45.253 1020 API 3L 2C 4848P sb_xactCommitQ()(E)
DEADLOCK
コンポーネントを使用して、すべてのアプリケーションにおけるすべてのデッドロックの発生状況をトレースします。
表1-3に、DEADLOCK
トレース・レベルを示します。「+」サインの付いた各レベルには、該当するレベルで説明されているトレース情報に加え、該当レベルより上のすべてのレベルの情報も含まれます。
例1-10 DEADLOCKトレース
この例では、myDSN
データベースに対して、DEADLOCK
トレースをデフォルトのレベル1で実行するために、ttTraceMon
を実行します。
myDSN
への2つの接続を作成します。最初の接続では、自動コミットは有効になっています。表test
を作成して2行挿入します。次に、自動コミットを無効にして、表testにx1=1
行を更新します。自動コミットが無効なため、コミットされるまで表に行は挿入されません。トランザクションがコミットまたはロールバックされるまでロックは保持されます。
Command> create table test (x1 int unique, y1 int); Command> insert into test values (1,1); 1 row inserted. Command> insert into test values (2,2); 1 row inserted. Command> autocommit 0; Command> update test set y1=y1 where x1=1; 1 row updated.
myDSN
への2つ目の接続では、自動コミットを無効にします。表testのx1=2
行を更新します。
Command> autocommit 0; Command> update test set y1=y1 where x1=2;1 row updated.
これから、お互いにロックされている行の各接続の更新文を実行してデッドロック状況を作成します。1つ目の接続は、x1=2
の行に対して更新を実行します。
Command> update test set y1=y1 where x1=2; 6003: Lock request denied because of time-out Details: Tran 2.1 (pid 32750) wants Un lock on rowid BMUFVUAAAAaAAAAETk, table ME.TEST. But tran 3.2 (pid 32731) has it in Xn (request was Xn). Holder SQL (update t1 set y1=y1 where x1=2) The command failed.
2つ目の接続は、x1=1
の行に対して更新を実行します。
Command> update test set y1=y1 where x1=1; 6002: Lock request denied because of deadlock Details: Tran 3.2 (pid 32731) wants Un lock on rowid BMUFVUAAAAaAAAADzk, table ME.TEST. But tran 2.1 (pid 32750) has it in Xn (request was Xn). Holder SQL (update t1 set y1=y1 where x1=1) The command failed.
flush
コマンドを使用してバッファを空にします。
% ttTraceMon myDSN Trace monitor; empty line to exit Trace> flush
トレース・バッファには、「1L
」からわかるように、すべてのレベル1デッドロック・トレースを表示する次の情報が含まれています。
Trace> dump 09:50:26.444 13 DEADLOCK 1L 2036C 3484P edge 1: xid 3.2, cid 3, <Row BMUFVUAAAAaAAAADzk,0x8c5 74(574836)> 0 cnt=1 , Tbl 'T1', SQL='update t1 set y1=y1 where x1=1' 09:50:26.455 14 DEADLOCK 1L 2036C 3484P edge 0: xid 2.1, cid 2, <Row BMUFVUAAAAaAAAAETk,0x8c5 74(574836)> 0 cnt=1 , Tbl 'T1', SQL='update t1 set y1=y1 where x1=2' 09:50:26.455 15 DEADLOCK 1L 2036C 3484P Victim: xcb:3.2, SQL='update t1 set y1=y1 where x1=1'
さらに詳しい情報を確認する場合は、DEADLOCK
トレースに高い値を設定します。たとえば、次では、ttTraceMon
でDEADLOCK
トレースをレベル4に設定しています。
Trace > level deadlock 4
LOCK
コンポーネントを使用すると、アプリケーションのロック動作をトレースして、デッドロックまたはロックの待機による問題を検出できます。LOCK
トレースは大量の情報を生成するので、適切なトレース・レベルを選択することが重要です。たとえば、レベル3では、ごく一般的なイベントについてもトレースが作成されるため、大量のトレースが発生します。さらに、トレース自体が読みにくくなることもあります。必要な情報が見つからない場合は、テクニカル・サポートに連絡してください。
表1-4に、LOCK
トレース・レベルを示します。「+」サインの付いた各レベルには、該当するレベルで説明されているトレース情報に加え、該当レベルより上のすべてのレベルの情報も含まれます。
表1-4 LOCKトレース・レベル
レベル | 出力 |
---|---|
1 |
検出されたデッドロック・サイクル。 |
2 |
+ なんらかの理由によるロック付与の失敗。 |
3 |
+ ロックの待機(付与の有無に依存しない)。 |
4 |
+ すべてのロックの付与/解除、ルーチンのコール、デッドロック検出のメカニズム。 |
6 |
+ サイクルにおける各ステップ。 |
例1-11 LOCKトレース
この例では、myDSN
データベースに対してLOCK
トレースをレベル4で実行するためにttTraceMon
を実行します。
myDSN
への2つの接続を作成します。最初の接続では、自動コミットを有効にします。表test
を作成して3行挿入します。表test
を使用してマテリアライズド・ビューを作成します。
レベル4でトレースを有効にし、flush
コマンドを使用してバッファを空にします。
% ttTraceMon myDSN Trace monitor; empty line to exit Trace> level lock 4 Trace> flush
myDSN
への2つ目の接続では、自動コミットを無効にします。表testに1行挿入します。自動コミットが無効なため、コミットされるまで表に行は挿入されません。トランザクションがコミットまたはロールバックされるまでロックは保持されます。
dump
コマンドを使用してトレース・バッファの内容を表示すると、トレース・バッファにレコードがないことがわかります。
Trace> dump 0 records dumped
最初の接続からマテリアライズド・ビューを削除してみます。コミットまたはロールバックされていないトランザクションがあるため、ビューは削除できません。
Command> drop materialized view v; 6003: Lock request denied because of time-out Details: Tran 3.71 (pid 24524) wants Sn lock on table TTUSER.TEST. But tran 1.42 (pid 24263) has it in IXn (request was IXn). Holder SQL (insert into test values (100);) The command failed.
トレース・バッファには次の情報が含まれます。
Trace> dump 20:09:04.789 174759 LOCK 3L 3C 24524P ENQ: xcb:00003 <Tbl 0x9b894,0x0> 0+Sn=>SL activity 0 Sn cnt=0; Holder xcb:00001 IXn 20:09:04.789 174760 LOCK 3L 3C 24524P Connection 3 scheduled for sleep 20:09:04.789 174761 LOCK 3L 3C 24524P Connection 3 sleeping 20:09:14.871 174762 LOCK 3L 2047C 24237P Connection 3 timed out 20:09:14.871 174763 LOCK 3L 2047C 24237P Connection 3 woken up 20:09:14.871 174764 LOCK 3L 3C 24524P Connection 3 awake 20:09:14.871 174765 LOCK 2L 3C 24524P ENQ: xcb:00003 <Tbl 0x9b894,0x0> 0+Sn=>TM activity 0 Sn cnt=1; Holder xcb:00001 IXn 7 records dumped
トレースが終了したら、LOCK
トレースをデフォルトの設定(0)に戻し、ttTraceMon
を終了します。
Trace > level lock 0 Trace > {press ENTER – blank line}
ERR
コンポーネントのトレースが役立つ場合もあります。たとえば、レベル4のERR
トレースでは、TimesTenダイレクト・ドライバにプッシュされるすべてのエラー・メッセージが表示されます(内部的に処理されるため、すべてのエラーがユーザーに出力されるわけではありません)。デフォルトは、レベル1のERR
トレースです。レベル2および3のERR
トレースでは、出力は作成されません。
表1-5に、ERR
トレース・レベルを示します。「+」サインの付いた各レベルには、該当するレベルで説明されているトレース情報に加え、該当レベルより上のすべてのレベルの情報も含まれます。
例1-12 ERRトレース
この例では、myDSN
データベースに対してERR
トレースをレベル4で実行するためにttTraceMon
を実行します。
最初に、表を作成します。
Command> create table test (id tt_integer);
次に、レベル4でトレースを有効にします。前述の例とは異なり、この例ではトレースをファイルに出力するのではなく、トレース・バッファからその内容を直接参照します。ERR
トレースをバッファに保存する前に、flush
コマンドを使用してバッファを空にします。
% ttTraceMon myDSN Trace monitor; empty line to exit Trace> level err 4 Trace> flush
3つのエラーがあるSQLスクリプトを実行します。エラーは次のとおりです。
既存の表と同じ名前で表を作成する。
誤った構文を使用して表に値を挿入する。
CHAR
データをTT_INTEGER
列に挿入する。
Command> create table test (id tt_integer); 2207: Table TEST already exists The command failed. Command> insert into test values 'abcd'); 1001: Syntax error in SQL statement before or at: "'abcd'", character position: 25 insert into test values 'abcd'); ^^^^^^ The command failed. Command> insert into test values ('abcd'); 2609: Incompatible types found in expression The command failed.
トレース情報はトレース・バッファに書き込まれます。表示するには、dump
コマンドを使用します。
Trace> dump 19:28:40.465 174227 ERR 4L 1C 24263P TT2207: Table TEST already exists -- file "eeDDL.c", lineno 2930, procedure "sbEeCrDtblEval()" 19:28:51.399 174228 ERR 4L 1C 24263P TT1001: Syntax error in SQL statement before or at: "'abcd'", character position: 25 insert into test values 'abcd'); ^^^^^^ -- file "ptSqlY.y", lineno 6273, procedure "reserved_word_or_syntax_error" 19:29:00.725 174229 ERR 4L 1C 24263P TT2609: Incompatible types found in expression -- file "saCanon.c", lineno 12618, procedure "sbPtAdjustType()" 3 records dumped
ERRトレースをデフォルトの設定(1)に戻し、ttTraceMon
を終了します。
Trace > level err 1 Trace > {press ENTER – blank line}
ttTraceMon
ユーティリティを使用して次の情報を取得します。
エージングの開始と終了のタイミング
エージング・サブデーモンによって何行が削除されたか
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表へのエージングの実装に関する説明を参照してください。
表1-6に、AGING
トレース・レベルを示します。「+」サインの付いた各レベルには、該当するレベルで説明されているトレース情報に加え、該当レベルより上のすべてのレベルの情報も含まれます。
表1-6 AGINGトレース・レベル
レベル | 説明 |
---|---|
1 |
次のイベントに関するメッセージを表示します。
|
2 |
+ 各表に対する次のイベントに関するメッセージを表示します。
|
3 |
+ 各エージング・サイクルで何行が削除されたかを示す詳細レポート。 |
4 |
+ サブデーモンのウェイクアップごとのメッセージ。 |
例1-13 AGINGトレース
この例では、myDSN
データベースに対してAGING
トレースを実行するためにttTraceMon
を実行します。データベースには、時間ベース・エージングのポリシーが含まれたTTUSER.MYTAB
表が含まれています。表の詳細は次のとおりです。
Command> describe TTUSER.MYTAB; Table TTUSER.MYTAB: Columns: *ID TT_INTEGER NOT NULL TS TIMESTAMP (6) NOT NULL Aging use TS lifetime 3 minutes cycle 1 minute on 1 table found. (primary key columns are indicated with *)
エージング・サイクルが開始される前、表には次の行が含まれています。
Command> select * from TTUSER.MYTAB; < 1, 2007-03-21 12:54:06.000000 > < 3, 2010-03-17 08:00:00.000000 > < 4, 2007-03-21 12:59:40.000000 > < 5, 2007-03-21 13:00:10.000000 > < 6, 2007-03-21 13:01:22.000000 > 5 rows found.
AGING
トレースをレベル3で実行するためにttTraceMon
を実行します。トレースをファイルに出力するのではなく、トレース・バッファからその内容を直接参照します。AGING
トレースをバッファに保存する前に、flush
コマンドを使用してバッファを空にします。
% ttTraceMon myDSN Trace monitor; empty line to exit Trace> level aging 3 Trace> flush
dump
コマンドを使用してバッファ内のトレース情報を表示します。
Trace> dump 13:16:56.802 1247 AGING 1L 2045C 17373P Entering sbAgingTB(): curTime=78 13:16:56.803 1248 AGING 2L 2045C 17373P Entering sbAgingOneTable(): curTime=78, ltblid= 637140 13:16:56.804 1249 AGING 3L 2045C 17373P curTime=78, 4 deleted, 1 remaining, tbl = TTUSER.MYTAB 13:16:56.804 1250 AGING 2L 2045C 17373P Exiting sbAgingOneTable(): curTime=78, reason = 'no more rows', 4 deleted, 1 remaining, tbl = TTUSER.MYTAB 13:16:56.804 1251 AGING 1L 2045C 17373P Exiting sbAgingTB(): curTime=78 5 records dumped
AGING
トレースをデフォルトの設定(0)に戻し、ttTraceMon
を終了します。
Trace > level aging 0 Trace > {press ENTER – blank line}
ttTraceMon
ユーティリティを使用して、AUTOREFRESH
キャッシュ・グループ属性を持つキャッシュ・グループの自動リフレッシュ操作の処理状況に関する情報を取得します。
『Oracle In-Memory Database Cacheユーザーズ・ガイド』のAUTOREFRESHキャッシュ・グループ属性に関する説明を参照してください。
表1-7に、AUTOREFRESH
トレース・レベルを示します。「+」サインの付いた各レベルには、該当するレベルで説明されているトレース情報に加え、該当レベルより上のすべてのレベルの情報も含まれます。
表1-7 AUTOREFRESHトレース・レベル
レベル | 説明 |
---|---|
1 |
その時間隔の自動リフレッシュのサマリー:
注意: 時間およびルート表の行に関する情報は、完全自動リフレッシュの場合にレポートされます。 |
2 |
+ キャッシュ・グループ・レベルでの自動リフレッシュのサマリー:
注意: 時間およびルート表の行に関する情報は、完全自動リフレッシュの場合にレポートされます。 |
3 |
+ 表レベルでの自動リフレッシュのサマリー:
|
4 |
+ 各表の自動リフレッシュの詳細:
|
例1-14 AUTOREFRESHトレース
この例では、ttTraceMon
ユーティリティを使用して、cgDSN
データベースの自動リフレッシュ操作をトレースします。トレース・レベルを1に設定すると、ttCacheAutorefreshStatsGet
組込みプロシージャの出力に似た情報が表示されます。
% tttracemon cgDSN Trace monitor; empty line to exit Trace> level autorefresh 1 Trace> dump 08:56:57.445 19398 AUTOREFRESH 1L 5C 32246P Autorefresh number 1415 started for interval 60000 08:56:57.883 19419 AUTOREFRESH 1L 5C 32246P Duration For Interval 60000ms: 420 08:56:57.883 19420 AUTOREFRESH 1L 5C 32246P Num Rows For Interval 60000ms: 0 08:56:57.883 19421 AUTOREFRESH 1L 5C 32246P Num Root Rows For Interval 60000ms: 0 08:56:57.883 19422 AUTOREFRESH 1L 5C 32246P Cumulative Rows for Interval 60000ms: 11587 08:56:57.883 19423 AUTOREFRESH 1L 5C 32246P Cumulative Root Rows for Interval 60000ms: 1697 08:56:57.883 19424 AUTOREFRESH 1L 5C 32246P Autorefresh number 1415 ended for interval 60000ms successfully. 7 records dumped
レベル4でトレースすると、自動リフレッシュ操作1415に関する追加情報が生成されます。 testuser.readcache
キャッシュ・グループ、testuser.readtab
ルート表および自動リフレッシュ間隔に関する自動リフレッシュ情報が提供されます。
Trace> level autorefresh 4 Trace> dump 08:56:57.445 19398 AUTOREFRESH 1L 5C 32246P Autorefresh number 1415 started for interval 60000 08:56:57.471 19399 AUTOREFRESH 2L 5C 32246P Autorefresh started for cachegroup TESTUSER.READCACHE 08:56:57.471 19400 AUTOREFRESH 3L 5C 32246P Incremental autorefresh started for table TESTUSER.READTAB 08:56:57.471 19401 AUTOREFRESH 4L 5C 32246P Autorefresh Query: SELECT L."COL_10", X."COL_20", X.ft$NotDelete, Z.rowid FROM (SELECT DISTINCT "COL_10" FROM "TESTUSER"."TT_06_454854_L" WHERE logseq >:logseq AND ft_cacheGroup <> 100000000000*1844259679+-299200618) L,(SELECT "TESTUSER"."READTAB"."COL_10", "TESTUSER"."READTAB"."COL_20", 1 AS ft$NotDelete FROM "TESTUSER"."READTAB", "TESTUSER"."T1" WHERE "TESTUSER"."READTAB"."COL_10" = "TESTUSER"."T1"."COL_10") X, "TESTUSER"."READTAB" Z WHERE L ."COL_10" = X."COL_10" (+) AND X."COL_10" = Z."COL_10" (+), logseq: 7 08:56:57.870 19402 AUTOREFRESH 3L 5C 32246P Duration for table TESTUSER.READTAB: 70 08:56:57.870 19403 AUTOREFRESH 3L 5C 32246P Num Rows for table TESTUSER.READTAB: 1 08:56:57.870 19404 AUTOREFRESH 3L 5C 32246P Cumulative rows for table TESTUSER.READTAB: 1559 08:56:57.870 19405 AUTOREFRESH 4L 5C 32246P Autorefresh Query Execute duration for table TESTUSER.READTAB: 60 08:56:57.870 19406 AUTOREFRESH 4L 5C 32246P Autorefresh Query Fetch duration for table TESTUSER.READTAB: 0 08:56:57.870 19407 AUTOREFRESH 4L 5C 32246P Autorefresh Query Apply duration for table TESTUSER.READTAB: 0 08:56:57.870 19408 AUTOREFRESH 4L 5C 32246P Max logseq applied for table TESTUSER.READTAB: 8 08:56:57.870 19409 AUTOREFRESH 4L 5C 32246P Autorefresh Query Execute duration for 7 child(ren) table(s): 32 08:56:57.870 19410 AUTOREFRESH 4L 5C 32246P Autorefresh Query Fetch duration for 7 child(ren) table(s): 0 08:56:57.870 19411 AUTOREFRESH 4L 5C 32246P Autorefresh Query Apply duration for 7 child(ren) table(s): 0 08:56:57.870 19412 AUTOREFRESH 3L 5C 32246P Incremental autorefresh ended for table TESTUSER.READTAB 08:56:57.872 19413 AUTOREFRESH 2L 5C 32246P Duration For Cache Group TESTUSER.READCACHE: 1020 08:56:57.872 19414 AUTOREFRESH 2L 5C 32246P Num Rows For Cache Group TESTUSER.READCACHE: 1 08:56:57.872 19415 AUTOREFRESH 2L 5C 32246P Num Root Rows For Cache Group TESTUSER.READCACHE: 0 08:56:57.872 19416 AUTOREFRESH 2L 5C 32246P Cumulative Rows for Cache Group TESTUSER.READCACHE: 11776 08:56:57.872 19417 AUTOREFRESH 2L 5C 32246P Cumulative Root Rows for Cache Group TESTUSER.READCACHE: 1697 08:56:57.872 19418 AUTOREFRESH 2L 5C 32246P Autorefresh ended for cache group TESTUSER.READCACHE 08:56:57.883 19419 AUTOREFRESH 1L 5C 32246P Duration For Interval 60000ms: 420 08:56:57.883 19420 AUTOREFRESH 1L 5C 32246P Num Rows For Interval 60000ms: 0 08:56:57.883 19421 AUTOREFRESH 1L 5C 32246P Num Root Rows For Interval 60000ms: 0 08:56:57.883 19422 AUTOREFRESH 1L 5C 32246P Cumulative Rows for Interval 60000ms: 11587 08:56:57.883 19423 AUTOREFRESH 1L 5C 32246P Cumulative Root Rows for Interval 60000ms: 1697 08:56:57.883 19424 AUTOREFRESH 1L 5C 32246P Autorefresh number 1415 ended for interval 60000ms successfully. 27 records dumped
AUTOREFRESH
トレースをデフォルトの設定(0)に戻し、ttTraceMon
を終了します。
Trace > level autorefresh 0 Trace > {press ENTER – blank line}
ttXactAdmin
ユーティリティは、未処理の各トランザクションの所有者、ステータス、ログおよびロックの情報を表示します。このユーティリティを使用して、データベースへの現在のすべての接続を表示することもできます。ttXactAdmin
ユーティリティは、レプリケーション、XLAおよび非同期WRITETHROUGHキャッシュ・グループの問題のトラブルシューティングに役立ちます。
例1-15 ttXactAdminを使用してロック・タイムアウトを診断する
ttXactAdmin
を使用してロック・タイムアウトを診断します。同じ行を更新しようとしている2つの接続について考えてみます。接続1による次のトランザクションが進行中です。
UPDATE table1 SET c1 = 2 WHERE c1 = 1;
接続2では、次の更新を実行しようとします。
UPDATE table1 SET c1 = 3 WHERE c1 = 1;
接続2は、次のエラーを受信します。
6003: Lock request denied because of time-out Details: Tran 2.3 (pid 2880) wants Un lock on rowid 0x00156bbc, table TTUSER.TABLE1. But tran 1.21 (pid 2564) has it in Xn (request was Xn). Holder SQL (update table1 set c1 = 2 where c1 = 1;) The command failed.
エラーの詳細によると、トランザクション1.21では行0x00156bbc(トランザクション2.3が更新する行)がロックされていることがわかります。ttXactAdmin
によって、データベース全体のアクションに関する出力にこの情報が表示されます。
$ ttXactAdmin myDSN 2011-03-07 12:57:41.237 c:\datastore\myDSN TimesTen Release 11.2.2.0.0 Outstanding locks PID Context TransID TransStatus Resource ResourceID Mode Name Program File Name: ttIsql 2564 0xeeb9a8 1.21 Active Database 0x01312d00 IX Row 0x00156bbc Xn TTUSER.TABLE1 Table 1910868 IXn TTUSER.TABLE1 Program File Name: ttIsql 2880 0xeeb9a8 2.3 Active Database 0x01312d00 IX Table 1910868 IXn TTUSER.TABLE1 Command 19972120 S Awaiting locks PID Context TransID Resource ResourceID RMode HolderTransID HMode Name 2880 0xeeb9a8 2.3 Row 0x00156bbc Un 1.21 Xn TTUSER.TABLE1 2 outstanding transactions found
詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttXactAdminに関する項を参照してください。
Windowsでは、ODBCトレース機能を使用して、コマンドの順序と内容を確認します。アプリケーションがODBC Driver Managerとリンクされている場合のみODBCトレース機能が動作します。トレースを有効にするには、コントロール・パネルで「ODBC」をダブルクリックします。「ODBC データソース アドミニストレータ」が開きます。「トレース」タブを選択します。
UNIXプラットフォームでは、ドライバ・マネージャを使用している場合にのみODBCトレースを使用できます。Traceを有効にするには、Trace
およびTraceFile
属性を設定します。
ネットワーク管理ソフトウェアは、SNMP(Simple Network Management Protocol)を使用して、ルーターやスイッチなどのネットワーク・デバイスの状態を問合せまたは制御します。これらのデバイスは、トラップと呼ばれるアラートを生成し、ネットワーク管理システムに問題を通知できます。
TimesTenは、ユーザーのリカバリ・メカニズムが簡単になるように、特定の重大なイベントのSNMPトラップを送信します。また、これらのイベントはサポート・ログにも記録されます。このようなイベントをSNMPトラップを通じて公開することで、ネットワーク管理ソフトウェアでの迅速な対処が可能となります。
SNMPトラップを生成するためのTimesTenの構成方法やトラップの受信方法については、『Oracle TimesTen In-Memory Databaseエラー・メッセージおよびSNMPトラップ』のSNMPトラップを使用した診断に関する説明を参照してください。
各TimesTenデータベースには、データベースの現在の状態に関するメタデータを格納するシステム表のグループが含まれています。TimesTenのシステム表については、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のシステム表に関する説明を参照してください。
注意: システム表に対してSELECT 文は実行できますが、INSERT 、UPDATE 、DELETE などの文は実行できません。 |
特にトラブルシューティングの際に注目するのはSYS.MONITOR
表で、これには、データベースに最初に接続して以来発生した特定のイベントに関する統計が含まれています。たとえば、SYS.MONITOR
表には、データベースへの接続数、チェックポイントの処理回数、データベースのサイズおよび現在使用中のメモリー量に関する情報が含まれています。列に対してSELECT
文を実行するか、ttIsql
monitor
コマンドを実行してSYS.MONITOR
表の内容を確認します。ttIsql
monitor
コマンドの使用方法の例については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のttIsqlユーティリティの使用に関する説明を参照してください。
SYS.MONITOR
表は、パフォーマンスの問題の解決に役立ちます。詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のPLAN表からの問合せ計画の読取りに関する説明を参照してください。『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の問合せオプティマイザ計画の表示または変更に関する項を参照して、列に対してSELECT
文を実行するか、ttIsql
showplan
コマンドを実行してSYS.MONITOR
表の内容を確認します。
問合せオプティマイザは、パフォーマンス・チューニングのための重要なツールです。
問合せオプティマイザの詳細は、次を参照してください。
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のTimesTen問合せオプティマイザに関する説明
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の問合せオプティマイザ計画の確認と変更に関する説明
特定の問合せ速度が予想より遅い場合は、問合せオプティマイザで、問合せに含まれる表の最新の統計が使用されていることを確認します(「問合せオプティマイザの統計を更新する」を参照)。統計を更新しても問合せ速度が遅い場合は、TimesTenオプティマイザが問合せに応答するための最適な問合せ計画を選択していない可能性があります。このような状況では、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の計画作成の変更に関する項で説明されているttOpt
プロシージャを使用して、オプティマイザが計画を作成する方法を調整することができます。