昔話。オラクルマスター奮戦記(その1)


今の10gBronzeより、はるかに簡単で、9i以前でいうSilver Fellowに相当する
オラクルマスターSilver(8i時代)を取得した頃のお話です。


■2001年4月1日


  20代も後半に差し掛かり、意を決してフリーター生活に終止符を打ち、
  全くの未経験でシステム開発会社に入社しました。

  当時、自宅ではiMac(初めてのパソコン)を使用しており、
  インターネットとメールくらいしか出来ませんでした。

  「この業界ではWindowsが使えないと駄目だよ」と、誰かに言われ、
  「へー、そうなんですかあ?」と適当な返事をしていました。
  エクセルもワードも、ほとんど触った事がありませんでしたから。


  この時からは、今の自分の姿は全く想像できませんでした。


■2001年6月3週頃


  社内研修が一通り終了し、あとは出向先となる現場が決定するのを待つのみ
  という状態でした。
  そして、7月1日から現場へ出向する事が決定した、との話がありましたが、
  現場での必要スキル、担当作業等の情報が、何故かはっきり分からない

  という状態でした。
  『そんな事で良いのか?』と疑問に思いつつ、いよいよ実業務に入るので、
  頑張らなければと気を引き締めなくてはいけません。


  さて、本来であれば、現場での必要スキルを補うべく、
  研修最後のラストスパート、と行きたいところだったのですが、
  現場の情報が分からないので、何をすれば良いのやら・・・


■2001年6月4週


  未だ、参画する案件の情報が入って来ませんでした。
  何をやろうか・・・と悩んでいたところ、会社の先輩から
  オラクルマスターの存在を聞きました。
  研修中にSQLを少しやっていた事と、普通自動車免許しか持っていない
  私にとって「資格」という響きは、なんとも素敵なものであり、
  思い立ったらやってみようという事で、会社にあったテキストと
  iStudyを使用して、第一関門の「SQL入門」を勉強を開始しました。


  勉強開始2日後、iStudyの問題は、ほぼパーフェクトに解けるようになり、
  大分自信が付いてきました。
  iStudyと同じような問題である事を願って、週末に受験を予約。
  早すぎるかなと思いましたが、とりあえず研修中の間にと思い
  受験する事を決意しました。


  そして、運命の受験日。
  試験なんて大学受験以来で、9年ぶり?くらいでした。
  試験会場へ向かい、会場に入るまでの間は、心臓バクバクでした。

  いざ、試験開始!
  問題は、iStudyに類似した問題が多く、自信を持って解けた問題が

  多かったです。
  15分程(制限時間30分)で見直しまで終了しました。

  『これを押したら後戻りは出来ない・・・』

  という不安もありましたが、結構自信はあったので、時間前でしたが、
  思い切って「終了」ボタンをクリック!


  『なにが起きるんだ・・・』

  初めての受験なので、勝手が分からず、ドキドキして待つこと数秒(もっと長く感じました)。
  なにやらグラフが表示されました。
  「う~ん?なになに?」片方が合格ライン、もう一方が点数のようです。
  『おっ合格だ!』心の中でガッツポーズをして、試験会場を後にしました。

  ちなみに結果は、18/20(合格ライン14点)でした。
  次は、Oracle入門!
  そして、来週からは、現場出向。しかし、未だ詳細は不明・・・。


■2001年7月1週


  初めての現場出向です。いよいよ私の新しいスタートが始まります。
  結局、出向当日に作業の内容を聞くことになりました。

  話によると、Oracleを取り扱う部署で、設計や構築をするらしいです。
  どんな仕事が検討が付きませんでしたが、偶然にも勉強していた

  オラクルマスターの知識が役に立つかも!
  と、意気揚揚としていたのも束の間でした・・・


  現場の方が「じゃあ、まずはこれを読んでて。この内容が分からないと話にならないから。」
  と言って渡されたものは、オラクルマスターGoldの「DBA編」のテキストでした。
  つい先週、テーブルやらスキーマやらの言葉を聞いた私にとっては、非常に高い壁でした。
  「SGAって何?」「表領域?」「ロールバック・セグメント?」???
  とにかく、何度読み返しても、全く頭に入らず、理解不能でした。
  この1週間、テキストは読み続けましたが、実際にはほとんど理解できませんでした。


■2001年7月2週


  『やっぱり何事にも順序は大事だな』と考え、「DBA編」の知識が必要というのは

 重々承知の上、「Oracle入門」の学習を開始。
  この時点では、まだiStudyも全くやっておらず、受験の準備は整っていませんでしたが、
  『先に目標を決めてしまおう!』と考え、翌週末に受験を予約してしまいました。
  (この方法が、後の私の受験スタイルとして確立されました)

  現場では、「DBA編」の読解と、ちょこちょこと依頼される作業をやりつつ、
  忙しい日々(スキルがないので時間がかかるだけ・・・)を過ごしていました。
  肝心の「Oracle入門」の勉強は、あまりはかどりませんでした。


  (週末の土日)
  休日にまとめて勉強しようと机に向かいましたが、「SQL入門」と比べると、
  なかなか理解が進みませんでした。
  あまり集中力がある方ではないので、自宅で勉強しているせいかな?
  それとも、初の実務での精神的疲労かな?

  結局、学習もはかどらず、あまりリフレッシュもできないまま、休日が終了・・・


