ฉันต้องการยกเลิกการเชื่อมต่อทั้งหมด (เซสชัน) ที่เปิดอยู่ในขณะนี้ไปยังฐานข้อมูล PostgreSQL เฉพาะ แต่ไม่ต้องรีสตาร์ทเซิร์ฟเวอร์หรือยกเลิกการเชื่อมต่อกับฐานข้อมูลอื่น
ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันต้องการยกเลิกการเชื่อมต่อทั้งหมด (เซสชัน) ที่เปิดอยู่ในขณะนี้ไปยังฐานข้อมูล PostgreSQL เฉพาะ แต่ไม่ต้องรีสตาร์ทเซิร์ฟเวอร์หรือยกเลิกการเชื่อมต่อกับฐานข้อมูลอื่น
ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
นี่คือคำตอบของฉันสำหรับคำถามที่คล้ายกันมากใน 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');
แบบสอบถามแบบนี้น่าจะช่วยได้ (สมมติว่าฐานข้อมูลชื่อ '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
หลังจากนั้น
สิ่งนี้สามารถใช้เพื่อ "ฟรี" ฐานข้อมูลจากการเชื่อมต่อไคลเอนต์เพื่อให้คุณสามารถเปลี่ยนชื่อตัวอย่างเช่น:
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;
โปรดทราบว่าสิ่งนี้อาจทำให้เกิดปัญหากับแอพไคลเอ็นต์ของคุณ ไม่ควรทำการสตรีมข้อมูลจริงเนื่องจากใช้ธุรกรรม