📗

Oracleの接続とサーバプロセスの生成について

2023/06/28に公開

Oracleへの接続とサーバプロセスの生成について

こんにちは!わいわわです。
引き続き、Oracleの学習を進めています。
本日はアプリケーションからOracleへの接続と、
サーバプロセスの生成に関して理解を深めていきます!

ソケットの動作イメージ

Oracleはネットワークの通信手段として、
多くの場合にTCP/IPのソケットを使用します。

ソケットをイメージすれば「電話」になります。
クライアントマシンやサーバーマシンがプロセス同士で、
ソケットを使って通信しているイメージです。

プロセスからすれば一度ソケットを作ってしまえばソケットに対して
読み書きをするだけで送受信ができるため、便利な機能です。
実際の送受信はネットワークのドライバやOSのライブラリが行います。

ネットワークには複数のソケットが存在し、
アドレスポート番号と呼ばれる番号の組み合わせでソケットは識別できます。
接続の際は送信側がアドレスと待っているポートの2つを指定しなければいけません。

Oracleでのソケットの動作

Oracleでは受信待ちしているプロセスをリスナーといいます。
データベースサーバーに属しており、
受信した内容をサーバープロセスに伝える(生成)します。

リスナーの起動

リスナーは1つで複数のデータベースを案内できます。
ふつうは1つのリスナーで1つのデータベースを担当することが多いです。

Oraclenの場合、リスナーのポート番号として通常は1521番を使いますが
他のアプリケーションとぶつかる場合には別の番号を使ってもかまいません。

ツールは「lsnrctl」というものを使って起動します。
リスナーが接続するデータベースを知る方法としては
listener.oraファイルに書かれている設定を読むか
データベースからの自動登録の2通りがあり、通常は簡単な自動登録を選ぶことが多いです。

ここまでできるといつでもソケット鵜を通して通信ができます!

業務アプリケーション側からの接続

業務アプリケーション側からの接続では、
業務アプリケーションの中で接続の命令が実行された場合や
SQL*Plusでconnectコマンドが実行された場合に接続が起きます。

ここではまず必要な情報をOracleクライアントに渡す必要があります。
その情報を「接続記述子」といいます。
アドレスやポート、サービス名などの記載があります。

毎回接続記述子を作成することは大変なため、
通常はtnsnamse.oraという場所に接続記述子を載せておいて、
それに対する短縮名をつけて渡します。

なので実際には接続識別子(短縮名)をOraclenクライアントへ渡す形になります。

サーバープロセスの生成

最後はサーバープロセスの生成とソケットの引継ぎです。
ソケットを作成したらリスナーがそのままSQL処理を行ってもよさそうなものですが、
SQL処理を始めるとその処理にかかりっきりになってしまうため、
サーバープロセスを生成して処理を引き継ぐイメージです。

サーバープロセスの生成はかなり大変な作業で
・OS上にプロセスを生成する
・サーバープロセスが共有メモリを使えるようにする
・サーバープロセス用のメモリを確保する
・さらにデータベース内部の処理もある
そのため、1回のサーバープロセスの生成はかなりCPU時間を使用します。

引き継いだ後はサーバープロセスとOracleクライアントが直接やり取りをし、
ここまでいくとリスナーは自由になります。
並列処理が可能になるということですね!

データベースサーバー側の動作

この後はデータベースサーバー側へ通信することになります。
その際にエラーが出ることがあるため、
ありがちなエラーやミスをまとめます!

エラーの表記は「ORA-12154:TNS xxxxxx 」
のような形でうまく接続できないことがあります。

エラーの一覧

・接続先ホスト名(IP)を誤っている
tnsnamse.oraファイルで設定しているため、
pingコマンドで接続先ホストと通信できることを確認する必要があります。

・tnsnamse.oraが適切なディレクトリに配置されていない
正しいディレクトリに配置していることを確認します。

・tnsnames.oraの定義と異なる接続識別子で接続する

・リスナーが起動していない

・リスナーにサービス名が登録されていない
リスナー起動直母はサービス名が自動登録されていないことがあります。
少し待つか、データベースでサービス名登録のコマンドを実行します。

電源やLANケーブルなどの基本的な部分もごくまれにあります。
エラーが発生しても焦らずに原因を切り分けていくことが大事ですね。

停止やリスナーの状態確認

各プロセスの停止やリスナーの状態確認についてです。
アプリケーション側で接続終了の処理をするとサーバープロセスも終了します。
これが通常のサーバープロセスの終了方法です。

リスナーの停止に関して、リスナーはlsnrctlコマンドで停止が可能です。
また、lsnrctlのstatusコマンドで現在のリスナーの稼働状態や
listenしているポートの番号、保持しているデータベースの情報が分かります。
接続できないなどのトラブルが起きた際には活用ができます。

強制的に切断するコマンド

何かの問題やエラーからアプリケーションの処理全体を止めたりしないよう
いざというときにはこのコマンドでセッションを切ることができます。

alter system kill session ... ;

まとめ

今回学んだことをまとめます。
・接続のためにはデータベースサーバーのアドレス、リスナーのポート番号が必要
・tnsnames.oraというファイルに接続のための情報を書いておく
・リスナーというプロセスが接続要求を受け付ける。サーバープロセスの生成も行なう
・listener.oraというファイルにリスナーの設定(ポート番号など)を書いておく
・サーバープロセスの生成は非常に重いため、できる限り減らすことが大切

所感

本日はOracleへの接続とサーバプロセスの生成について学習しました。
イメージをつかむことができたので実務でOracleを使用する際も
どのように設定するとSQLの処理がうまくいくか、なんとなくわかった気がします。
引き続き学習を進めていきます!

Discussion