■2001年7月3週


  『ああ、今週末に受験かあ・・・自信ないなあ・・・』
  予約をキャンセルしようかと思いましたが、一度決めた事はやり遂げようと、

 キャンセルはしませんでした。
  電車での通勤時間をメインにテキストを復習していましたが、イマイチ理解できません。
  結局、「SQL入門」ではほぼ完璧になるまで出来たiStudyも、「Oracle入門」では正解率は、

 80%程度で、不安を残しながら試験に臨む事になりました・・・


  そして、いざ受験!
  絶対に正解していると自信のあった問題は、半分程度でした。
  あとは運に任せるのみ。
  運命の終了ボタンをクリック!
  グラフの長さは・・・

  『ん???同じ長さ・・・?』

  という事は・・・
  そうです。ギリギリで合格です!
  14/20(合格ライン14点)でした。

  気分スッキリ、さっそく申請手続きを行いました。


■2001年8月上旬


  数週間後、オラクルマスターSilverの認定キットが到着しました。
  認定書などを何度も眺め、一人感動してしまいました。
  何といっても、自動車免許以外の、初めての資格ですから!


  一方、現場の作業はというと・・・
  与えられた指示に対して、まともな仕事は何一つ出来ず、
  何をしたら良いのか、自分は何をやっているのか、ほとんど分からない状態でした。
  唯一『自分が役にたっていない』という事だけは、はっきりと分かっていました。


  やっぱり初めに言われた通り、

  『この現場では「DBA編」の知識が必要なのだ』

  という事を再認識して、Silverも合格し、これで順番通り、気分スッキリ
  オラクルマスターGold「DBA編」の勉強を開始しました。

 

続く


2005年4月某日、リリース間近の性能テストを実施しました。
いつも通り、STATSPACKユーティリティを使用して、パフォーマンスレポートを取得します。


思えば、8i全盛の頃は、まだまだBSTAT/ESTATの方がメジャーだったなあ。
「STATSPACK?よく分からないので、使いません・・・」という状態だった。

しかし、STATSPACKを一度使ってみたら、もうBSTAT/ESTATなんて使えません。


話は戻って、性能テスト時の実際の作業は、こんな感じで進みます。


1.「テスト開始しまーす」の合図で、スナップショット取得コマンドを実行。
2.談笑しながらしばらく待つ・・・
3.「終わりましたー」の合図で、またスナップショット取得コマンドを実行。
4.1と3で取得したスナップショット間のパフォーマンスレポートを生成。


こんな流れで、複数のテストケースを実施していきます。


テスト当日は、大まかなレポート分析を行ない、即時対策可能なものはその場で対応しますが、
基本は、後日詳細まで解析して評価報告書を作成するというのが私のお仕事。


さてさて、STATSPACKの良いところと言えば、やっぱり「Top 5 Timed Events」でしょう。
まず最初に、ここのセクションを見て、問題となりそうな待機イベントが
ないかを確認してみます。


********************************************************************************

<表示例>

Top 5 Timed Events
~~~~~~~~~~~~~~~~~~                                                     % Total
Event                                               Waits    Time (s) Ela Time
-------------------------------------------- ------------ ----------- --------
CPU time                                                           16    75.42
latch free                                          2,102           2    10.63
control file sequential read                        3,013           1     3.42
global cache cr request                               612           1     2.44
control file parallel write                           286           0     1.53

********************************************************************************


「CPU time」は、待機イベントではなくて、CPU処理時間なので、基本はこの項目が
一番多くなるのが望ましい。
「latch free」が少し割合が高いけど、同じ処理を多重で実行してるから、
ラッチの競合が発生している様子・・・仕方ないか。
という事で、特に問題なさそうですね。

あと便利なところと言えば、キャッシュヒット率等が既に計算された状態で出力される事。
BSTAT/ESTATの頃は、個々の値を持ってきて計算してましたから・・・。


********************************************************************************

<表示例>

Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            Buffer Nowait %:  100.00       Redo NoWait %:    100.00
            Buffer  Hit   %:  100.00    In-memory Sort %:    100.00
            Library Hit   %:  100.01        Soft Parse %:    100.00
         Execute to Parse %:   67.88         Latch Hit %:     99.86
Parse CPU to Parse Elapsd %:   89.47     % Non-Parse CPU:     94.89

********************************************************************************


