Database Support Blog

Database Support Blog>【Oracle Database】SHUTDOWN IMMEDIATE実行前に本当は確認すべきこと

  • Oracle Database
2017.08.30

【Oracle Database】SHUTDOWN IMMEDIATE実行前に本当は確認すべきこと

SHUTDOWN IMMEDIATE実行前に本当は確認すべきこと

なぜSHUTDOWN IMMEDIATEが終わらないのか?

SHUTDOWN IMMEDIATEコマンドでのデータベースのシャットダウンが、「終わらない」、「データベースが停止しない」、「タイムアウトエラー(ORA-01013等)が発生し失敗する」というお問い合わせをいただくことがあります。

SHUTDOWN IMMEDIATEは、「IMMEDIATE(即時の)」の名の通り、即時に停止されそうに思えますが、処理実行中のアクティブなセッションが存在した場合は、処理の完了を待機するのです。この待機が1時間を超えるとSHUTDOWN IMMEDIATEはタイムアウトしてしまい、「ORA-01013: ユーザーによって現行の操作の取消しがリクエストされました」が記録されます。

そこで、SHUTDOWN IMMEDIATEの実行前には、予めセッション情報を確認することをおすすめしています。今回はその点について詳しくご紹介します。

SHUTDOWN IMMEDIATEについて

管理者ガイド では、SHUTDOWN IMMEDIATEについて次のように説明されています。

  • 新しい接続は許可されず、新しいトランザクションは開始できません。
  • すべての未コミットのトランザクションは、ロールバックされます。
  • 現在データベースに接続しているユーザーが切断されるのを待機しません。

SHUTDOWN IMMEDIATEは既存の接続を全て切断しますが、SQL実行中やロールバック中などのアクティブなセッションが存在すると、その完了を待機します。

待機時間が1時間を超えると、SHUTDOWN IMMEDIATEはタイムアウトして失敗します。セッションが残っていることが原因でシャットダウンがタイムアウトした場合、プロンプトにはORA-01013が返り、アラートログには以下のようにメッセージが出力されます。

    Wed Mar 22 04:19:12 2017
    Shutting down instance (immediate)
    Stopping background process SMCO
    Shutting down instance: further logons disabled
    Wed Mar 22 04:19:13 2017
    Stopping background process CJQ0
    Stopping background process QMNC
    Stopping background process MMNL
    Stopping background process MMON
    License high water mark = 3
    Wed Mar 22 04:24:15 2017
    Active process 7628 user 'SYSTEM' program 'ORACLE.EXE (SHAD)' ★
    SHUTDOWN: waiting for logins to complete.


このログ出力で示されたセッションが実行している処理を確認することは、新規セッションが既に接続できない状態であるため困難です。

そのため、SHUTDOWNコマンドを実行する前に、セッションの残留や処理実行中のセッションが存在しないか、予め確認しておくことをおすすめします。

SHUTDONW IMMEDIATE実行前にセッション情報を確認しよう

シャットダウンを正常に完了させるために、事前にアクティブなセッションが存在しないか確認しましょう。存在していた場合は処理内容を確認した上で、対応を検討します。下記のSQLで、現在データベースに存在しているセッションや実行中のSQLを確認できます。

  SQL> SELECT
    2    sid,
    3    serial#,
    4    username,
    5    status,
    6    machine,
    7    program,
    8    sql_id
    9  FROM v$session 
   10  WHERE username IS NOT NULL
   11    and sid != USERENV('SID');

SID SERIAL# USERNAME STATUS MACHINE PROGRAM SQL_ID ---------- ---------- ----------- -------- -------------------- ------------- ------------- 131 15 SCOTT INACTIVE ACE\B1401-02-25-W sqlplus.exe 197 5 SCOTT ACTIVE ACE\B1401-02-25-W sqlplus.exe 44ff5y395s8na


この状態で、SHUTDOWN IMMEDIATEを実行した場合、SID:131は「STATUS = INACTIVE」であり、強制的に切断されるため対処は不要です。しかし、SID:197は「STATUS = ACTIVE」であり、SQL_ID:44ff5y395s8naのSQLを実行しているため、この処理の完了を待つか手動で停止する必要があります。

SQL_ID:44ff5y395s8naの処理内容を確認するには次のSQLを実行します。

  SQL> SELECT
    2    sql_text
    3  FROM v$sqltext 
    4  WHERE sql_id='44ff5y395s8na';

SQL_TEXT ---------------------------------------------------------------- update test set col = '2' where col='1'


SQL文を確認の上で処理の終了を待つ、または停止しても問題ない処理であれば「ALTER SYSTEM KILL SESSION」で停止し、Activeなセッションが存在しない状態でSHUTDOWN IMMEDIATEを実行しましょう。
※「ALTER SYSTEM KILL SESSION」のIMMEDIATE句はORACLE 10g以降のオプションです。

  SQL> ALTER SYSTEM KILL SESSION '&SID,&SERIAL#' IMMEDIATE;

上記SQL実行後も該当のセッションがKILLされない場合は、SPIDを確認してOSコマンドでプロセスをKILLすることも検討しましょう。

  SQL> SELECT
    2    s.sid,
    3    s.serial#,
    4    p.spid,
    5    s.username,
    6    s.status,
    7    s.machine,
    8    s.program,
    9    s.sql_id
   10  FROM  v$process p, v$session s
   11  WHERE p.addr=s.paddr 
   12    and s.username IS NOT NULL
   13    and s.sid != USERENV('SID');

SID SERIAL# SPID USERNAME STATUS MACHINE PROGRAM SQL_ID ---------- ---------- ------- ---------- -------- ----------------- -------------- ------------- 197 36743 9352 SCOTT INACTIVE ACE\B1702-53-01 sqlplus.exe 44ff5y395s8na

まとめ

SHUTDOWN IMMEDIATEに時間がかかる、データベースが停止しないというお問い合わせをいただくことは少なくありませんが、タイムアウト後にお問い合わせをいただいても、原因となったセッションや処理内容を特定できない場合があります。

今回ご紹介した方法により、SHUTDOWN IMMEDIATE実行前に予めセッション情報をご確認いただくことで予防ができます。データベース停止の際にはぜひご確認をお願いします。

筆者情報

山口 一晟

アシスト北海道

2014年、設立されて間もないアシスト北海道に入社し、以来サポートセンターの立ち上げに従事。現在は夜間休日のOracle製品担当サポートリーダーとして重篤障害と格闘する毎日。アシスト北海道の2017年度従業員代表としても活動中。

関連している記事

  • Oracle Database
2017.10.10

【Oracle Database】ユーザが使用可能なCPUリソースを制限する方法

ユーザが使用可能なCPUリソースを制限する方法として、プロファイルとResouce Manager(Maximum Utilization Limit)を紹介します。

  • Oracle Database
2017.06.05

【Oracle Database】一時表領域を使用していたセッションを調べる方法

一時表領域を使用していたセッションを調べる方法を3つ紹介します。「ORA-01652:一時セグメントを拡張できません」のエラー発生時等に一時表領域の使用状況を調べる必要があります。

  • Oracle Database
2017.03.22

【Oracle Database】メモリを使用しているセッションを調べる方法

Oracle Databaseで、メモリを使用しているセッションの確認方法を2つ紹介します。

アシストサポートセンターのご紹介 Oracle Database研修

ページの先頭へ戻る