[DBA] ネットワークとインスタンスの管理
前回はOracleソフトウェアのインストール&データベースの作成を行い、管理ツールであるOracle Enterprise ManagerのEM Expressについて学習しました。7回めとなる今回は次のステップとして、ネットワークを経由してデータベースサーバーに接続する方法とOracleインスタンスの管理について学習していきます。
さて、あなたは「インスタンス」と「データベース」の違いについて、正しく説明できますか?(笑)
さぁ! 今回も気合いを入れて進めていきましょう!
リスナーとは?
クライアントからネットワーク経由でデータベースサーバーに接続するには、リスナーというプロセスが必要になります。リスナーはクライアント側からの接続要求を受け付けてサーバープロセスを生成し接続を確立させます…… と、言葉だけで説明しても理解しづらいと思いますので、とりあえずリスナーやプロセス生成云々は置いておいて、以下の図を見てください。これはオラクルで働いている野村君が、株式会社○○の△△様と話しをするために代表電話を通して通話するための手順です。
電話で会話を始める際の一般的な流れですよね。実はこの流れが、Oracleデータベースインスタンスへの接続のイメージと似ています。では今度は、クライアントからリスナー経由によるリモート接続の流れを見てみましょう。
図を比較してみていかがでしょうか? 似ていませんか?(笑) リスナーは、リモート接続の新規要求を受け付ける必須のプロセスであることが分かりますよね。これで、接続のイメージがかなりつかめたのではないかと思います。では、ここで1つ問題をやってみましょう。
デフォルトで起動しているリスナー(LISTENER)を使ってリモート接続を行っています。このリスナーを、lsnrctl stopコマンドを実行して停止した場合の挙動として正しいものを2つ選択してください。
(a)クライアントとの接続中のセッションがある場合、リスナーは停止できない
(b)クライアントからの新規接続要求を処理できなくなる
(c)クライアントと接続中のセッションは直ちに切断される
(d)クライアントと接続中のセッションは60秒後に切断される
(e)クライアントと接続中のセッションには影響はない
それでは解説です。問題文中に「lsnrctl」という名のコマンドが出てきますが、これはリスナーを制御するためのコマンドです。主な使い方を以下にまとめたので、覚えておきましょう。
コマンド | 説明 |
---|---|
lsnrctl start[リスナー名]※ | リスナーを起動します |
lsnrctl stop[リスナー名] | リスナーを停止します |
lsnrctl status[リスナー名] | リスナーの状態を確認します |
lsnrctl service[リスナー名] | リスナーが認識しているサービスを確認します |
※リスナー名がデフォルト(LISTENER)の場合は省略可
問題では「リスナーを停止した」場合の挙動とあります。
「リスナーはリモート接続に必要だから、止めたらセッションは切断される」
と思った方…… 残念……
もう一度、接続のイメージ図を見てみましょう。ユーザープロセスとサーバープロセスの接続が確立されたら、リスナーはその接続に対して何も関与しません(電話回線のイメージ図でいうと、代表電話の受け付けの方がリスナーに該当します)。したがってリスナーを停止したからといって、接続中のセッションが切断されるようなことは起きません。「リモート接続にはリスナーが必要」という言葉だけをただ暗記していると「リスナー停止=セッション切断」と考えてしまいがちです。
さて、そのようなことにならないように、ここで新たな学習法を追加していきましょう! 今回の連載では第1回目から「実機で検証して確認」としつこく言ってきましたが、今後はこれに加えて「絵を描いて理解する」というのも取り入れてください! 言葉だけを呪文のように暗記をしても、本当の意味で理解できていないことが多いです。自分でイメージ図を描いて理解を深めるのは、資格の学習だけにとどまらず今後の業務にも必ず役立ちますので、ぜひ実践していきましょう。
それではもう一度選択肢を見ていきましょう。選択肢(a)のように、接続中のセッションがあったとしてもリスナーが停止できないということはありません。また(c)や(d)のようにリスナーを停止しても接続中セッションには影響はありませんので、正解は(b)と(e)になります。
では、もう1問接続に関する問題をやりましょう。
リモート接続するために必要な構成ファイルであるtnsnames.oraについての問題です。以下の①、②、③に入る組み合わせとして正しいものを選択してください。
(a)①接続記述子 ②ネットサービス名 ③ローカル・ネーミング
(b)①接続記述子 ②サービス名 ③ローカル・ネーミング
(c)①ネットサービス名 ②サービス名 ③簡易接続ネーミング
(d)①サービス名 ②ネットサービス名 ③簡易接続ネーミング
(e)①ネットサービス名 ②サービス名 ③ローカル・ネーミング
クライアントからデータベースサーバー側へリモート接続するには、リスナーが必要であることは説明しました。では、クライアントは、どこからサーバー側の情報を認識して接続要求を出すのでしょうか? その方法の一つが、今回の問題文に記載してあるtnsnames.oraファイル内の情報を使って接続するという方法です。この接続方法をローカル・ネーミングといいます。tnsnames.ora内に記載する内容については、以下を参考にしっかり覚えておきましょう。
tnsnames.oraはテキストエディターで作ることも可能ですが、netmgr(Net Manager)や netca(Net Configuration Assistant)といったGUIツールから作成することも可能です。SQL*Plusからtnsnames.ora情報を使って接続する接続文字列についても確認しておきましょう。
さぁ、ここまで確認できたら正解の選択肢を選べるはずです! ①はネットサービス名で②はサービス名、③はローカル・ネーミングとなりますので正解は(e)となります。
今回の問題はローカル・ネーミングの話でしたが、事前に設定ファイルを準備する必要がない接続方法である「簡易接続ネーミング」についてもあわせて押さえておきましょう。以下のように接続文字列を記述します。
必ず実機を使って、リモート接続できることを確認しておきましょう!
Oracleインスタンスの管理
では続きまして、「Oracleインスタンスの管理」に話を移しましょう。さて、Oracleインスタンス…… あなたは「インスタンスとは何を指しているか」説明できますか? またインスタンスのイメージ図を描けるでしょうか? インスタンスが何者か分からない状態では管理は行えません(笑)。
インスタンスはデータベースの起動時に獲得されるSGA(システムグローバル領域)といわれるメモリー領域と、データベースを稼動させるために必要なプロセス群であるバックグラウンドプロセスから構成されています。以下の図を見ると分かりやすいと思います。
上の図でSMONやPMONと書かれているのが、バックグラウンドプロセスです。このプロセス群とメモリー構造の部分をあわせて「インスタンス」と言うわけですね。それに対して、制御ファイル、データファイル、REDOログファイルといった記憶域構造の部分が「データベース」となります。
では1つ問題をやってみましょう。
Oracleデータベースを使用するためにSQL*PLUSから以下を実行しました。
SQL> startup
これにより実行される処理について正しい順序となっているものを選択してください。
① SGAメモリーが割り当てられる
② 制御ファイルがオープンする
③ REDOログファイルやデータファイルがオープンする
④ 初期化パラメータファイルを読み込む
⑤ バックグラウンドプロセスが起動する
(a)④ → ⑤ → ① → ② → ③
(b)④ → ① → ⑤ → ② → ③
(c)① → ④ → ② → ③ → ⑤
(d)① → ④ → ⑤ → ③ → ②
(e)④ → ① → ② → ③ → ⑤
(f)① → ④ → ⑤ → ② → ③
先ほど確認した、インスタンスやデータベースの起動がどのように処理されていくかを問う問題です。データベースはインスタンスによって管理されるので、まずはインスタンスの起動処理が必要になります。インスタンスの起動とは、実際にはメモリーのサイズ割り当てや、バックグラウンドプロセスの起動が行われますが、それらの処理を行うための情報は初期化パラメータファイルという構成ファイルに記述されています。つまりインスタンス起動時には、最初に初期化パラメータファイルの読み込みが必要ということです。
初期化パラメータファイルには、バイナリ形式で書かれたサーバー・パラメータ・ファイル(通称:SPFILE)と、テキスト形式で書かれたテキスト初期化パラメータ・ファイル(通称:PFILE)がありますので、あわせて覚えておきましょう。
さて、インスタンス起動処理の流れとして、「初期化パラメータファイルの読み込み」→「SGAメモリー割り当て」→「バックグラウンドプロセスの起動」というのが確認できました。これはstartup処理中のNOMOUNTというフェーズで行われます。データベースが使用できるOPEN状態になるまでに、NOMOUNT→MOUNT→OPENとフェーズが遷移し、その各フェーズで行われる処理があります。以下の図にまとめておいたので、しっかりと覚えておきましょう。
ここまで確認できましたら、正解の選択肢を選ぶことは容易ですよね。正解は(b)になります。単に言葉を暗記するのではなく、起動の流れを絵に描いて理解を深めてください。
続けて次の問題を解いてみましょう。
以下の初期化パラメータの設定値を確認して、正しいものを選択してください。
(a)SGAとPGAが自動調整される自動メモリー管理が有効になっている
(b)SGAを構成する各コンポーネントのみ自動調整される
(c)SGAサイズの最大値は400MBに設定されている
(d)自動PGAメモリー管理が無効となっている
初期化パラメータファイル内に記載されているメモリー関連のパラメータに関する問題です。Oracle全体で使用するメモリーにはこれまで学習したSGAと、この問題文で出てきたPGA(プログラムグローバル領域)というものがあります。以下の図で確認してみましょう。
PGAはサーバープロセスや各バックグラウンドプロセスが獲得する固有(非共有)のメモリー領域であるのに対し、SGAは各プロセスが共有すべき情報を格納するメモリー領域になります。両者の違いに注意しましょう。SGAの内わけをもう少し詳しく見ていくと、図のように各コンポーネントに分けることができます。主なものを以下に説明しておきます。
SGAコンポーネント名 (初期化パラメータ名) | 説明 |
---|---|
共有プール (shared_pool_size) | ユーザー間で共有可能なSQL文などをキャッシュする領域 |
バッファ・キャッシュ (db_cache_size) | データベースから取得されるデータ・ブロックをキャッシュする |
REDOログ・バッファ (log_buffer) | データの変更履歴であるREDO情報をキャッシュする |
ラージ・プール (large_pool_size) | バックアップやリカバリ、並列処理など特定作業の領域として使用 |
Javaプール (java_pool_size) | Java仮想マシン(JVM)内のセッション固有Javaコードなどに使用 |
Streamsプール (streams_pool_size) | Oracle Streamsによって必要となる情報を格納するために使用 |
Oracleは、このSGAとPGAのメモリー領域を自動調整する機能を備えています。SGAの各コンポーネントを運用にあわせて自動調整したい場合は、SGAのサイズを初期化パラメータsga_targetで指定します(注:REDOログ・バッファは自動調整対象外)。この機能を自動共有メモリー管理(ASMM:Automatic Shared Memory Management)と呼びます。また各プロセスへのPGA割り当てのメモリーサイズを自動調整したい場合は、pga_aggregate_targetを使用します。こちらは自動PGAメモリー管理と呼びます。さらにOracle全体で使うメモリー(SGA+PGA)のサイズを初期化パラメータmemory_targetで指定すると、SGA、PGAのサイズ配分も自動調整してくれます。大変ありがたいこの機能のことを自動メモリー管理(AMM:Automatic Memory Management)と呼びます。
問題ではmemory_target=1Gとなっていますので、自動メモリー管理が有効な状態です。したがって選択肢(a)は正解です。他の選択肢も見てみましょう。選択肢(b)は、SGA内のコンポーネントのみ調整されるとあるので誤りですね。選択肢(c)はSGAの最大サイズのことを述べており、sga_target=400Mとあるので迷ったかもしれませんが、自動メモリー管理が有効な場合はsga_targetで指定されるサイズは自動調整の最小値として使われるだけなので誤りです。選択肢(d)についてもpga_aggregate_targetの値が0となっているので無効化されているように見えるかもしれませんが、自動メモリー管理が有効の場合、pga_aggregate_targetで指定した値は自動調整の最小値となるだけでPGAの自動調整は有効なので誤りです。よって、正解は(a)のみとなります。
それでは今回最後の問題です。初期化パラメータの値を変更する際に使う構文についてです。
サーバー・パラメータ・ファイル(SPFILE)を使用しているデータベースに対して以下のコマンドを実行しました。
SQL> alter system set shared_pool_size=600M;
指定した設定値へ変更するだけの十分なメモリー領域は確保されているとします。このコマンドの結果として正しいものを1つ選択してください。
(a)稼動中インスタンスのみに適用されインスタンス再起動後は変更前の設定値に戻る
(b)稼働中インスタンスとSPFILEに適用されるためインスタンス再起動後も設定変更が継続する
(c)稼働中インスタンスには適用されずSPFILEのみ適用されるためインスタンス再起動後に変更した設定が適用される
(d)SCOPE句にSPFILEを指定していないためエラーとなる
まず初期化パラメータファイルはデフォルトでバイナリ形式のサーバー・パラメータ・ファイル(SPFILE)が使用され、パラメータ変更はalter system文を使って行います。以下がその構文です。
ALTER SYSTEM SET <パラメータ名>=<値> [SCOPE={BOTH, MEMORY, SPFILE}];
SCOPE句にBOTHを指定すると、稼働中インスタンスのパラメータ値とサーバー・パラメータ・ファイルの両方を変更します。MEMORYを指定した場合は稼動中インスタンスのパラメータ値の変更のみ行いますので、インスタンスの再起動を行うと変更前のパラメータ値に戻ります。逆にSPFILEを指定した場合はサーバー・パラメータ・ファイル内のみ設定変更を行うので、次回インスタンス起動時に設定が有効となります。SCOPEを省略した場合は、BOTHと同じ動作となります。
もう1つ初期化パラメータについて押さえる内容として、初期化パラメータにはインスタンス稼働中でも動的に変更できるものと、再起動時のみ変更を反映できる静的なものがあるということです。静的なパラメータについてはSCOPE=SPFILEという指定が必要になるというわけですね。では選択肢を確認していきましょう。実行しているSQL文にSCOPE句がありませんので、SCOPE=BOTHと同じ動作になります。選択肢(a)はSCOPE=MEMORYを説明しているので誤りです。選択肢(b)がSCOPE=BOTHの説明となり、shared_pool_sizeパラメータは動的なパラメータとなるため、これが正解です。選択肢(c)はSCOPE=SPFILEの説明ですね。動的なパラメータ変更なので、選択肢(d)のようにエラーにはなりません。よって、正解は(b)になります。
今回は、リスナー経由の接続とOracleインスタンスの管理について学習しました。今回の講義内では「絵を描いて理解する」という新しい学習法を紹介しましたので、ぜひこれまでの「実機で検証して確認」とともに実践してください。「リモート接続は?」「インスタンスとは?」と質問されたときに、パッと絵が書けて説明ができるぐらいになりましょう。
次回は「記憶域構造の管理」をメインにお話をしていきます。それではまた次回にお会いしましょう!
* OracleとJavaは、Oracle Corporation及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。