sql >> Database >  >> RDS >> Oracle

Een lopende SELECT-instructie doden?

Aangezien u pagina's met resultaten krijgt, neem ik aan dat u de sessie in SQL*Plus bent gestart. Als dat zo is, is het eenvoudig om ctrl . te bashen + pauze vele, vele malen totdat het stopt.

De meer gecompliceerde en de meer algemene manier(en) beschrijf ik hieronder in volgorde van toenemende wreedheid / kwaadaardigheid. De eerste zal waarschijnlijk voor u werken, maar als dat niet het geval is, kunt u door de lijst blijven bladeren.

De meeste hiervan worden niet aanbevolen en kunnen onbedoelde gevolgen hebben.


1. Oracle-niveau - Dood het proces in de database

Volgens het antwoord van ObiWanKenobi en de ALTER SESSION-documentatie

alter system kill session 'sid,serial#';

Om de sid . te vinden , sessie-ID en het serial# , serienummer, voer de volgende query uit - samengevat vanuit OracleBase - en zoek uw sessie:

select s.sid, s.serial#, p.spid, s.username, s.schemaname
     , s.program, s.terminal, s.osuser
  from v$session s
  join v$process p
    on s.paddr = p.addr
 where s.type != 'BACKGROUND'

Als u een RAC gebruikt, moet u dit enigszins wijzigen om rekening te houden met de meerdere instanties, inst_id is wat ze identificeert:

select s.inst_id, s.sid, s.serial#, p.spid, s.username
     , s.schemaname, s.program, s.terminal, s.osuser
  from Gv$session s
  join Gv$process p
    on s.paddr = p.addr
   and s.inst_id = p.inst_id
 where s.type != 'BACKGROUND'

Deze query werkt ook als u geen RAC gebruikt.

Als je een tool zoals PL/SQL Developer gebruikt, zal het sessievenster je ook helpen deze te vinden.

Voor een iets sterkere "kill" kunt u het IMMEDIATE-sleutelwoord specificeren, dat de database instrueert om niet te wachten tot de transactie is voltooid:

alter system kill session 'sid,serial#' immediate;

2. OS-niveau - Geef een SIGTERM . uit

kill pid

Dit veronderstelt dat je Linux of een andere *nix-variant gebruikt. EEN SIGTERM is een beëindigingssignaal van het besturingssysteem naar het specifieke proces waarin het wordt gevraagd te stoppen met werken. Het probeert het proces netjes te laten eindigen.

Als u dit verkeerd doet, kan dit ertoe leiden dat u essentiële OS-processen beëindigt, dus wees voorzichtig bij het typen.

Je kunt de pid . vinden , process id, door de volgende query uit te voeren, die u ook nuttige informatie zal geven, zoals de terminal van waaruit het proces wordt uitgevoerd en de gebruikersnaam waarmee het wordt uitgevoerd, zodat u zeker weet dat u de juiste kiest.

select p.*
  from v$process p
  left outer join v$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Nogmaals, als u een RAC gebruikt, moet u dit enigszins wijzigen in:

select p.*
  from Gv$process p
  left outer join Gv$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

De where wijzigen clausule naar where s.status = 'KILLED' zal u helpen bij het vinden van reeds gedode processen die nog steeds "draaien".

3. OS - Geef een SIGKILL uit

kill -9 pid

Met dezelfde pid je hebt opgehaald in 2, een SIGKILL is een signaal van het besturingssysteem naar een specifiek proces dat ervoor zorgt dat het proces onmiddellijk wordt beëindigd. Nogmaals wees voorzichtig bij het typen.

Dit zou zelden nodig moeten zijn. Als u DML of DDL aan het doen was, zal het terugdraaien stoppen en mogelijk het moeilijk maken om de database in een consistente staat te herstellen in het geval van een storing.

Alle overige opties zullen alle sessies beëindigen en ertoe leiden dat uw database - en ook in het geval van server 6 en 7 - niet meer beschikbaar is. Ze mogen alleen worden gebruikt als het absoluut noodzakelijk is...

4. Oracle - Sluit de database af

shutdown immediate

Dit is eigenlijk beleefder dan een SIGKILL , hoewel het duidelijk inwerkt op alle processen in de database in plaats van op uw specifieke proces. Het is altijd goed om beleefd te zijn voor uw database.

Het afsluiten van de database mag alleen worden gedaan met toestemming van uw DBA, als u die heeft. Het is leuk om het ook aan de mensen te vertellen die de database gebruiken.

Het sluit de database, beëindigt alle sessies en doet een rollback op alle niet-gecommitteerde transacties. Het kan even duren als u grote niet-vastgelegde transacties heeft die moeten worden teruggedraaid.

5. Oracle - Sluit de database af (de minder leuke manier)

shutdown abort

Dit is ongeveer hetzelfde als een SIGKILL , maar nogmaals op alle processen in de database. Het is een signaal aan de database om alles onmiddellijk te stoppen en dood te gaan - een harde crash. Het beëindigt alle sessies en doet geen rollback; hierdoor kan het betekenen dat de database er langer over doet om startup nog een keer. Ondanks de opruiende taal een shutdown abort is niet puur kwaadaardig en kan normaal gesproken veilig worden gebruikt.

Zoals voorheen informeer mensen eerst de relevante mensen.

6. OS - Herstart de server

reboot

Uiteraard stopt dit niet alleen de database, maar ook de server, dus gebruik het voorzichtig en met toestemming van uw systeembeheerders, naast de DBA's, ontwikkelaars, klanten en gebruikers.

7. OS - De laatste etappe

Ik heb een reboot gehad die niet werkte... Als je dit stadium eenmaal hebt bereikt, kun je maar beter hopen dat je een VM gebruikt. We hebben het uiteindelijk verwijderd...



  1. Willekeurig veel rijen omzetten in kolommen in PostgreSQL

  2. SQRT() Functie in Oracle

  3. Wat is het verschil tussen USER() en SYS_CONTEXT('USERENV','CURRENT_USER')?

  4. QPSQL-stuurprogramma is niet geladen Qt