PGError: ошибка: доступ к исходной базе данных "template1" осуществляется другими пользователями

у меня проблемы с тестированием для работы с Postgresql и Rails 3.

как разработка, так и производственные базы данных я могу работать нормально, однако тестовая база данных выдает следующие ошибки при запуске rake или db:test:prepare, etc.

PGError: ERROR: исходная база данных "template1" доступна другим пользователям

обновление

Googling вокруг, кажется, что нужно использовать template0 вместо template1 при использовании createdb для создания новой базы данных в Postgres. В типичном "так что я удалю причину. Но не симптом " мода, я нашел vendor/rails/railities/lib/task/databases.rake и изменил строку 109 читать:

createdb #{enc_option} 
-U "#{abcs["test"]["username"]}" 
-T template0 #{abcs["test"]["database"]}

но я действительно не хочу этого делать, так как я использую рельсы как драгоценный камень, кто-нибудь знает о другой работе или исправлении?

5 ответов


рассказ: CREATE DATABASE работает путем копирования существующей базы данных. PostgreSQL не позволит вам скопировать базу данных, если к ней подключен другой сеанс. Если template1 доступен другим пользователям,CREATE DATABASE не удастся.

вопрос, на который вам нужно ответить: почему другие сеансы подключены к template1?

разница между template0 и template1

в момент инициализации кластера базы данных, template0 и template1 такие же. Любые сведения о местоположении, которые вы хотите сделать доступными для каждой базы данных, созданной с помощью CREATE DATABASE следует перейти в template1. Так, например, если вы добавите процедурный langauge PL/python в template1, каждая база данных, которую вы создадите позже, будет включать PL / python.

база данных template0 предназначена для" девственного " шаблона. Он должен содержать только стандартные объекты базы данных,созданные путем инициализации кластера. Как шаблон" virgin", он никогда не должен быть изменен. Никогда.

Если вам нужно указать настройки кодировки и локали (параметры сортировки), вы можете сделать это, скопировав template0. Вы не можете сделать это, скопировав template1.


просто перезапустите службу базы данных.


Я также получил эту ошибку при попытке сбросить базу данных, пока у меня был по умолчанию Ruby on Rails server WEBrick:

$ bin/rake db:reset
PG::Error: ERROR:  database "dev" is being accessed by other users
DETAIL:  There is 1 other session using the database.
: DROP DATABASE IF EXISTS "dev"

другой пользователь здесь был запущенным приложением Rails. после выключения сервера с помощью CTRL + c, я смог повторно запустить команду сброса базы данных без каких-либо проблем.

Это тоже имеет смысл. Вы не можете удалить базу данных, если кто-то еще подключен к нему, как Майк Шеррилл также указывает.


эта проблема возникает, когда вы вошли в систему (psql template1 или psql template0) в базе данных template1 и template0 и выйти, используя команду ниже.

Ctrl + z

лучший способ существует из использования БД ниже команды postgres, тогда проблема не будет создавать:

\q + enter

есть 2 решения, если есть проблемы.

Решение - 1

перезагрузка услуги posgres как.

перезапуск службы sudo postgresql

решение - 2

sudo ps aux / grep template1

убедитесь, что не удаляете эти процессы

postgres 8363 0.0 0.0 111760 7832 pts / 11 T 09: 49 0: 00 /usr/lib/postgresql/9.5/bin/psql template1 ankit 18119 0.0 0.0 14224 976 pts / 14 S+ 12: 33 0: 00 grep --color=auto template1

остальная часть процесса должна быть убить, используя команду ниже.

sudo kill -9

теперь попробуйте снова создать db.

надеюсь, это поможет вам.

Анкит Х Ганди.


я перезапустил свою систему, и ошибка все еще показывалась. Тем не менее, я последовал шагам ниже, чтобы разобраться в этом.

  1. остановите все процессы с помощью порта 5432 postgres, выполнив это в командной строке (Admin): введите netstat -ano в командной строке. Найдите pid с локальным адресом 0.0.0.0:5432. Тогда используйте taskkill /pid {pid} /f чтобы убить задачу.

  2. запустите службу postgres в службах windows.