salida - restaurar backup oracle
Dejar caer usuarios conectados en la base de datos Oracle (9)
Así es como "automatizo" la caída de usuarios conectados en la base de datos Oracle:
# A shell script to Drop a Database Schema, forcing off any Connected Sessions (for example, before an Import)
# Warning! With great power comes great responsibility.
# It is often advisable to take an Export before Dropping a Schema
if [ "$1" = "" ]
then
echo "Which Schema?"
read schema
else
echo "Are you sure? (y/n)"
read reply
[ ! $reply = y ] && return 1
schema=$1
fi
sqlplus / as sysdba <<EOF
set echo on
alter user $schema account lock;
-- Exterminate all sessions!
begin
for x in ( select sid, serial# from v/$session where username=upper(''$schema'') )
loop
execute immediate ( ''alter system kill session ''''''|| x.Sid || '','' || x.Serial# || '''''' immediate'' );
end loop;
dbms_lock.sleep( seconds => 2 ); -- Prevent ORA-01940: cannot drop a user that is currently connected
end;
/
drop user $schema cascade;
quit
EOF
Quiero eliminar algunos usuarios en Oracle DB usando sqlplus pero obtengo un error:
SQL> DROP USER test CASCADE;
DROP USER test CASCADE
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected
Seguí el enlace en SO para descubrir las sesiones: descartar un usuario conectado de un esquema de base de datos de Oracle 10g
Pero cuando ejecuté el comando no obtengo ningún resultado:
SQL> select sid,serial# from v$session where username = ''test'';
no rows selected
Por favor, ayúdenme a dejar caer a los usuarios en este caso.
Básicamente, creo que matar a todas las sesiones debería ser la solución, pero ...
Encontré una discusión similar - https://community.oracle.com/thread/1054062 a mi problema y era que no tenía sesiones para esos usuarios, pero igual recibí el error. Traté también en segundo lugar la mejor respuesta:
sql>Shutdown immediate;
sql>startup restrict;
sql>drop user TEST cascade;
Lo que funcionó para mí al final fue iniciar sesión como usuario, soltar todas las tablas de forma manual: seleccionar para crear declaraciones de soltar es
select ''drop table '' || TABLE_NAME || '';'' from user_tables;
(Necesita volver a ejecutarse varias veces debido a referencias)
No tengo idea de cómo está relacionado eso, dejé también funciones y secuencias (porque eso era todo lo que tenía en el esquema)
Cuando lo hice y me desconecté, tuve varias sesiones en la tabla v$session
y cuando las maté, pude descartar usuarios.
Mi DB aún se inició en modo restringido (no estoy seguro de si es importante o no).
Podría ayudar a alguien más.
Por cierto: mi versión de Oracle es Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
El problema se ha solucionado mediante el siguiente procedimiento:
DECLARE
v_user_exists NUMBER;
user_name CONSTANT varchar2(20) := ''SCOTT'';
BEGIN
LOOP
FOR c IN (SELECT s.sid, s.serial# FROM v$session s WHERE upper(s.username) = user_name)
LOOP
EXECUTE IMMEDIATE
''alter system kill session '''''' || c.sid || '','' || c.serial# || '''''' IMMEDIATE'';
END LOOP;
BEGIN
EXECUTE IMMEDIATE ''drop user '' || user_name || '' cascade'';
EXCEPTION WHEN OTHERS THEN
IF (SQLCODE = -1940) THEN
NULL;
ELSE
RAISE;
END IF;
END;
BEGIN
SELECT COUNT(*) INTO v_user_exists FROM dba_users WHERE username = user_name;
EXIT WHEN v_user_exists = 0;
END;
END LOOP;
END;
/
Haz una consulta:
SELECT * FROM v$session s;
Encuentra a tu usuario y haz la siguiente consulta (con los parámetros adecuados):
ALTER SYSTEM KILL SESSION ''<SID>, <SERIAL>'';
Solución:
sql>Shutdown immediate;
sql>startup restrict;
sql>drop user TEST cascade;
Si quiere reactivar DB, normalmente reinicie el servidor o:
sql>Shutdown immediate;
sql>startup;
:)
Trataba de seguir el flujo que se describe aquí, pero no tengo suerte de matar por completo la sesión ... Entonces me gusta dar un paso adicional aquí:
http://wyding.blogspot.com/2013/08/solution-for-ora-01940-cannot-drop-user.html
Lo que hice:
1. select ''alter system kill session '''''' || sid || '','' || serial# || '''''';'' from v$session where username = ''<your_schema>'';
select ''alter system kill session '''''' || sid || '','' || serial# || '''''';'' from v$session where username = ''<your_schema>'';
- como se describe abajo.
El resultado será algo como esto:
alter system kill session ''22,15'' immediate;
2. alter system disconnect session ''22,15'' IMMEDIATE ;
- 22-sid, 15-serial - repite el comando para cada sesión devuelta del comando anterior
3. Repite los pasos 1-2 mientras select...
no devuelves una tabla vacía
4. Llamada drop user...
Lo que se perdió - llamada al alter system disconnect session ''22,15'' IMMEDIATE ;
para cada una de las sesiones devueltas por select ''alter system kill session ''..
Tuve el mismo problema, la configuración de Oracle por defecto afecta el registro de letras. En el exacto mi Scheme_Name fue escrito todas las mayúsculas. Puede ver su Scheme_Name en la pestaña "Otros usuarios", si está utilizando Oracle S
vaya a servicios en herramientas administrativas y seleccione oracleserviceSID y reinícielo
SELECT s.sid, s.serial#, s.status, p.spid
FROM v$session s, v$process p
WHERE s.username = ''TEST'' --<<<--
AND p.addr(+) = s.paddr
/
Pase los valores reales de SID y SERIAL # para la prueba del usuario y luego suelte al usuario ...:
ALTER SYSTEM KILL SESSION ''<SID>, <SERIAL>''
/