CHAPTER 01 データベースとインスタンス – プロとしてのOracleアーキテクチャ入門

私が中心になって執筆した書籍 「プロとしてのOracleアーキテクチャ入門」について、
紙幅や構成上の制約で触れることができなかった点、誤記などについて、
各章ごとに補足説明をしたいと思っています。

今回のentryでは、「SECTION I Oracleアーキテクチャ概要」の「CHAPTER 01 データベースとインスタンス」
について説明します。
この章では、OS上のファイルの集合として構成される「データベース」と、
OS上のプロセスとメモリとして実現される「インスタンス」について取り上げています。

ファイルはlsコマンド(UNIX/Linux)や、エクスプローラ(Windows)にて実際に確認できます
から、「データベース」についてはイメージしやすく実感がわきやすいものと思います。

しかし、プロセスとメモリとして実現される「インスタンス」については、
理解がしにくいかもしれません。このため、書籍のP17 では、UNIX/Linux版Oracleを例にとり、
psコマンドやshow sgaコマンド(SQL*Plus)の実行例を記載することで、
理解を助けるように工夫しています。読者がより親しんでいるであろうOSのWindows版
Oracleを例にとり説明できればよかったのですが、以下の理由でUNIX/Linuxプラットフォーム
での説明とせざるをえませんでした。

* Windows版OracleではOracleのプロセス(バックグラウンドプロセス、サーバープロセス)は
Oracle.exe内のスレッドとして実装されているため、容易に確認できないこと
* Windows版Oracleでは、OracleDatabaseサービスを起動すると、デフォルトでインスタンス
も自動的に起動してしまうするため、「インスタンス未起動」→「インスタンス起動」の
流れを説明しにくいため(※: 一旦インスタンスを停止してから、インスタンスを起動する必要がある。)
* 本書の冒頭部分の、まだ「データベース」や「インスタンス」について理解ができていない
時点で、UNIX/Linux版OracleとWindows版Oracleの実装上の違い(スレッド、プロセス、OracleDatabaseサービス)
について触れることは理解の点で混乱を招く可能性が高いこと

ここでは、P17の内容をWindows版Oracleを使って説明してみることにします。UNIX/Linux版OracleとWindows版Oracleのアーキテクチャの違いについて理解の度合いを確認してみてください。

コマンドプロンプトでの実行例を以下に示します。

C:\>net start OracleServiceO111 (1)
OracleServiceO111 サービスを開始します…………….
OracleServiceO111 サービスは正常に開始されました。

C:\>sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 – Production on 金 11月 7 09:37:02 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

SQL> connect / as sysdba
接続されました。
SQL>
SQL>
SQL> shutdown immediate (2)
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> host pslist -x oracle (3)

pslist v1.28 – Sysinternals PsList
Copyright c 2000-2004 Mark Russinovich
Sysinternals

Process and thread information for host0:

Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time
oracle 712 8 5 151 27592 0:00:15.390 0:01:32.843
VM WS Priv Priv Pk Faults NonP Page
188172 50300 27592 264788 111314 7 350
Tid Pri Cswtch State User Time Kernel Time Elapsed Time
3988 9 128 Wait:Executive 0:00:00.000 0:00:00.078 0:01:32.843
3232 9 136 Wait:UserReq 0:00:00.000 0:00:00.015 0:01:32.718
3412 9 15 Wait:UserReq 0:00:00.000 0:00:00.000 0:01:32.703
3880 11 15 Wait:Queue 0:00:00.000 0:00:00.000 0:01:32.281
968 9 646 Wait:UserReq 0:00:00.203 0:00:00.015 0:00:21.484

SQL> startup (4)
ORACLEインスタンスが起動しました。

Total System Global Area 313860096 bytes
Fixed Size 1332892 bytes
Variable Size 197134692 bytes
Database Buffers 109051904 bytes
Redo Buffers 6340608 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL> host pslist -x oracle (5)

pslist v1.28 – Sysinternals PsList
Copyright c 2000-2004 Mark Russinovich
Sysinternals

