Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách hủy một câu lệnh SELECT đang chạy

Khi bạn tiếp tục nhận được các trang kết quả, tôi giả sử bạn đã bắt đầu phiên trong SQL * Plus. Nếu vậy, điều dễ dàng làm là gõ ctrl + ngắt nhiều, nhiều lần cho đến khi nó dừng lại.

Tôi trình bày chi tiết dưới đây về (các) cách phức tạp hơn và chung chung hơn theo thứ tự tăng dần sự hung dữ / xấu xa. Cách đầu tiên có thể phù hợp với bạn nhưng nếu không, bạn có thể tiếp tục di chuyển xuống danh sách.

Hầu hết những cách này đều không được khuyến khích và có thể gây ra hậu quả không mong muốn.


1. Cấp độ Oracle - Diệt quy trình trong cơ sở dữ liệu

Theo câu trả lời của ObiWanKenobi và tài liệu ALTER SESSION

alter system kill session 'sid,serial#';

Để tìm sid , id phiên và serial# , số sê-ri, chạy truy vấn sau - được tóm tắt từ OracleBase - và tìm phiên của bạn:

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'

Nếu bạn đang chạy RAC thì bạn cần thay đổi điều này một chút để tính đến nhiều trường hợp, inst_id là những gì xác định họ:

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'

Truy vấn này cũng sẽ hoạt động nếu bạn không chạy RAC.

Nếu bạn đang sử dụng một công cụ như PL / SQL Developer thì cửa sổ phiên cũng sẽ giúp bạn tìm thấy nó.

Đối với từ khóa "kill" mạnh hơn một chút, bạn có thể chỉ định từ khóa NGAY LẬP TỨC, từ khóa này hướng dẫn cơ sở dữ liệu không đợi giao dịch hoàn tất:

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

2. Cấp hệ điều hành - Phát hành SIGTERM

kill pid

Điều này giả sử bạn đang sử dụng Linux hoặc một biến thể * nix khác. A SIGTERM là một tín hiệu kết thúc từ hệ điều hành đến quá trình cụ thể yêu cầu nó ngừng chạy. Nó cố gắng để quá trình kết thúc một cách dễ dàng.

Làm sai điều này có thể dẫn đến việc bạn chấm dứt các quy trình hệ điều hành thiết yếu, vì vậy hãy cẩn thận khi nhập.

Bạn có thể tìm thấy pid , id quy trình, bằng cách chạy truy vấn sau, truy vấn này cũng sẽ cho bạn biết thông tin hữu ích như thiết bị đầu cuối mà quy trình đang chạy và tên người dùng đang chạy nó để bạn có thể đảm bảo chọn đúng.

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

Một lần nữa, nếu bạn đang chạy RAC, bạn cần thay đổi điều này một chút thành:

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

Thay đổi where mệnh đề tới where s.status = 'KILLED' sẽ giúp bạn tìm thấy quá trình đã bị hủy vẫn đang "chạy".

3. Hệ điều hành - Phát hành SIGKILL

kill -9 pid

Sử dụng cùng một pid bạn đã chọn trong 2, một SIGKILL là một tín hiệu từ hệ điều hành đến một quá trình cụ thể khiến quá trình đó kết thúc ngay lập tức. Một lần nữa hãy cẩn thận khi đánh máy.

Điều này hiếm khi cần thiết. Nếu bạn đang sử dụng DML hoặc DDL, nó sẽ dừng mọi quá trình khôi phục đang được xử lý và có thể gây khó khăn cho việc khôi phục cơ sở dữ liệu về trạng thái nhất quán trong trường hợp bị lỗi.

Tất cả các tùy chọn còn lại sẽ giết tất cả các phiên và kết quả là cơ sở dữ liệu của bạn - và trong trường hợp máy chủ 6 và 7 - cũng không khả dụng. Chúng chỉ nên được sử dụng nếu thực sự cần thiết ...

4. Oracle - Tắt cơ sở dữ liệu

shutdown immediate

Đây thực sự là dấu phân cực hơn là SIGKILL , mặc dù rõ ràng là nó hoạt động trên tất cả các quy trình trong cơ sở dữ liệu hơn là quy trình cụ thể của bạn. Nó luôn luôn tốt để lịch sự với cơ sở dữ liệu của bạn.

Việc tắt cơ sở dữ liệu chỉ nên được thực hiện khi có sự đồng ý của DBA nếu bạn có. Thật vui khi nói với những người sử dụng cơ sở dữ liệu.

Nó đóng cơ sở dữ liệu, chấm dứt tất cả các phiên và thực hiện rollback trên tất cả các giao dịch không cam kết. Có thể mất một lúc nếu bạn có các giao dịch lớn chưa được cam kết cần được khôi phục lại.

5. Oracle - Tắt cơ sở dữ liệu (cách kém hay hơn)

shutdown abort

Điều này gần giống với một SIGKILL , mặc dù một lần nữa trên tất cả các quy trình trong cơ sở dữ liệu. Đó là một tín hiệu cho cơ sở dữ liệu để dừng mọi thứ ngay lập tức và chết - một sự cố khó. Nó kết thúc tất cả các phiên và không khôi phục; vì điều này có thể có nghĩa là cơ sở dữ liệu mất nhiều thời gian hơn để startup lần nữa. Bất chấp ngôn ngữ kích hoạt, shutdown abort không phải là tà ác thuần túy và thường có thể được sử dụng một cách an toàn.

Như trước khi thông báo cho mọi người những người có liên quan trước.

6. Hệ điều hành - Khởi động lại máy chủ

reboot

Rõ ràng, điều này không chỉ dừng lại cơ sở dữ liệu mà còn cả máy chủ, vì vậy hãy sử dụng một cách thận trọng và với sự đồng ý của các hệ thống của bạn ngoài DBA, nhà phát triển, khách hàng và người dùng.

7. Hệ điều hành - Giai đoạn cuối cùng

Tôi đã khởi động lại không hoạt động ... Khi bạn đã đến giai đoạn này, tốt hơn hết bạn nên hy vọng rằng mình đang sử dụng một máy ảo. Chúng tôi đã xóa nó ...



  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> CLOB> Oracle :(

  2. chuyển đổi đốm màu thành cục máu đông

  3. 5 truy vấn SQL tốn thời gian hàng đầu trong Oracle

  4. Tạo dạng xem Pivot trong SQL từ bảng SQL

  5. Quy trình nền