Есть ли лучший способ принудительно отключить всех пользователей от схемы базы данных Oracle 10g, чем перезапустить службы баз данных Oracle?
У нас есть несколько разработчиков, использующих 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>'
Это приведет к возврату одного оператора убийства за сеанс для этого пользователя - что-то вроде:
alter system kill session '375,64855';
alter system kill session '346,53146';
Найти существующие сеансы в БД с помощью этого запроса:
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) := 'your user name 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;
Убедитесь, что вы изменили систему и включили ограниченный сеанс перед тем, как убить их, или они быстро вернутся в базу данных, прежде чем завершить свою работу.
Только мои два цента: лучший способ (но, вероятно, не самый быстрый в краткосрочной перспективе), вероятно, будет для каждого разработчика работать над собственным экземпляром базы данных (см. правило №1 для работы с базой данных).
Установка Oracle на станции-разработчике стала без проблем с Oracle Database 10g Express Edition.
Вы пробовали ALTER SYSTEM KILL SESSION? Получите SID и SERIAL # из V $SESSION для каждого сеанса в данной схеме, затем выполните
ALTER SCHEMA KILL SESSION sid, серийный номер;;
select 'alter system kill session ''' || sid || ',' || serial# || ''' immediate;' from v$session where username = '<your_schema>';
это заставит команду