Heroku“ psql: FATAL: ช่องเชื่อมต่อที่เหลือถูกสงวนไว้สำหรับการเชื่อมต่อ superuser ที่ไม่ใช่การจำลองแบบ”


120

ฉันกำลังพัฒนาแอปบน Heroku พร้อมแบ็กเอนด์ Postgresql เป็นระยะ ๆ ฉันได้รับข้อความแสดงข้อผิดพลาดนี้เมื่อพยายามเข้าถึงฐานข้อมูลทั้งจาก CLI และจากการโหลดเพจบนเซิร์ฟเวอร์:

psql: FATAL: remaining connection slots are reserved for non-replication superuser connections

ใครเคยเห็นสิ่งนี้มาก่อนหรือโปรดช่วยชี้ทางที่ถูกต้องให้ฉัน?


1
มีปัญหาเดียวกัน ฉันอ่านที่ไหนสักแห่งที่ฝ่ายสนับสนุน Heroku "ตรวจพบปัญหาบางอย่าง" ในบางเซิร์ฟเวอร์และพวกเขาแนะนำให้ผู้ใช้ที่มีปัญหาจัดเตรียมฐานข้อมูลพื้นฐานใหม่และย้ายไปใช้โดยใช้ pgbackups ปัญหาของฉันตอนนี้คือแอพใหม่มากจนฉันยังไม่ได้สร้างข้อมูลสำรองและฉันได้รับข้อผิดพลาดเดียวกันกับการพยายามสร้างแน่นอน: D
André Laszlo

สำหรับบันทึกฉันสามารถใช้heroku pgbackupsคำสั่งเพื่อสร้างการสำรองข้อมูลแม้จะมีข้อผิดพลาดนี้
markshiz

หากต้องการสร้างปัญหานี้ซ้ำคุณสามารถสร้างเทอร์มินัลจำนวนมากได้ .batสคริปต์ใน Windows สำหรับสิ่งนี้: for /l %%x in (1, 1, 100) do ( start psql )โดยที่100เป็นจำนวนแบ็กเอนด์ที่ต้องการ
koxt

ผมมีปัญหาเหมือนกัน. ผมไม่สามารถที่จะถ่ายโอนข้อมูลไปยังฐานข้อมูลใหม่โดยใช้pg:backups copy, pg:backups captureโดยการเชื่อมต่อไปจากpgAdminบนคอมพิวเตอร์ของฉันเองหรือวิธีอื่นใดที่ผมสามารถจินตนาการ แม้pg:killallไม่ได้ช่วย หนึ่งชั่วโมงต่อมาฉันลองอีกครั้งและการเชื่อมต่ออยู่ที่ 50-50 ดังนั้นหลังจากพยายามเพียงไม่กี่ครั้งฉันก็ประสบความสำเร็จpg:backups copyและแอปของฉันก็กลับมาอยู่ในอากาศ นี่ไม่ใช่วันที่สนุก หากคุณ googled สิ่งนี้ให้ดื่มน้ำหนึ่งถ้วย
Aur Saraf

1
ตอนนี้ฉันมีสิ่งนี้อีกครั้ง โชคดีแค่ไหนที่ได้บันทึกประสบการณ์ครั้งก่อนของฉัน ... แก้ไข: การรีสตาร์ทครั้งนี้ก็เพียงพอแล้ว
Aur Saraf

คำตอบ:


56

คุณจำเป็นต้องเพิ่มการmax_connectionsตั้งค่าคอนฟิกหรือ (อาจจะดีกว่า) ใช้การเชื่อมต่อร่วมกันเพื่อกำหนดเส้นทางคำขอของผู้ใช้จำนวนมากผ่านพูลการเชื่อมต่อที่เล็กกว่า

https://wiki.postgresql.org/wiki/Number_Of_Database_Connections


14
นอกจากนี้ปัญหาที่พบบ่อยคือแอปฝั่งไคลเอ็นต์ขัดข้องและเปิดการเชื่อมต่อทิ้งไว้แล้วเปิดใหม่เมื่อรีสตาร์ท ถ้าเรื่องแบบนี้เกิดขึ้นมากคุณก็จะขาดการเชื่อมต่อ หรือแอปได้รับการกำหนดค่าไม่เหมาะสมและเปิดการเชื่อมต่อมากเกินไป
Scott Marlowe

5
ฉันไม่คิดว่าจะเปลี่ยนการตั้งค่าใน Heroku ได้ มีวิธีปิดการเชื่อมต่อที่เปิดอยู่ทั้งหมดหรือไม่?
nathancahill

1
หวังว่าเซิร์ฟเวอร์จะได้รับการกำหนดค่าสำหรับแพ็กเก็ตแบบ Keepalive บนพื้นฐานที่ค่อนข้างก้าวร้าว ซึ่งจะทำให้เซสชันสิ้นสุดลงในเวลาอันสมควรหากการเชื่อมต่อขาดกะทันหัน หากไม่ได้กำหนดค่าไว้หากคุณสามารถเข้าสู่ระบบในฐานะ superuser ฐานข้อมูลคุณสามารถระบุpidค่าสำหรับเซสชันและใช้pg_terminate_backend()ฟังก์ชันเพื่อฆ่าค่าเหล่านั้นได้ เพื่อหลีกเลี่ยงปัญหาอย่าลืมปิดการเชื่อมต่ออย่างถูกต้องแทนที่จะปิดฝั่งไคลเอ็นต์อย่างกะทันหัน
kgrittn

@nathancahill ยุติการเชื่อมต่อทั้งหมดกับฐานข้อมูล:heroku pg:killall
Roko


7

