Oracleデータベースサービスを再起動するよりも、すべてのユーザーをOracle 10gデータベーススキーマから強制的に切断するより良い方法はありますか?
SQL Developerを使用して、単一のOracle 10gサーバー上の同じスキーマに接続する開発者が数人います。問題は、スキーマを削除して再構築する場合、必然的に誰かがまだ接続しているため、誰かがまだ接続している間はデータベーススキーマまたはユーザーを削除できないことです。
同様に、他のスキーマへのすべての接続をドロップしたくありません。なぜなら、他の人がまだ接続されていて、それらのスキーマでテストしているからです。
誰でもこれを解決する簡単な方法を知っていますか?
セッションを見つけるには、DBAとして使用します
select sid,serial# from v$session where username = '<your_schema>'
SQL Developerを使用するセッションのみを取得したい場合は、and program = 'SQL Developer'
を追加できます。特定の開発者に属するセッションのみを終了する場合は、os_user
に制限を追加できます
そして、それらを殺します
alter system kill session '<sid>,<serial#>'
(例:
alter system kill session '39,1232'
)
既製のキルステートメントを生成するクエリは、
select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'
これにより、そのユーザーのセッションごとに1つのkillステートメントが返されます。
alter system kill session '375,64855';
alter system kill session '346,53146';
このクエリを使用して、DBへの既存のセッションを検索します。
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
以下のようなものが表示されます。
次に、上記の結果から抽出された値で以下のクエリを実行します。
ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>';
例:ALTER SYSTEM KILL SESSION '93、943 ';
私の提案は、この単純な匿名ブロックです。
DECLARE
lc_username VARCHAR2 (32) := 'user-name-to-kill-here';
BEGIN
FOR ln_cur IN (SELECT sid, serial# FROM v$session WHERE username = lc_username)
LOOP
EXECUTE IMMEDIATE ('ALTER SYSTEM KILL SESSION ''' || ln_cur.sid || ',' || ln_cur.serial# || ''' IMMEDIATE');
END LOOP;
END;
/
強制終了する前にシステムを変更し、制限されたセッションを有効にしてください。そうしないと、作業を完了する前にデータベースにすばやくログインしてしまいます。
sQLを使用するだけです。
disconnect;
conn tiger/scott as sysdba;
ALTER SYSTEM KILL SESSIONを試しましたか?指定されたスキーマの各セッションのV $ SESSIONからSIDとSERIAL#を取得し、実行します
ALTER SCHEMA KILL SESSION sid、serial#;
ちょうど私の2セント:最良の方法(ただし、短期的にはおそらく最速ではありません)は、おそらく各開発者が自分のデータベースインスタンスで作業することです( rule#1 for database work )。
Oracle Database 10g Express Edition 以来、開発者ステーションへのOracleのインストールは非常に簡単になりました。