\n以下のような検索結果が出てきます。
\n
\"\"
\"\"/

\nここで、列説明をすると(英語の通りですが)、
\nRESOURCE_NAMEはリソース名(おそらく、processes:プロセスとsessions:セッションが出てくるはずです)、
\nCURRENT_UTILIZATIONは現在使用数
\nMAX_UTILIZATIONは最大使用数
\nLIMIT_VALUEは上限値です。\n
  • 検索結果を確認
    \nこのとき、セッション数の現在使用数または最大使用数が上限値と同じもしくは近い場合は、セッション数不足ということがわかります。もし、そうでない場合は別の要因が考えられますので、残念ながらここでは解決できません。。
    \nセッション数不足の対応としては、当たり前ではありますが、セッション上限を増やすか/不要なセッションを消す(終了させる/殺す)という手段があります。どちらを選択すべきかはサーバ性能などにも依りますので一概には言えません。しかし、あくまで方針として言えば、以下を判断基準としてもよいと思います。

    \n
      \n
    1. 定常的に使用するセッション数よりも過小に設定されてたり、サーバの性能(特にメモリ)に余裕があるのであればセッション上限を増やす
    2. \n
    3. アプリが異常終了してしまったことによる不要なセッションが大量に発生してしまったのが分かっていたり、取り急ぎアプリをDBアクセスしたい場合などはセッションを消す
    4. \n
    \n
  • \n\n

    Ⅲ-a. セッション上限を増やす

    \n
      \n
    1. セッション上限のパラメータがどこで定義されているか
      \nOracleのインスタンスを起動するときにこのセッション上限が決められるわけですが、その設定情報がどう定義されるかは2パターンあるため、まずどちらで定義されているかを確認する必要があります。

      \n\n
    2. \n
    3. 定義情報の確認方法
      \nsqlplusで以下を実行し、結果のVALUE列に、nullであればpfile、パスの情報があればSPFILEということがわかります。
      \n
      \n実行例:
      \n
      \"\"
      \"\"/

      \n
        \n
      1. pfileの場合
        \nOracle公式のこちらを参照してください。
      2. \n
      3. SPFILEの場合
        \n以下のDDLを実行します。ここでは”500″を指定していますので、適宜必要な数字に変更してください。
        \nまた、ロールバックができないことに留意してください。
        \n
        \n実行例:
        \n
        \"\"
        \"\"/

        \nこれで完了です。scopeにBOTHを指定していますので、SPFILEにも現在実行中のDBインスタンスにも即時反映されていますので、DB再起動は不要です。
      4. \n
      \n
    4. \n
    \n

    Ⅲ-b. 不要なセッションを削除する

    \n
      \n
    1. 詳細なセッション一覧を検索する
      \n以下のSQLを実行して、削除に必要な情報を取得します。
      \n
      \n以下のような結果が取得されると思います(一部抜粋&マスキングしてます)
      \n
      \"\"
      \"\"/

      \nこれらの中から削除対象を選びます。これらは自己責任でお願いします。判断基準としては、ログイン日時が古かったり、対象のユーザで特定したりなどかと思われます。
      \n削除に必要な情報は、”SID”と”SERIAL#”です。
    2. \n
    3. セッションを削除する
      \n上記で削除したいセッションが特定できていれば、以下のSQLで削除します。繰り返しになりますが、自己責任で。
      \nまた、DDL文でもありますので、ロールバックができないことにも留意してください。
      \n
      \n実行例:
      \n
      \"\"
      \"\"/
    4. \n
    \n

    参考

    \n

    http://out2dev.blogspot.jp/2012/03/ora-12516.html

    \n

    https://sql-oracle.com/?p=395

    \n

    http://at-j.co.jp/blog/?p=5468

    \n","datePublished":"2018/06/07","dateModified":"2018/06/07","mainEntityOfPage":{"@type":"WebPage","@id":"https://sun0range.tech.server-on.net/information-technology/ora-12516"},"author":[{"@type":"Person","name":"nisioka","description":"オレンジ好きの中で最強のエンジニアになりたい。","url":"https://sun0range.tech.server-on.net","sameAs":["nisioka55","nisioka"]}],"publisher":{"@type":"Organization","name":"分かりやすい技術ブログ","description":"誰にでも分かりやすいをモットーに、IT技術的な内容を投稿するブログです。","logo":{"@type":"ImageObject","url":"https://sun0range.tech.server-on.net/favicon.webp","width":512,"height":512}}}]

    Oracle DBのセッションを増やすor強制終了する【ORA-12516対応】

    Oracle DBのセッションを増やすor強制終了する【ORA-12516対応】
    カテゴリ
    技術
    タグ
    database
    ORA-12516
    oracle
    proceses
    session

    ここでは、Oracle DBのセッションを強制終了する手順を説明します。

    強制終了しなければならない状況は色々とあるとは思いますが、以下のエラーが発生した場合なんかもそうかと思います。

    ORA-12516: TNS: リスナーは、一致するプロトコル・スタックが使用可能なハンドラを検出できませんでした。

    このエラーメッセージはかなりわかりにくいですね。意訳すると、「接続可能なリスナーが見つかりません」ぐらいでしょうか。基本的に処理が完了したら接続は開放されるのですが、異常終了した場合など、ゾンビ化して残り続けることがたまにあるようです(ただし1~2時間で切れるよう)。もし、頻発するようであれば切断処理に何かしらの問題があるやもしれません。

    手順

    Ⅰ. sqlplusでsysdba権限でOracleにログインする

    DBがどこにあるかによるので、以下のいづれかの方法でsqlplusにログインしてください。

    1. ローカルにDBがある場合
      sqlplus sys/パスワード as sysdba
    2. 外部サーバにDBがある場合
      sqlplus sys/パスワード@データベース接続子 as sysdba
      ここで、データベース接続子の記述方法についてもパターンがあります。

      1. 「ホスト名:ポート番号/サービス名」の直接指定
        例)@192.168.1.1:1521/orcl
      2. tnsnames.oraに接続定義されている場合
        例)@SAMPLE

        # tnsnames.ora
        SAMPLE =
          (DESCRIPTION =
            (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
            (CONNECT_DATA =
              (SERVICE_NAME = orcl)
            )
          )

    Ⅱ. V$RESOURCE_LIMITを検索して、セッション数を確認する

    以下をsqlplusで実行します。

    1. 表示幅を増やす
      場合によっては必要ないかもしれませんが、表示幅が長くなって表が崩れる可能性があるため、行サイズをとりあえず500にします。
      set linesize 500
    2. V$RESOURCE_LIMITを検索します

      以下のような検索結果が出てきます。

      ここで、列説明をすると(英語の通りですが)、
      RESOURCE_NAMEはリソース名(おそらく、processes:プロセスとsessions:セッションが出てくるはずです)、
      CURRENT_UTILIZATIONは現在使用数
      MAX_UTILIZATIONは最大使用数
      LIMIT_VALUEは上限値です。
    3. 検索結果を確認
      このとき、セッション数の現在使用数または最大使用数が上限値と同じもしくは近い場合は、セッション数不足ということがわかります。もし、そうでない場合は別の要因が考えられますので、残念ながらここでは解決できません。。
      セッション数不足の対応としては、当たり前ではありますが、セッション上限を増やすか/不要なセッションを消す(終了させる/殺す)という手段があります。どちらを選択すべきかはサーバ性能などにも依りますので一概には言えません。しかし、あくまで方針として言えば、以下を判断基準としてもよいと思います。

      1. 定常的に使用するセッション数よりも過小に設定されてたり、サーバの性能(特にメモリ)に余裕があるのであればセッション上限を増やす
      2. アプリが異常終了してしまったことによる不要なセッションが大量に発生してしまったのが分かっていたり、取り急ぎアプリをDBアクセスしたい場合などはセッションを消す

    Ⅲ-a. セッション上限を増やす

    1. セッション上限のパラメータがどこで定義されているか
      Oracleのインスタンスを起動するときにこのセッション上限が決められるわけですが、その設定情報がどう定義されるかは2パターンあるため、まずどちらで定義されているかを確認する必要があります。

      • pfile:テキスト形式の初期化パラメータファイル
      • SPFILE:バイナリ形式のサーバパラメータファイル
    2. 定義情報の確認方法
      sqlplusで以下を実行し、結果のVALUE列に、nullであればpfile、パスの情報があればSPFILEということがわかります。

      実行例:

      1. pfileの場合
        Oracle公式のこちらを参照してください。
      2. SPFILEの場合
        以下のDDLを実行します。ここでは”500″を指定していますので、適宜必要な数字に変更してください。
        また、ロールバックができないことに留意してください。

        実行例:

        これで完了です。scopeにBOTHを指定していますので、SPFILEにも現在実行中のDBインスタンスにも即時反映されていますので、DB再起動は不要です。

    Ⅲ-b. 不要なセッションを削除する

    1. 詳細なセッション一覧を検索する
      以下のSQLを実行して、削除に必要な情報を取得します。

      以下のような結果が取得されると思います(一部抜粋&マスキングしてます)

      これらの中から削除対象を選びます。これらは自己責任でお願いします。判断基準としては、ログイン日時が古かったり、対象のユーザで特定したりなどかと思われます。
      削除に必要な情報は、”SID”と”SERIAL#”です。
    2. セッションを削除する
      上記で削除したいセッションが特定できていれば、以下のSQLで削除します。繰り返しになりますが、自己責任で。
      また、DDL文でもありますので、ロールバックができないことにも留意してください。

      実行例:

    参考

    http://out2dev.blogspot.jp/2012/03/ora-12516.html

    https://sql-oracle.com/?p=395

    http://at-j.co.jp/blog/?p=5468


    関連記事

    1. 平日や営業日を取得するSQL(Postgress/Oracle)

      業務を行う上では、休日を除いた日付を取得したいことがあるかと思います。 これが地味に難しいですが、そこそこキレイに取得できたので紹介します。 当然ですが、祝日を除いた営業日を取得したい場合は、「祝日マスタ」のようなテーブ […]

    2. Oracleの権限テーブル(DBA_TAB_PRIVS)のバージョン差異

      oracle DBでは、権限テーブルをDBA_TAB_PRIVS(USER_TAB_PRIVSも同様)で確認できるが、バージョン11g→12cで列追加の変更があった。しかし、公式でそのことを明記しているのが見つからなかっ […]

    3. OracleDBの無効オブジェクトを調査する方法

      背景 DBインスタンスのダンプを取得して移行を行ったのですが、なぜか無効なオブジェクトがいくつか発生してDBが上手く動かなくなってしまったためです。 原因究明はできていませんが、もし同様にDBのオブジェクトが無効になって […]

    4. Oracle DBのセッションを増やすor強制終了する【ORA-12516対応】

      ここでは、Oracle DBのセッションを強制終了する手順を説明します。 強制終了しなければならない状況は色々とあるとは思いますが、以下のエラーが発生した場合なんかもそうかと思います。 ORA-12516: TNS: リ […]