ดูHeroku“ psql: FATAL: ช่องเชื่อมต่อที่เหลือถูกสงวนไว้สำหรับการเชื่อมต่อ superuser ที่ไม่ใช่การจำลองแบบ” :

Heroku บางครั้งมีปัญหากับการจัดสรรภาระงานฐานข้อมูล

André Laszlo, markshizและฉันทั้งหมดรายงานการจัดการกับว่าในความคิดเห็นในคำถาม

เพื่อช่วยคุณในการโทรติดต่อฝ่ายสนับสนุนนี่คือคำตอบที่ฉันได้รับจากฝ่ายสนับสนุน Heroku สำหรับปัญหาที่คล้ายกัน:

สวัสดี,

ข้อ จำกัด ประการหนึ่งของฐานข้อมูลระดับงานอดิเรกคือการบำรุงรักษาโดยไม่มีการแจ้งเตือน ฐานข้อมูลงานอดิเรกจำนวนมากทำงานบนเซิร์ฟเวอร์ที่ใช้ร่วมกันเครื่องเดียวและบางครั้งเราจำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์นั้นเพื่อวัตถุประสงค์ในการบำรุงรักษาฮาร์ดแวร์หรือย้ายฐานข้อมูลไปยังเซิร์ฟเวอร์อื่นเพื่อทำโหลดบาลานซ์ เมื่อเป็นเช่นนั้นคุณจะเห็นข้อผิดพลาดในบันทึกของคุณหรือมีปัญหาในการเชื่อมต่อ หากเซิร์ฟเวอร์กำลังรีสตาร์ทอาจใช้เวลา 15 นาทีขึ้นไปเพื่อให้ฐานข้อมูลกลับมาออนไลน์

แอพส่วนใหญ่ที่ดูแลพูลการเชื่อมต่อ (เช่น ActiveRecord ใน Rails) สามารถเปิดการเชื่อมต่อใหม่กับฐานข้อมูลได้ อย่างไรก็ตามในบางกรณีแอปจะไม่สามารถเชื่อมต่อใหม่ได้ หากเป็นเช่นนั้นคุณสามารถ heroku รีสตาร์ทแอปเพื่อให้กลับมาออนไลน์ได้

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

หากยังดำเนินต่อไปคุณสามารถลองจัดเตรียมฐานข้อมูลใหม่ (บนเซิร์ฟเวอร์อื่น) โดยใช้ส่วนเสริม heroku: เพิ่มจากนั้นใช้ pg: copy เพื่อย้ายข้อมูล โปรดทราบว่ากฎระดับงานอดิเรกใช้กับแผนพื้นฐาน $ 9 รวมถึงฐานข้อมูลฟรี

ขอบคุณแบรดลีย์


1
ฉันสงสัยว่าการตอบกลับสำเร็จรูปคืออะไรเมื่อคุณใช้แผนฐานข้อมูล $ 50 / เดือน?
mpoisot

1
เฉพาะระดับงานอดิเรกเท่านั้นที่ใช้เซิร์ฟเวอร์ฐานข้อมูลที่ใช้ร่วมกัน ด้วยแผน $ 50 / เดือนคุณมีเซิร์ฟเวอร์ของตัวเองดังนั้นหากคุณประสบปัญหานี้แอปของคุณเองเป็นผู้สร้างขึ้น คุณมีตัวเลือกในการดูแลระบบมากขึ้นด้วยแผน $ 50 / เดือนดังนั้นจึงง่ายต่อการวินิจฉัยและแก้ไข
Jessamyn Smith

คุณสามารถอธิบายตัวเลือกการดูแลระบบที่คุณสามารถทำได้ด้วยตัวเลือกมาตรฐานใด นอกจากนี้ยังได้รับข้อความนี้ด้วยการเชื่อมต่อเพียง 200 ครั้ง
Pencilcheck

6

ฉันพยายามใช้การรวมการเชื่อมต่อที่ปลาย django โดยใช้:

https://github.com/gmcguire/django-db-pool

แต่ฉันยังคงได้รับข้อผิดพลาดนี้แม้ว่าจะลดจำนวนการเชื่อมต่อที่มีให้ต่ำกว่าโควต้าฐานข้อมูลการพัฒนามาตรฐานที่มีการเชื่อมต่อแบบเปิด 20 รายการ

มีบทความเกี่ยวกับวิธีย้ายฐานข้อมูล postgresql ของคุณไปยัง Amazon RDS ระดับฟรี / ราคาถูก ซึ่งจะช่วยให้คุณตั้งค่าได้max_connectionsสูงขึ้น นอกจากนี้ยังช่วยให้คุณสามารถรวมการเชื่อมต่อที่ระดับฐานข้อมูลโดยใช้ PGBouncer

https://www.lewagon.com/blog/how-to-migrate-heroku-postgres-database-to-amazon-rds

UPDATE:

Heroku ตอบสนองต่อตั๋วเปิดของฉันและระบุว่าฐานข้อมูลของฉันมีการโหลดสมดุลในเครือข่ายอย่างไม่เหมาะสม พวกเขากล่าวว่าการปรับปรุงระบบควรป้องกันปัญหาที่คล้ายกันในอนาคต อย่างไรก็ตามการสนับสนุนย้ายฐานข้อมูลด้วยตนเองและประสิทธิภาพของฉันดีขึ้นอย่างเห็นได้ชัด


ฉันคิดว่าการย้ายฐานข้อมูลเป็นทางออกที่ดีที่สุดในการควบคุมฐานข้อมูลทั้งหมด ขอบคุณสำหรับบทความนั้น
nathancahill

-3

รีสตาร์ทฐานข้อมูล postgres ของคุณโดยใช้คำสั่งต่อไปนี้:

postgres -D /usr/local/var/postgres

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