จะยกเลิกการเชื่อมต่อทั้งหมดไปยังฐานข้อมูลเฉพาะโดยไม่หยุดเซิร์ฟเวอร์ได้อย่างไร


44

ฉันต้องการยกเลิกการเชื่อมต่อทั้งหมด (เซสชัน) ที่เปิดอยู่ในขณะนี้ไปยังฐานข้อมูล PostgreSQL เฉพาะ แต่ไม่ต้องรีสตาร์ทเซิร์ฟเวอร์หรือยกเลิกการเชื่อมต่อกับฐานข้อมูลอื่น

ฉันจะทำสิ่งนั้นได้อย่างไร


ฉันอ่านบางแห่งที่คุณสามารถใช้lowth.com/cutterเพื่อให้ได้สิ่งนี้

คำตอบ:


22

นี่คือคำตอบของฉันสำหรับคำถามที่คล้ายกันมากใน StackOverflow

ขึ้นอยู่กับรุ่น postgresql ของคุณคุณอาจพบข้อผิดพลาดซึ่งทำให้pg_stat_activityละเว้นการเชื่อมต่อที่ใช้งานอยู่จากผู้ใช้ที่ถูกทิ้ง การเชื่อมต่อเหล่านี้จะไม่ปรากฏใน pgAdminIII

หากคุณทำการทดสอบอัตโนมัติ (ซึ่งคุณสร้างผู้ใช้ด้วย) นี่อาจเป็นสถานการณ์ที่น่าจะเป็น

ในกรณีนี้คุณต้องเปลี่ยนกลับเป็นคำค้นหาเช่น:

 SELECT pg_terminate_backend(pg_stat_activity.procpid) 
 FROM pg_stat_get_activity(NULL::integer) 
 WHERE datid=(SELECT oid from pg_database where datname = 'your_database');

8
ข้อผิดพลาด: ไม่มีรายการ FROM-clause สำหรับตาราง "pg_stat_activity" (psql (9.6.1))
1767316

4
สิ่งนี้ไม่สามารถใช้งานได้อีกต่อไป .... รับข้อผิดพลาดด้านบน ^
lightweight

ดูคำตอบด้านล่างโดย Szymon
Guz

หายไปจากข้อไม่ทำงาน
Vipul

77

แบบสอบถามแบบนี้น่าจะช่วยได้ (สมมติว่าฐานข้อมูลชื่อ 'db'):

select pg_terminate_backend(pid) from pg_stat_activity where datname='db';

pidเคยถูกเรียกใช้procpidดังนั้นหากคุณใช้รุ่น postgres ที่เก่ากว่า 9.2 คุณสามารถลองทำสิ่งต่อไปนี้:

select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';

อย่างไรก็ตามคุณต้องเป็นผู้ใช้ขั้นสูงเพื่อตัดการเชื่อมต่อผู้ใช้รายอื่น

มันอาจจะมีประโยชน์กับREVOKE CONNECT ON DATABASE FROM PUBLICบางสิ่งที่คล้ายกันและGRANTหลังจากนั้น


3

สิ่งนี้สามารถใช้เพื่อ "ฟรี" ฐานข้อมูลจากการเชื่อมต่อไคลเอนต์เพื่อให้คุณสามารถเปลี่ยนชื่อตัวอย่างเช่น:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;

โปรดทราบว่าสิ่งนี้อาจทำให้เกิดปัญหากับแอพไคลเอ็นต์ของคุณ ไม่ควรทำการสตรีมข้อมูลจริงเนื่องจากใช้ธุรกรรม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.