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.
надеюсь, это поможет вам.
Анкит Х Ганди.
я перезапустил свою систему, и ошибка все еще показывалась. Тем не менее, я последовал шагам ниже, чтобы разобраться в этом.
остановите все процессы с помощью порта 5432 postgres, выполнив это в командной строке (Admin): введите
netstat -ano
в командной строке. Найдите pid с локальным адресом0.0.0.0:5432
. Тогда используйтеtaskkill /pid {pid} /f
чтобы убить задачу.запустите службу postgres в службах windows.