Process and thread information for host0:

Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time
oracle 712 8 27 558 256752 0:00:26.750 0:02:27.093
VM WS Priv Priv Pk Faults NonP Page
562764 211136 256752 266160 193572 53 351
Tid Pri Cswtch State User Time Kernel Time Elapsed Time
3988 9 128 Wait:Executive 0:00:00.000 0:00:00.078 0:02:27.093
3232 9 136 Wait:UserReq 0:00:00.000 0:00:00.015 0:02:26.968
3412 9 22 Wait:UserReq 0:00:00.000 0:00:00.000 0:02:26.953
3880 11 18 Wait:Queue 0:00:00.000 0:00:00.000 0:02:26.531
3844 8 126 Wait:UserReq 0:00:00.000 0:00:00.000 0:00:37.265
3784 15 1870 Wait:DelayExec 0:00:00.000 0:00:00.000 0:00:37.250
3188 8 97 Wait:UserReq 0:00:00.000 0:00:00.000 0:00:37.250
2888 8 95 Wait:UserReq 0:00:00.015 0:00:00.015 0:00:37.218
1356 8 111 Wait:UserReq 0:00:00.000 0:00:00.015 0:00:37.218
2520 8 118 Wait:UserReq 0:00:00.015 0:00:00.000 0:00:37.203
1396 9 219 Wait:UserReq 0:00:00.078 0:00:00.015 0:00:37.203
1260 8 145 Wait:UserReq 0:00:00.015 0:00:00.000 0:00:37.187
2928 9 255 Wait:UserReq 0:00:00.000 0:00:00.015 0:00:37.187
1716 9 129 Wait:UserReq 0:00:00.000 0:00:00.000 0:00:37.171
3804 8 514 Wait:UserReq 0:00:00.062 0:00:00.046 0:00:37.171
1908 8 87 Wait:UserReq 0:00:00.000 0:00:00.015 0:00:37.171
2132 8 1986 Wait:UserReq 0:00:00.984 0:00:00.015 0:00:37.156
3312 8 103 Wait:UserReq 0:00:00.000 0:00:00.015 0:00:37.156
3240 8 113 Wait:UserReq 0:00:00.000 0:00:00.000 0:00:37.140
2856 8 91 Wait:UserReq 0:00:00.000 0:00:00.000 0:00:37.140
2640 8 12670 Wait:UserReq 0:00:06.640 0:00:00.390 0:00:28.734
2796 8 137 Wait:UserReq 0:00:00.015 0:00:00.000 0:00:26.890
1508 8 106 Wait:UserReq 0:00:00.000 0:00:00.000 0:00:26.875
2668 8 72 Wait:UserReq 0:00:00.015 0:00:00.031 0:00:25.562
1624 8 35 Wait:UserReq 0:00:00.000 0:00:00.015 0:00:23.875
796 8 54 Wait:UserReq 0:00:00.015 0:00:00.000 0:00:15.437
3744 8 33 Wait:UserReq 0:00:00.015 0:00:00.000 0:00:15.421

SQL> select spid, program from v$process;

SPID PROGRAM
———————— ———————
PSEUDO
3844 ORACLE.EXE (PMON)
3784 ORACLE.EXE (VKTM)
3188 ORACLE.EXE (DIAG)
2888 ORACLE.EXE (DBRM)
1356 ORACLE.EXE (PSP0)
1396 ORACLE.EXE (MMAN)
2520 ORACLE.EXE (DIA0)
1260 ORACLE.EXE (DBW0)
2928 ORACLE.EXE (LGWR)
1716 ORACLE.EXE (CKPT)
3804 ORACLE.EXE (SMON)
1908 ORACLE.EXE (RECO)
2132 ORACLE.EXE (MMON)
3312 ORACLE.EXE (MMNL)
3240 ORACLE.EXE (D000)
2856 ORACLE.EXE (S000)
2796 ORACLE.EXE (FBDA)
3476 ORACLE.EXE (CJQ0)
1508 ORACLE.EXE (SMCO)
2668 ORACLE.EXE (QMNC)
2764 ORACLE.EXE (W000)
796 ORACLE.EXE (q000)
3744 ORACLE.EXE (q001)
1704 ORACLE.EXE (SHAD)

25行が選択されました。

(1)では、Oracleインスタンスに対応したWindowsサービス OracleDatabaseO111を起動しています。
この実行例ではインスタンスのORACLE_SIDはO111です。これでOracle.exeが起動します。

(2)では、OracleDatabaseサービス起動時に自動的にインスタンスが起動するため、インスタンスを一旦
shutdownしています。

(3) では、pslistを使って、Oracle.exe内のスレッドを確認しています。ここでは、5つのスレッドが
起動していることがわかります。
なお、pslistはMicrosoft(旧sysinternal)から公開されているプロセス、スレッドの情報が確認
できるコマンドラインツールです。

* [PsList](http://technet.microsoft.com/en-us/sysinternals/bb896682.aspx)

pslistを使用するには、上記URLからファイルをダウンロード、展開して、
PATH環境変数を設定する必要があります。

(4) では、インスタンスを起動しています。
(5) では、pslistを使って、Oracle.exe内のスレッドを再度確認しています。ここでは、27つのスレッドが
起動していることがわかります。(3)のインスタンス停止時よりも起動しているスレッド数が増えて
いることがわかるでしょう。これらのスレッドがバックグラウンドプロセスに相当します。
pslistのTID(スレッドID)は、V$PROCESSから確認できるSPIDに対応します。

(6) では、v$process の実行結果を示しています。pslistの実行結果と照らし合わせてみてください。

インスタンスとプロセスから構成されるUNIX/Linux版Oracleと異なり、
サービスやスレッドも関連するWindows版Oracleは、理解しにくいかもしれません。
実はこの理解のしにくさが、書籍でUNIX/Linuxプラットフォーム上での
Oracleを例にとりpsコマンドやshow sgaコマンド(SQL*Plus)の実行例を用いて説明した理由でも
あります。

なお、UNIX/Linux版OracleとWindows版Oracleのアーキテクチャの違いについては、書籍
P106でも触れていますので、是非参考にしてください。
また、マニュアル『Oracle Databaseプラットフォーム・ガイド 11gリリース1(11.1) for Microsoft Windows E05885-03』
の『1 WindowsでのOracle Databaseアーキテクチャ』、『D Oracle DatabaseのWindowsとUNIXでの相違点』にも説明があります。必要に応じて確認してみてください。

* [1 WindowsでのOracle Databaseアーキテクチャ](http://otndnld.oracle.co.jp/document/products/oracle11g/111/windows/E05885-03/architec.htm#i1006272)

* [D Oracle DatabaseのWindowsとUNIXでの相違点](http://otndnld.oracle.co.jp/document/products/oracle11g/111/windows/E05885-03/ap_unix.htm#g636701)

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>