2012-07-02 24 views
60

Tôi đang sử dụng Heroku với tùy chọn Crane Postgres và tôi đang chạy truy vấn trên cơ sở dữ liệu từ máy cục bộ của mình khi máy cục bộ bị hỏng. Nếu tôi chạyHeroku Postgres - chấm dứt truy vấn treo (nhàn rỗi trong giao dịch)

select * from pg_stat_activity 

một trong những mục có

<IDLE> in transaction 

trong cột current_query_text.

Kết quả là, tôi không thể xóa bảng đã được ghi bởi truy vấn đã bị chấm dứt. Tôi đã thử bằng cách sử dụng pg_cancel_backend (N) và nó trả về True nhưng không có gì dường như xảy ra.

Làm cách nào để chấm dứt quá trình này để tôi có thể thả bảng?

+1

Có lẽ câu hỏi cần được viết lại để "làm thế nào để chấm dứt truy vấn của riêng tôi khi có không phải truy cập root vào máy chủ postgres cũng không truy cập superuser cơ sở dữ liệu". Nó có vẻ như là một câu hỏi rất hay ... và tôi không biết câu trả lời. – tobixen

Trả lời

89

Đây là câu trả lời chung và không dành riêng cho heroku. Nói chung, việc hủy truy vấn có thể yêu cầu người dùng có quyền truy cập superuser hoặc máy chủ postgres hoặc cơ sở dữ liệu postgres - có vẻ như người dùng thông thường không thể giết quá trình truy vấn của riêng mình mà không hỏi DBA hoặc sysadmin của bạn để được trợ giúp


Tìm các PID bằng cách chạy sql này:

SELECT procpid,* from pg_stat_activity 
WHERE current_query<>'<IDLE>' ORDER BY xact_start; 

bạn sẽ tìm thấy procpid trong (trái) cột đầu tiên, và là người đầu tiên (trên cùng) hàng có khả năng là các truy vấn mà bạn' d muốn chấm dứt. Tôi sẽ giả định pid là 1234 dưới đây.

Bạn có thể hủy các truy vấn SQL thông qua (tức là không được tiếp cận vỏ, nhưng có thể bạn cần truy cập superuser cơ sở dữ liệu):

select pg_cancel_backend(1234); 

Đây là cách "mềm" ... truy vấn sẽ không biến mất ngay lập tức. Nếu bạn đang ở trong một vội vàng, hãy thử điều này:

select pg_terminate_backend(1234); 

Nếu bạn có quyền truy cập shell bạn cũng có thể làm điều đó từ vỏ:

kill -INT 1234 

Nếu điều đó không giúp, sử dụng:

kill 1234 

KHÔNG:

kill -9 1234 

... mà thường sẽ dẫn đến toàn bộ máy chủ postgres đi xuống trong ngọn lửa, sau đó bạn cũng có thể khởi động lại postgres. Postgres là khá mạnh mẽ, vì vậy dữ liệu sẽ không bị hỏng, nhưng tôi khuyên bạn nên chống lại việc sử dụng "kill -9" trong bất kỳ trường hợp ;-)


"nhàn rỗi trong giao dịch" có nghĩa là giao dịch không chấm dứt với "cam kết" hoặc "rollback", nghĩa là ứng dụng bị lỗi hoặc không được thiết kế đúng cách để làm việc với cơ sở dữ liệu giao dịch. Bạn nên tránh sử dụng "nhàn rỗi trong giao dịch" lâu dài vì nó cũng có thể gây ra các sự cố hiệu suất lớn.

+0

Tôi đã thử pg_cancel_backend không có kết quả. Tôi không có quyền truy cập trình bao và tôi không phải là siêu người dùng nên tôi không thể gửi SIGKILL bằng pg_terminate_backend – alan

+0

Bạn đang sử dụng phiên bản nào của bưu điện? (gợi ý: 'select version()'). Bạn có nhận được bất kỳ thông báo lỗi nào khi sử dụng 'pg_cancel_backend' không? – tobixen

+0

Thực hiện một nỗ lực để sử dụng pg_cancel_backend bản thân mình, vì vậy đã nhận được thông báo lỗi "phải là superuser để báo hiệu các quá trình máy chủ khác" ... có nghĩa là bạn sẽ cần truy cập root trên máy chủ hoặc truy cập db thông qua một số người dùng siêu postgres (tức là postgres người dùng) để xóa truy vấn của riêng bạn. Điều đó dường như hút một chút :-( – tobixen

33

Hãy thử điều này:

select pg_terminate_backend(pid int) 

Thông tin thêm về điều này, bạn có thể tìm thấy here. Điều này nên là giải pháp 'sạch hơn' của vấn đề này hơn là giết chết quá trình bằng hệ thống.

+7

ĐÂY LÀ GIẢI PHÁP. pg_cancel_backend thường không hoạt động nhưng * chấm dứt * là thủ thuật. –

+0

Xin vui lòng thêm làm thế nào để có được pid của bạn để câu trả lời của bạn – mountainclimber

16

Bạn có thể cài đặt các heroku-pg-extras add-on và chạy lệnh sau để có được PID:

heroku pg:locks --app <your-app> 

Sau đó chỉ cần làm:

heroku pg:kill <pid> --app <your-app> 

LƯU Ý: --force tùy chọn có thể được sử dụng để vấn đề pg_terminate_backend làm giảm toàn bộ kết nối cho truy vấn đó.

Nếu heroku pg:locks không liệt kê bất cứ điều gì, hãy thử heroku pg:ps.

Để biết thêm thông tin tham khảo:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall

+0

Điều này đã cứu tôi rất nhiều thời gian ... Cảm ơn! –

+0

Hoàn hảo, cảm ơn – nrowegt

+0

Cảm ơn bạn. Tôi vẫn không thể chấm dứt giao dịch/PID mặc dù ... máy tính của tôi đã đóng băng phần cứng trong khi nhập và tôi không thể chấm dứt PID. :( – dimitarvp

Các vấn đề liên quan