技術ブログ
このエントリは JPOUG Advent Calendar2日目への参加記事です。
先のエントリでは Tanel PoderさんのSnapperスクリプトについて紹介しました。TanelさんはSnapper以外にも他に多くの有用なスクリプトを公開しています。
これらのスクリプト群はOracle Scripts and ToolsにてTPT Scriptとして公開されています。 (TPTとは、"Tanel Poder’s Troubleshooting (or tuning) scripts"の略だとのこと) なお、TPT Scriptパッケージに含まれる個々のスクリプトについては、 An index of my TPT scripts | TANEL PODER'S BLOG: IT & MOBILE FOR GEEKS AND PROS に簡単な紹介が書かれています。
本エントリではTPT Scriptsの導入方法とi.sqlについて御紹介します。
http://tech.e2sn.com/oracle-scripts-and-tools から、プラットフォームに合わせて
のいずれかをダウンロードし、展開します。
[oracle@l54x64a ~]$ wget http://files.e2sn.com/scripts/tpt_public_unixmac.tar.gz
--2012-11-22 17:08:52-- http://files.e2sn.com/scripts/tpt_public_unixmac.tar.gz
Resolving files.e2sn.com... 173.45.236.197
Connecting to files.e2sn.com|173.45.236.197|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 550908 (538K) [application/x-gzip]
Saving to: `tpt_public_unixmac.tar.gz'
100%[======================================>] 550,908 308K/s in 1.7s
2012-11-22 17:08:54 (308 KB/s) - `tpt_public_unixmac.tar.gz' saved [550908/550908]
[oracle@l54x64a ~]$ tar zft tpt_public_unixmac.tar.gz
tpt_public_unixmac/
tpt_public_unixmac/46off.sql
tpt_public_unixmac/46on.sql
tpt_public_unixmac/53on.sql
:
tpt_public_unixmac/aot/matching_lock_type_wait.sql
tpt_public_unixmac/aot/optimizer_bug.sql
tpt_public_unixmac/aot/ora4031.sql
tpt_public_unixmac/aot/README.txt
tpt_public_unixmac/aot/short_stack.sql
tpt_public_unixmac/aot/sqlidconv.sql
tpt_public_unixmac/aot/system_ts_writes.sql
tpt_public_unixmac/aot/tx_lock_diag.txt
[oracle@l54x64a ~]$ cd tpt_public_unixmac
[oracle@l54x64a tpt_public_unixmac]$ ls *.sql |wc -l
535
非常に多くのSQLスクリプトがあることが分かります。
展開されたSQLファイル群を、任意のディレクトリにコピーします。
環境変数 SQLPATH がポイントしているディレクトリにコピーすると、 パスを指定せずに、ファイル名を指定するだけで簡単にスクリプトを実行できて非常に便利です。
[oracle@l54x64a ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Thu Nov 22 17:17:57 2012
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> @df
SP2-0310: unable to open file "df.sql"
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@l54x64a ~]$ export SQLPATH=~/sql←★SQLPATHを設定
[oracle@l54x64a ~]$ echo $SQLPATH
/home/oracle/sql
[oracle@l54x64a ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Thu Nov 22 17:18:12 2012
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
USERNAME INST_NAME HOST_NAME SID SERIAL# VERSION STARTED SPID OPID CPID SADDR PADDR
-------------------- ------------ ------------------------- ----- -------- ---------- -------- --------------- ----- --------------- ---------------- ----------------
SYS b203 l54x64a.domain 46 7749 11.2.0.3.0 20121115 2351 30 2350 000000007EB95F70 000000007E8A3D98
SQL> col tablespace_name format a12
SQL> @df
TABLESPACE_N TotalMB UsedMB FreeMB % Used Ext Used
------------ ---------- ---------- ---------- ------ --------- ----------------------
MANUALTBS 204 195 9 96% YES |####################|
SYSAUX 730 691 39 95% YES |################### |
SYSTEM 720 717 3 100% YES |####################|
TEMP 29 29 0 100% YES |####################|
UNDOTBS1 145 14 131 10% YES |## |
USERS 5 2 3 40% YES |######## |
6 rows selected.
SQL>
なお、TPT Sciptにはlogin.sqlが含まれています。 SQL*Plusは、SQLPATHがポイントするディレクトリパスにlogin.sqlが存在すると、 ログイン時にそのスクリプトを自動的に自動実行します。
このため、上記の手順にしたがってTPT Scriptを配置すると、SQL*Plusでログインしたときに TPT Sciptのlogin.sqlの処理が常に実行されます。 この処理が不要な場合はlogin.sqlを別の名前にリネームしてください。
また、すでに自分用のlogin.sqlが作成済みである場合は、 意図せずファイルを上書きしないように注意してください。
さて、TPT Sciptのlogin.sqlからはinit.sqlとi.sqlが実行されます。
[oracle@l54x64a ~]$ cat sql/login.sql
-- calling init.sql which will set up sqlpus variables
@@init.sql
-- i.sql is the "who am i" script which shows your session/instance info and
-- also sets command prompt window/xterm title
@@i.sql
-- you can put your own login scripts here
init.sqlはSQL*Plusの変数と一部の初期化パラメータ (NLS_DATE_FORMAT)を 設定するスクリプトであり、主に表示の調整を行います。 私は、意図せず自動的に設定がされるのがあまり好きではないため、init.sqlの呼び出し部分をコメントアウトしています。 ここらへんは環境に対する考え方次第だと思います。
i.sqlは現行のセッションと関連プロセス、インスタンスについて情報を出力するスクリプトです。
SQL> @i
USERNAME INST_NAME HOST_NAME SID SERIAL# VERSION STARTED SPID OPID CPID SADDR PADDR
-------------------- ------------ ------------------------- ----- -------- ---------- -------- --------------- ----- --------------- ---------------- ----------------
SYS b203 l54x64a.domain 46 7779 11.2.0.3.0 20121115 3166 27 3165 000000007EB95F70 000000007E8A0B88
詳細は上記の実行結果を見てもらえれば分かると思います。 これらの情報はV$SESSION, V$PROCESS, V$INSTANCE から取得できる情報ですが、 "@i"とタイプするだけで簡単に取得できるのはやっぱり便利です。
私が重宝しているのは、ターミナルエミュレータのウィンドウのタイトル バーにユーザー名、インスタンス名、セッションID、OSプロセスIDを表示する機能です。 ウィンドウのタイトル バーは上記表示されていますので、@iの出力結果がスクロールして流れた状態でも、簡単にセッションIDやOSプロセスIDなどを確認できます。
Oracle Database エンジニアであれば、ふと思いついて あるセッション(≒プロセス)に対してoradebugを実行したくなるときが 良くあると思いますが、そのセッションで@iが実行されていれば、いつでも簡単にoradebugを実行できます。
なお、ウィンドウのタイトル バーに情報を出力する機能は、エスケープシーケンスを活用することで実現されています。
[oracle@l54x64a ~]$ cat sql/i.sql
-- the Who am I script
def mysid="NA"
:
-- short xterm title
host echo -ne "\033]0;&_i_user@&_i_inst &mysid[&_i_spid]\007"←★
-- long xterm title
--host echo -ne "\033]0;host=&_i_host inst=&_i_inst sid=&mysid ser#=&_i_serial spid=&_i_spid cpid=&_i_cpid opid=&_i_opid\007"
:
Oracle DatabaseやSQL*Plusだけを見ているのでは思いつかない便利なTipsです!
これでいつでもoradebugが実行できますね!