Heroku "psql: FATAL: оставшиеся слоты для подключения зарезервированы для соединений с невосстановимыми суперпользователями"

Я получил приведенное выше сообщение об ошибке, которое запускает Heroku Postgres Basic (в соответствии с этим вопросом) и пытается диагностировать проблему.

Одно из предложений заключается в использовании пула соединений, но кажется, что Rails имеет встроенную функцию. Еще одно предложение состоит в том, что приложение настроено неправильно и открывает слишком много соединений.

Мое приложение управляет всеми его подключениями с помощью Active Record, и у меня было одно прямое соединение с базой данных из Navicat (или, по крайней мере, я думал, что у меня есть).

Как мне отладить это?

Решение

Оказывается, это проблема Героку. От поддержки Heroku:

Мы обнаружили проблему на сервере с базой данных Basic. Хотя мы точно определяем это и рассматриваем его, мы рекомендуем вам предоставить новую базовую базу данных и перенести ее с помощью PGBackups как подробнее здесь: https://devcenter.heroku.com/articles/upgrade-heroku-postgres-with-pgbackups, Это должно помещать вашу базу данных на новый сервер. Я прошу прощения за это сбой - мы работаем над устранением этой проблемы и предотвратим ее происходящих в будущем.

Ответ 1

Возможно, вы обнаружите, почему у вас так много соединений, проверяя представление pg_stat_activity:

SELECT * FROM pg_stat_activity

Скорее всего, у вас есть паразитный цикл, который открывает новые соединения, не закрывая его.

Ответ 2

Это произошло несколько раз в моем приложении - как-то происходит утечка соединения, и вдруг база данных получает в 10 раз больше соединений, чем нужно. Если это так, что вы получаете болото с такой ошибкой, а не трафик, попробуйте запустить это:

heroku pg:killall

Это приведет к прекращению всех подключений к базе данных. Если это опасно для вашей ситуации, чтобы, возможно, отключить запросы, будьте осторожны. У меня просто есть приложение для рельсов, и если он идет вниз, потеря нескольких запросов не имеет большого значения, потому что запросы браузера будут иметь looooooong с тех пор, пока все равно.

Ответ 3

Чтобы сохранить ваш звонок поддержки, вот ответ, который я получил от поддержки Heroku для аналогичной проблемы:

Здравствуйте,

Одним из ограничений баз данных уровня хобби является немедленное обслуживание. Многие базы данных хобби работают на одном общем сервере, и нам иногда потребуется перезапустить этот сервер для целей технического обслуживания оборудования или перенести базы данных на другой сервер для балансировки нагрузки. Когда это произойдет, вы увидите сообщение об ошибке в ваших журналах или проблемы с подключением. Если сервер перезагружается, может потребоваться 15 минут или больше, чтобы база данных вернулась в сеть.

Большинство приложений, поддерживающих пул соединений (например, ActiveRecord in Rails), могут просто открыть новое соединение с базой данных. Однако в некоторых случаях приложение не сможет повторно подключиться. Если это произойдет, вы можете повторно запустить приложение, чтобы вернуть его обратно.

Это одна из причин, по которой мы рекомендуем использовать хобби-базы данных для критически важных производственных приложений. Стандартные и премиальные базы данных включают в себя уведомления о событиях простоя и гораздо более эффективны и стабильны в целом. Вы можете использовать pg: copy для перехода на стандартный или премиальный план.

Если это продолжается, вы можете попробовать создать новую базу данных (на другом сервере) с помощью аддонов героя: add, а затем использовать pg: copy для перемещения данных. Имейте в виду, что правила уровня хобби применяются к основному плану за 9 долларов, а также к бесплатной базе данных.

Спасибо, Брэдли