materialized view

名前がカッコイいよね。マテビューとか略す人多いけど、オレは略したくないよ。

materialized view は、実体を持つビューで、普通のビューはアクセスを受けるとビューsqlが走るが、マテリアライズドビューは、実体データを持つので、sqlが走らずに済む。チューニングに困った時にビューをマテリアライズドビューに置き換えるのはよく使う手だ。

でも気をつけないといかんこともあり。

ただ作っただけではインデックスがない。別途create indexしてやらないと使い物にならないだろう。あと、元表への更新が発生したときに、どういうタイミングでマテリアライズドビューに反映させるか。もしリアルタイムなら、エンタープライズエディションでないとだめ。後で追記する。

リスナーとサーバーとの会話

リスナーはクライアントからの接続の窓口。その登録には静的登録と動的登録があるという。

静的登録はlistener.oraにサーバー情報を記述するらしい。つまりリスナー側から自主的に面倒みてやるよって感じかな?

動的登録はサーバーの初期化パラメータファイルに、どのリスナーに(LOCAL_LISTENER)どのインスタンスの(INSTANCE_NAME)どのサービス(SERVICE_NAMES)をリッスンさせるかを記述する。つまり、自主的ではなくサーバー側が『よろしく頼むよ』って感じか(*^o^*)


あとで動きを見てみようっと。

shutdown・・・なんなんだ〜

今どきはOracleのShutdownは、Windowsのサービス一覧から「停止」ってやるのが普通なのかもしれない(うちの職場ではそうやっている)が、経験豊かな先輩が、

「ターミナルからやるのはあまり行儀の良いやり方ではない」

ともの申されていたことがあったので、コマンドからやってみた。

  sqlplus /nolog
  conn sys/pw@orcl as sysdba

sysでログオンしておき、shutdownを実行。既存セッションの受動的切断を待ってくれるnormalモードで。ほかにもセッション切ってロールバックするimmediateや有無を言わさず即時停止するabortなどがありますが、私が携わっている10g運用中のシステムで、immediateの不具合が元でうまくいかない時がありました。夜間バッチでは、昼業務ユーザーからの接続が残っている(つまりまだ使っている)ケースが多いので、immediateを普通使うのでしょうね。ただ、Webシステムの場合には、DBよりも先にWebを落としますから、shutdown実行時にセッションが残っているケースはほとんどないのでは、という気もします。


  shutdown normal


しばらく待つが、画面はそのまま。数分がたち、さすがに「変だ」と思い始める。DBサーバ側にログインし、アラートログを見てみた。



  cd E:\oracle\product\10.1.0\admin\orcl\bdump\alert_orcl.log


ログの最後にシャットダウンシーケンスのログがあるはず。内容は・・・



  Fri Sep 02 20:56:21 2011
  Starting background process EMN0
  EMN0 started with pid=26, OS id=2008
  Fri Sep 02 20:56:21 2011
  Shutting down instance: further logons disabled
  Fri Sep 02 20:56:22 2011
  Stopping background process QMNC
  Fri Sep 02 20:56:22 2011
  Stopping background process CJQ0
  Fri Sep 02 20:56:24 2011
  Stopping background process MMNL
  Fri Sep 02 20:56:25 2011
  Stopping background process MMON
  Fri Sep 02 20:56:26 2011
  Shutting down instance (normal)
  License high water mark = 13
  Fri Sep 02 20:56:26 2011
  Stopping Job queue slave processes
  Fri Sep 02 20:56:26 2011
  Job queue slave processes stopped
  Fri Sep 02 21:01:35 2011
  Active process 2012 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  Active process 2048 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  Active process 2312 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  Active process 2040 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  Active process 548 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  Active process 2132 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  Active process 2500 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  Active process 2324 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  Active process 2052 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  Active process 2488 user 'SYSTEM' program 'ORACLE.EXE (SHAD)'
  SHUTDOWN: waiting for logins to complete.


ちゃんと終わっているっぽいです。なのに、クライアントのコマンドプロンプトは固まっている。なんでかなと思い、もうひとつコマンドプロンプトを起動し、sqlplus接続してみました。



  sqlplus /nolog
  conn sys/pw@orcl as sysdba
  ERROR:
  ORA-12528: TNSリスナー:
  該当するインスタンスはすべて、新規接続をブロックしています


ええ〜、そうなの??
じゃあ、shutdown コマンドを実行したウィンドウはみんな、そのシャットダウンシーケンスの中で自分自身が持っている接続セッションを自分自身が起動したshutdownシーケンスのために消されてしまうってこと??

じゃあ、このウィンドウはどうすればいいのでしょう・・・
あと、これを夜間バッチで自動起動などする場合には、コマンドが途中でだんまりになってしまったりしないのかな・・・

というわけで、どうもよく分かりません。もう少し調べてみます。わかる人なら瞬察なんでしょうけどね・・・

sqlplus /nolog の nologって・・・

とってもおバカな勘違いのお話です。

Oracleコマンドラインからsqlplus接続する時に、


  sqlplus /nolog


と打ちますよね。あの「/nolog」って、私はず〜っと、

「no log = ログファイルを作らないモードだ」

と思っていました。

ふと今日、そういや、そのログってどこにあるんだろう、と思い、ネットで調べてみました。

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19277-01/ch3.html


「/NOLOGを使用した接続なしのSQL*Plusセッションの開始」

そ〜ゆ〜ことかよ!!
つまり、「ログインなしのセッション」ってことね。その「no log」かよ!


くだらないことですが、案外みんな知らなかったりして・・・なわけないか。こんな勘違いしてるのオレだけだよね(^_^;)