あなたは実際にセッションを殺していますか?

日常の運用および保守プロセスでは、セッションの強制終了は不可欠なスキルです. 最も一般的に使用されるシナリオ -> ロックの強制終了, 2 つの主な処理方法があります:

1) オペレーティング システム レベルでプロセスを強制終了します。

2) データベース レベルでシステム キル セッションを変更する

(適用強制出口は2番目のものと同様です)

おそらく誰もが、データベース レベルで開始されたシステム変更の強制終了セッションに遭遇したことがあるでしょう.多くの場合、リソースは時間内に解放されず、セッションは常に強制終了された状態になります.このセッションがロックのソースである場合、良い方法はありません. PMON プロセスがそれをクリアするのを待ちます。オペレーティング システム レベルでプロセスを強制終了する方法は、基本的に 100 回のテストです。

有没有更简便高效的方法呢?对于第一种方式真的只能等着PMON来清理,就没别的方法了?

ここに画像の説明を挿入
もちろん、そうではありません。以下に、クイック クリーンアップ ステータスが強制終了された 2 種類のセッションを示します。

方法 1:

状態が強制終了されたセッションを見つけ、alter system kill 'sid,serial#' immediate コマンドを使用してすばやくクリーンアップします。コマンドは次のとおりです。

alter system kill session 'sid,.serial#' immediate;

スプライシングステートメントは次のとおりです。

select 'alter system kill session '''||sid||','||serial#||'''  immediate;'  from v$session c where status='KILLED';

rac の場合は、対応するノード番号を追加します。

select 'alter system kill session '''||sid||','||serial#||',@'||c.inst_id||'''  immediate;'  from v$session c where status='KILLED';

方法 2:

次のコマンドを使用して、これらのセッションに対応するシステム spid を見つけます。

select username, spid, program, 'kill -9 ' || spid
from v$process a
where a.addr in (select p.addr from v$process p where pid <> 1 minus select s.paddr from v$session s) 
and a.PNAME is null;

日常の操作とメンテナンスでは、上記の 2 つの方法でセッションをすばやくクリアできます。システム コマンド kill -9 を使用してプロセスを強制終了すると、システムはプロセスに sigkill を送信し、sigkill シグナルが init プロセスに直接送信されてプロセスを終了します。このメソッドは、ORACLE セッションに対応するプロセスを直接終了し、リソースを直接解放できます。

ここでは、alter system kill session プロセスの詳細な説明と、alter system kill session がセッションを kill した後、killed 状態のセッションに対応するシステム プロセス spid が見つからない理由について説明します。

システム キル セッションの変更 (即時) キル セッションの変更は、次の 2 つのシナリオで説明できます。

1. セッション状態はアクティブです

このコマンドを使用してアクティブなセッションを強制終了する場合、プロセスは次のように要約できます:
セッションが終了シグナルを受信した後、セッションはロールバックします. このプロセスは中断できません. セッションはプロセスが完了するまですべてのリソースを所有します.セッションは ORA-00028: Your session has been kill 情報を受け取り、PMON はセッションをクリーンアップし、リソースを解放します。
上記のアクションが 1 分経っても完了しない場合、セッションは強制終了としてマークされ、セッションが所有するリソースは解放されず、PMON プロセスがセッションをクリーンアップするのを待ちます。

1. セッション状態は非アクティブです

このコマンドを使用して非アクティブ状態のセッションを強制終了する場合のプロセスは、次のように簡単に要約されます
。セッションをクリーンアップする PMON プロセス。
セッションがクエリ シグナルを再度送信すると、セッションは ORA-00028: your session has been kill というメッセージを受け取り、PMON がセッションをクリーンアップし、リソースが解放されます。

那为何被标记为killed状态的会话,使用以下语句查不到对应会话对应在系统层面真实的spid呢?

select b.sid, b.serial#, c.spid, b.status
from v$session b, v$process c
where b.paddr = c.paddr
and b.sid = &sid;

ここに画像の説明を挿入
ここにあなたのための小さな実験があります:

セッション 1:
ここに画像の説明を挿入
セッション 2:
ここに画像の説明を挿入
セッション 3:
ここに画像の説明を挿入
これら 2 つのセッションを手動で強制終了します。
ここに画像の説明を挿入
これら 2 つのセッションのステータスを再度クエリします。
ここに画像の説明を挿入
このことから、2 つのセッションのステータスが強制終了されると、それらのセッション paddr が同じアドレス 00000000F26EBDA8 (仮想このアドレスには、オペレーティング システム レベルで対応する spid がありません。そのため、次のクエリに示すように、セッションが KILLED 状態に設定された後、次のステートメントを使用して spid を見つけることができません。
ここに画像の説明を挿入
この時点で、前のクエリ ステートメントを使用して、セッションを強制終了およびクリーンアップできます。
ここに画像の説明を挿入

ここに画像の説明を挿入


原文:公開アカウント【新規運用保守 新データ】運用保守日記 | セッションのスキャンと強制終了の方法を本当に知っていますか?

おすすめ

転載: blog.csdn.net/Ruishine/article/details/129879493