Đây là câu trả lời chung của Postgres, và không dành riêng cho heroku
(Câu trả lời đơn giản-ngu ngốc cho câu hỏi này có thể là ... chỉ cần khởi động lại postgresql. Giả sử đó không phải là mong muốn hoặc không phải là một tùy chọn ...)
Tìm PID bằng cách chạy sql này:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(Truy vấn có thể cần sửa chữa tùy thuộc vào phiên bản của postgres - cuối cùng, chỉ cần chọn * từ pg_stat_activity). Bạn sẽ tìm thấy pid trong cột đầu tiên (bên trái) và hàng đầu tiên (trên cùng) có thể là truy vấn bạn muốn kết thúc. Tôi giả sử pid là 1234 bên dưới.
Bạn có thể hủy truy vấn thông qua SQL (tức là không có quyền truy cập shell) miễn là truy vấn của bạn hoặc bạn có quyền truy cập cấp cao:
select pg_cancel_backend(1234);
Đó là một yêu cầu "thân thiện" để hủy truy vấn 1234 và may mắn là nó sẽ biến mất sau một thời gian. Cuối cùng, điều này hiệu quả hơn:
select pg_terminate_backend(1234);
Nếu bạn có quyền truy cập shell và quyền root hoặc postgres, bạn cũng có thể làm điều đó từ shell. Để "hủy" người ta có thể làm:
kill -INT 1234
và để "chấm dứt", chỉ cần:
kill 1234
ĐỪNG:
kill -9 1234
... điều đó thường dẫn đến toàn bộ máy chủ postgres chìm trong biển lửa, sau đó bạn cũng có thể khởi động lại postgres. Postgres khá mạnh mẽ, vì vậy dữ liệu sẽ không bị hỏng, nhưng tôi khuyên bạn không nên sử dụng "kill -9" trong mọi trường hợp :-)
"Giao dịch không hoạt động" kéo dài thường có nghĩa là giao dịch không được kết thúc bằng "cam kết" hoặc "khôi phục", có nghĩa là ứng dụng có lỗi hoặc không được thiết kế phù hợp để hoạt động với cơ sở dữ liệu giao dịch. Cần tránh tình trạng "nhàn rỗi trong giao dịch" kéo dài, vì nó cũng có thể gây ra các vấn đề lớn về hiệu suất.