registros - eliminar todas las tablas oracle 11g
¿Cómo puedo eliminar todas las sesiones que se conectan a mi base de datos Oracle? (10)
Antes de matar sesiones, si es posible, hazlo
ALTER SYSTEM ENABLE RESTRICTED SESSION;
para evitar que nuevas sesiones se conecten
Necesito matar (y forzar) rápidamente todas las sesiones externas que se conectan a mi base de datos Oracle sin la supervisión y el administrador.
No quiero simplemente bloquear la base de datos y dejar que los usuarios salgan con elegancia.
¿Cómo puedo escribir esto?
Como SYS:
startup force;
Brutal, pero elegante.
Encontré el siguiente fragmento útil. Tomado de: http://jeromeblog-jerome.blogspot.com/2007/10/how-to-unlock-record-on-oracle.html
select
owner||''.''||object_name obj ,
oracle_username||'' (''||s.status||'')'' oruser ,
os_user_name osuser ,
machine computer ,
l.process unix ,
s.sid||'',''||s.serial# ss ,
r.name rs ,
to_char(s.logon_time,''yyyy/mm/dd hh24:mi:ss'') time
from v$locked_object l ,
dba_objects o ,
v$session s ,
v$transaction t ,
v$rollname r
where l.object_id = o.object_id
and s.sid=l.session_id
and s.taddr=t.addr
and t.xidusn=r.usn
order by osuser, ss, obj
;
Luego corrió:
Alter System Kill Session ''<value from ss above>''
;
Para matar sesiones individuales.
Esta respuesta está muy influenciada por una conversación aquí: http://www.tek-tips.com/viewthread.cfm?qid=1395151&page=3
ALTER SYSTEM ENABLE RESTRICTED SESSION;
begin
for x in (
select Sid, Serial#, machine, program
from v$session
where
machine <> ''MyDatabaseServerName''
) loop
execute immediate ''Alter System Kill Session ''''''|| x.Sid
|| '','' || x.Serial# || '''''' IMMEDIATE'';
end loop;
end;
Me salteo las sesiones asesinas que se originan en el servidor de la base de datos para evitar matar las conexiones de Oracle consigo mismo.
He estado usando algo como esto por un tiempo para matar mis sesiones en un servidor compartido. La primera línea del ''dónde'' se puede eliminar para eliminar todas las sesiones que no sean ''sys'':
BEGIN
FOR c IN (
SELECT s.sid, s.serial#
FROM v$session s
WHERE (s.Osuser = ''MyUser'' or s.MACHINE = ''MyNtDomain/MyMachineName'')
AND s.USERNAME <> ''SYS''
AND s.STATUS <> ''KILLED''
)
LOOP
EXECUTE IMMEDIATE ''alter system kill session '''''' || c.sid || '','' || c.serial# || '''''''';
END LOOP;
END;
Para responder a la pregunta, este es el SQL más preciso para realizar el trabajo, puede combinarlo con un bucle PL / SQL para ejecutar realmente sentencias kill:
select ses.USERNAME,
substr(MACHINE,1,10) as MACHINE,
substr(module,1,25) as module,
status,
''alter system kill session ''''''||SID||'',''||ses.SERIAL#||'''''';'' as kill
from v$session ses LEFT OUTER JOIN v$process p ON (ses.paddr=p.addr)
where schemaname <> ''SYS''
and not exists
(select 1
from DBA_ROLE_PRIVS
where GRANTED_ROLE=''DBA''
and schemaname=grantee)
and machine!=''yourlocalhostname''
order by LAST_CALL_ET desc;
Si Oracle se ejecuta en Unix / Linux, podemos grep para todas las conexiones de clientes y matarlo
grep todo el proceso del cliente de Oracle:
ps -ef | grep LOCAL = NO | grep -v grep | awk ''{print $ 2}'' | wc -l
Matar a todos los procesos del cliente de Oracle:
matar -9 ps -ef | grep LOCAL=NO | grep -v grep | awk ''{print $2}''
ps -ef | grep LOCAL=NO | grep -v grep | awk ''{print $2}''
Si desea evitar que nuevos usuarios se conecten, pero permite que las sesiones actuales continúen hasta que estén inactivas, puede poner la base de datos en modo QUIESCE:
ALTER SYSTEM QUIESCE RESTRICTED;
De la Guía del administrador de la base de datos Oracle :
Las sesiones activas que no son DBA continuarán hasta que se vuelvan inactivas. Una sesión activa es aquella que se encuentra actualmente dentro de una transacción, una consulta, una búsqueda o una instrucción PL / SQL; o una sesión que actualmente tiene recursos compartidos (por ejemplo, enqueues). No se permite que ninguna sesión inactiva se active ... Una vez que todas las sesiones que no son de DBA se vuelven inactivas, la instrucción ALTER SYSTEM QUIESCE RESTRICTED se completa y la base de datos se encuentra en estado inactivo.
información adicional
Cambios importantes de Oracle 11g para alterar la sesión de muerte de la sesión
El autor de Oracle Mladen Gogala señala que ahora se requiere un signo @ para matar una sesión cuando se usa la columna inst_id:
alter system kill session ''130,620,@1'';
Intente desencadenar al iniciar sesión
Insistido en intentar desconectar a los usuarios, no debes permitir que se conecten.
Hay un ejemplo de tal disparador.
CREATE OR REPLACE TRIGGER rds_logon_trigger
AFTER LOGON ON DATABASE
BEGIN
IF SYS_CONTEXT(''USERENV'',''IP_ADDRESS'') not in (''192.168.2.121'',''192.168.2.123'',''192.168.2.233'') THEN
RAISE_APPLICATION_ERROR(-20003,''You are not allowed to connect to the database'');
END IF;
IF (to_number(to_char(sysdate,''HH24''))< 6) and (to_number(to_char(sysdate,''HH24'')) >18) THEN
RAISE_APPLICATION_ERROR(-20005,''Logon only allowed during business hours'');
END IF;
END;