ver varios usuarios usuario una solo sesiones procesos privilegios listar lista insertar hacer grants ejecucion datos consultar consulta colgadas 11g oracle oracle10g

varios - ¿Es posible matar una sola consulta en Oracle sin matar la sesión?



ver procesos en ejecucion oracle (4)

Puede ver los límites de recursos:

"Si un usuario excede un límite de recursos de nivel de llamada, entonces Oracle detiene el procesamiento de la declaración, revierte la declaración y devuelve un error. Sin embargo, todas las declaraciones anteriores de la transacción actual permanecen intactas y la sesión del usuario permanece conectada. "

Eso supone que la razón para cancelar el SQL es un límite de recursos, en lugar de actualizar el conjunto incorrecto de filas (por ejemplo). Sospecho que no podría afectar el SQL actualmente en ejecución agregando un límite de recursos.

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/security.htm#i13767 http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dbrm.htm#i1010776

Me gustaría poder eliminar la consulta de un usuario en Oracle 10.2.0.4 sin matar toda la sesión. Esto permitiría que la consulta finalice, pero no desconecte a ese usuario de su sesión, para que pueda continuar haciendo otras consultas. ¿Es esto posible? ¿O el martillo contundente de matar a la sesión es la única manera de terminar con la ejecución de una consulta?


Encontré un truco. No tengo idea de cuán seguro es jugar con esto, pero funciona. Hay un evento de Oracle, 10237, que se describe como "simular ^ C (para fines de prueba)".

Debe tener el SID y el NÚMERO DE SERIE de la sesión que desea interrumpir.

Llame a SYS.DBMS_SYSTEM.SET_EV ( sid , serial number, 10237, 1, '''') para activar el evento en la sesión de destino. Cualquier declaración que se esté ejecutando actualmente debe interrumpirse (recibiendo "ORA-01013: cancelación solicitada por el usuario de la operación actual"). Mientras el evento esté configurado, cualquier declaración adicional que la sesión intente ejecutar terminará inmediatamente con el mismo error.

Para desactivar el evento, realice la misma llamada con el cuarto parámetro establecido en "0". La sesión podrá entonces ejecutar declaraciones nuevamente.

Tenga en cuenta que la sesión de destino debe detectar que el evento está configurado, lo que puede llevar tiempo o puede que nunca suceda, dependiendo de lo que esté haciendo. Por lo tanto, no puede activar y desactivar el evento rápidamente. Debería activarlo, verificar que la afirmación en cuestión se haya detenido y luego desactivarla.

Aquí hay un código de muestra. Esto se debe ejecutar como un bloque anónimo en SQLPlus, con las variables de sustitución "sid" y "serial" definidas de forma adecuada. Podría convertirlo en un procedimiento almacenado con esos como sus parámetros.

DECLARE l_status v$session.status%TYPE; BEGIN dbms_system.set_ev( &sid, &serial, 10237, 1, ''''); LOOP SELECT status INTO l_status FROM v$session WHERE sid = &sid and serial# = &serial; EXIT WHEN l_status=''INACTIVE''; END LOOP; dbms_system.set_ev( &sid, &serial, 10237, 0, ''''); END;


Sospecho que podría ser posible ya que puedes hacer esto en TOAD. Mientras se ejecuta una consulta, aparece un cuadro de diálogo Cancelar que puede pulsar para detener la consulta.

Cómo se implementa No lo sé, pero estaría muy interesado en descubrirlo también.

Si está usando java, existe el método java.sql.Statement cancel () que se supone que debe hacer esto. Vea aquí algunas notas y limitaciones ...

http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/tips.htm#BACDAICJ


Idealmente, la aplicación del usuario debería tener la capacidad de cancelar una consulta (a través de OCICancel o equivalente).

De lo contrario, lo mejor sería utilizar Resource Manager (si está en Oracle EE), puede usar DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_SESS para establecer la sesión de destino en el grupo de consumidores CANCEL_SQL.

Otro truco para cancelar otra consulta de sesiones, que no funciona con las sesiones de cliente de Windows sqlplus, sería enviar una señal urgente al proceso de Oracle utilizando kill -URG (es un truco, no para uso diario)

He escrito sobre por qué funciona aquí:

http://blog.tanelpoder.com/2010/02/17/how-to-cancel-a-query-running-in-another-session/