さらに、便利なところと言えば、負荷の高いSQLの抽出機能ですね。
「SQL ordered by Gets for DB」や「SQL ordered by Reads for DB」セクションから、
負荷の高いSQLが存在しているかどうかが確認できる。

これによって、SQLトレースを取得しなくても、ボトルネックとなっている
SQLの抽出ができるので、非常に便利ですね。


********************************************************************************

<表示例>

SQL ordered by Gets for DB: orcl  Instance: orcl1  Snaps: 11-12

                                                     CPU      Elapsd
  Buffer Gets    Executions  Gets per Exec  %Total Time (s)  Time (s) Hash Value
--------------- ------------ -------------- ------ -------- --------- ----------
         21,413           49          437.0   40.0     0.40      0.82  818142582

Module: test1.exe
SELECT COL1 from TESTTAB ・・・

********************************************************************************


実行時間(Elapsd Time)が0.82秒で、実行回数(Executions)が49回だから、
1実行あたりの実行時間は・・・大した事ないですね。


後日、詳細のレポート解析を行ないましたが、Oracleとしてのボトルネック箇所は
特に見つからず、目標性能もクリアしていたので、このままリリースする事となりました。


まあ、私が設計したからには、パラメータの調整が必要な事態なんて発生する筈は
ないんですけどね!
というのは言い過ぎですが、常にその位のつもりで設計しないといけませんね。


<今日のおさらい>

STATSPACKは便利!以上!
・・・だけでは寂しいので、基本的な使い方を少し残しておこうかな。


◆STATSPACK環境インストールスクリプト
  @$ORACLE_HOME/rdbms/admin/spcreate.sql


◆スナップショット取得コマンド

 execute statspack.snap (i_snap_level => レベル);


◆レポート作成スクリプト
 @$ORACLE_HOME/rdbms/admin/spreport.sql


◆スナップショット削除(delete)スクリプト
 @$ORACLE_HOME/rdbms/admin/sppurge.sql


◆スナップショット削除(truncate)スクリプト
 @$ORACLE_HOME/rdbms/admin/sptrunc.sql


◆STATSPACK環境アンインストールスクリプト
 @$ORACLE_HOME/rdbms/admin/spdrop.sql


※インストール/アンインストールはSYSユーザで実行する。
 それ以外はPERFSTATユーザで。
 


2005年4月某日、総合テストもほぼ完了し、あとはリリースを待つのみという頃、
顧客より一通のメールが届きました。内容はというと。

ユーザのパスワード管理について、要件を満たしていない機能があったとの事。
Oracleとして、以下のようなルールを実装する事は可能かどうか?との問い。


(1)パスワードは8文字以上とする事
(2)パスワードは英文字以外に数字、又は記号を含んでいる事
(3)ユーザ名と同名ではいけない


などなど・・・


『こんな時期に環境変更ですか?』
と考えましたが、要件を満たしていないのであれば仕方ないですね。
総合テストをし直さなくてはいけないなんて大袈裟な変更でもないですし。


とは言うものの、これまで、私が経験してきた中では、このような機能は

実装した事がありません。
周りのDBA数人に聞いてみたところ、皆「そんな機能あったっけ?」との事。


「そのような機能はありませんでした。」とでも、回答するしかないかな、
と思いつつ、マニュアル(管理者ガイド)を確認してみました。


すると・・・なんと、ぴったりのものがあるじゃないですか~~~~!


「データベース管理者ガイド リリース2(9.2)」の「23-16」ページに
「パスワードの複雑度の検証」という項目がありました。

もしかして、常識?

恥ずかしい・・・。


ここを見ると、標準でインストールされているスクリプトを実行する事で、
以下の機能を持つ、パスワード複雑度の検証ルーチンが作成できるそうです。


・パスワードの長さが4文字以上であること。
・パスワードがユーザー名と同じでないこと。
・パスワードに少なくとも1つのアルファベット文字、1つの数字、
  及び1つの句読点文字が含まれていること。
・パスワードが、welcome、account、database、user などの
  簡単、又は明白な単語でないこと。
・以前のパスワードとの違いが3文字以上あること。


そのスクリプトはこちら。
$ORACLE_HOME/rdbms/admin/utlpwdmg.sql


このスクリプトをカスタマイズすれば簡単じゃないですかっ!
さすがOracleさん!
これくらいの機能は当然ありますよね!常識ですよね!


早速、このスクリプトをカスタマイズして、機能を実装しました。

ヨカッタ、ヨカッタ。


<今日のおさらい>

これまで、パスワードの管理を運用任せにしてしたところは多いと思う。
この機能を使って、設計時点から提案する事で、信頼が向上するかも。
個人情報保護法の影響で、特にセキュリティには厳しくなってますからね。
基本的な第一歩として、読み取られにくいパスワードの実装を忘れずに。


◆パスワード複雑度の検証ルーチン作成スクリプト
 $ORACLE_HOME/rdbms/admin/utlpwdmg.sql