Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara mematikan pernyataan SELECT yang sedang berjalan

Saat Anda terus mendapatkan halaman hasil, saya berasumsi Anda memulai sesi di SQL*Plus. Jika demikian, hal yang mudah dilakukan adalah dengan bash ctrl + istirahat berkali-kali sampai berhenti.

Cara yang lebih rumit dan lebih umum saya uraikan di bawah ini untuk meningkatkan keganasan / kejahatan. Yang pertama mungkin akan berhasil untuk Anda, tetapi jika tidak, Anda dapat terus bergerak ke bawah daftar.

Sebagian besar tidak disarankan dan dapat menimbulkan konsekuensi yang tidak diinginkan.


1. Tingkat Oracle - Matikan proses di database

Sesuai jawaban ObiWanKenobi dan dokumentasi ALTER SESSION

alter system kill session 'sid,serial#';

Untuk menemukan sid , id sesi, dan serial# , nomor seri, jalankan kueri berikut - dirangkum dari OracleBase - dan temukan sesi Anda:

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'

Jika Anda menjalankan RAC maka Anda perlu mengubahnya sedikit untuk memperhitungkan beberapa instance, inst_id itulah yang mengidentifikasi mereka:

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'

Kueri ini juga akan berfungsi jika Anda tidak menjalankan RAC.

Jika Anda menggunakan alat seperti PL/SQL Developer, maka jendela sesi juga akan membantu Anda menemukannya.

Untuk "membunuh" yang sedikit lebih kuat, Anda dapat menentukan kata kunci SEGERA, yang menginstruksikan database untuk tidak menunggu transaksi selesai:

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

2. Tingkat OS - Terbitkan SIGTERM

kill pid

Ini mengasumsikan Anda menggunakan Linux atau varian *nix lainnya. Sebuah SIGTERM adalah sinyal penghentian dari sistem operasi ke proses tertentu yang memintanya untuk berhenti berjalan. Ia mencoba untuk membiarkan proses berakhir dengan anggun.

Kesalahan ini dapat mengakibatkan Anda menghentikan proses OS yang penting, jadi berhati-hatilah saat mengetik.

Anda dapat menemukan pid , id proses, dengan menjalankan kueri berikut, yang juga akan memberi tahu Anda informasi berguna seperti terminal tempat proses dijalankan dan nama pengguna yang menjalankannya sehingga Anda dapat memastikan bahwa Anda memilih yang benar.

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

Sekali lagi, jika Anda menjalankan RAC, Anda perlu mengubahnya sedikit menjadi:

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

Mengubah where klausa ke where s.status = 'KILLED' akan membantu Anda menemukan proses yang sudah dimatikan yang masih "berjalan".

3. OS - Terbitkan SIGKILL

kill -9 pid

Menggunakan pid yang sama Anda mengambil dalam 2, SIGKILL adalah sinyal dari sistem operasi ke proses tertentu yang menyebabkan proses tersebut segera dihentikan. Sekali lagi berhati-hatilah saat mengetik.

Ini jarang diperlukan. Jika Anda melakukan DML atau DDL, proses rollback akan dihentikan dan mungkin mempersulit pemulihan database ke kondisi yang konsisten jika terjadi kegagalan.

Semua opsi yang tersisa akan mematikan semua sesi dan mengakibatkan database Anda - dan dalam kasus server 6 dan 7 juga - menjadi tidak tersedia. Mereka hanya boleh digunakan jika benar-benar diperlukan...

4. Oracle - Matikan database

shutdown immediate

Ini sebenarnya lebih sopan daripada SIGKILL , meskipun jelas itu bertindak pada semua proses dalam database daripada proses spesifik Anda. Itu selalu baik untuk bersikap sopan ke database Anda.

Mematikan database hanya boleh dilakukan dengan persetujuan DBA Anda, jika Anda memilikinya. Sangat menyenangkan untuk memberi tahu orang-orang yang menggunakan database juga.

Itu menutup database, menghentikan semua sesi dan melakukan rollback pada semua transaksi yang tidak terikat. Ini bisa memakan waktu cukup lama jika Anda memiliki transaksi besar tanpa komitmen yang perlu dibatalkan.

5. Oracle - Matikan database ( cara yang kurang baik )

shutdown abort

Ini kira-kira sama dengan SIGKILL , meskipun sekali lagi pada semua proses dalam database. Ini adalah sinyal ke database untuk menghentikan semuanya segera dan mati - sebuah kecelakaan keras. Ini mengakhiri semua sesi dan tidak melakukan rollback; karena ini dapat berarti bahwa database membutuhkan waktu lebih lama untuk startup lagi. Meskipun bahasanya menghasut, shutdown abort bukanlah kejahatan murni dan biasanya dapat digunakan dengan aman.

Seperti sebelumnya, beri tahu orang-orang yang relevan terlebih dahulu.

6. OS - Reboot server

reboot

Jelas, ini tidak hanya menghentikan database tetapi juga server, jadi gunakan dengan hati-hati dan dengan persetujuan sysadmin Anda selain DBA, pengembang, klien, dan pengguna.

7. OS - Tahap terakhir

Reboot saya tidak berfungsi... Setelah Anda mencapai tahap ini, sebaiknya Anda menggunakan VM. Kami akhirnya menghapusnya...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hibernate tidak dapat mengambil SequenceInformation dari database

  2. Tambahkan Instans RAC Baru Secara Manual

  3. Ambil IDENTITAS yang terakhir dimasukkan Oracle

  4. Cara PLAY_SOUND di Oracle Forms

  5. XMLtable dengan Oracle 11g