psql: FATAL: база данных «<пользователь>» не существует

723

Я использую приложение PostgreSql для Mac ( http://postgresapp.com/ ). Я использовал его в прошлом на других машинах, но это доставляет мне некоторые проблемы при установке на мой MacBook. Я установил приложение и запустил:

psql -h localhost

Возвращает:

psql: FATAL:  database "<user>" does not exist

Кажется, я даже не могу запустить консоль, чтобы создать базу данных, которую она пытается найти. То же самое происходит, когда я просто бегаю:

psql 

или если я запускаю psql из выпадающего меню приложения:

Статистика машины:

  • OSX 10.8.4

  • psql (PostgreSQL) 9.2.4

Любая помощь приветствуется.

Я также попытался установить PostgreSql с помощью homebrew, и у меня возникла та же проблема. Я также прочитал страницу документации приложений, которая заявляет:

Когда Postgres.app запускается впервые, он создает базу данных $ USER, которая является базой данных по умолчанию для psql, если ни одна из них не указана. Пользователь по умолчанию - $ USER, без пароля.

Так что может показаться, что приложение не создает $ USER, однако я установил-> деинсталлировал-переустановил несколько раз, так что это должно быть что-то с моей машиной.

Я нашел ответ, но я не уверен, как именно он работает, поскольку пользователь, ответивший в этой теме -> Запуск Postgresql в Mac: база данных "postgres" не существует , не проследила. Я использовал следующую команду, чтобы открыть psql:

psql -d template1

Я оставлю этот вопрос без ответа, пока кто-нибудь не сможет объяснить, почему это работает.

Райан Рич
источник
3
Что psql -d postgres -U postgres -h localhostпоказывает? Без флагов это по умолчанию для пользователя CLI, и я бы сказал, что это по умолчанию для "postgres" admin db, но у меня нет mac для тестирования.
BMA
@bma Это дает мне psql: FATAL: роль "postgres" не существует, что первоначально привело меня сюда -> stackoverflow.com/questions/15301826/… . Я пытался использовать этот ответ, но получаю тот же результат -> psql: FATAL: база данных "user" не существует
Ryan Rich
Вы смотрели в журнале дб? Интересно, будет ли там больше деталей?
BMA
12
У меня такая же проблема. Просто работа createdb <user>сработала для меня.
Пошагнесси
Запустите команду как psql -U user -d postgres, это гарантирует, что пользователь подключен к базе данных postgres, которая уже существует. Поэтому мы должны передать базу данных также во время входа в систему.
Анил

Ответы:

1175

Похоже, что вашему менеджеру пакетов не удалось создать для вас базу данных с именем $ user. Причина того, что

psql -d template1

у вас работает то, что template1 - это база данных, созданная самим postgres и присутствующая во всех установках. По-видимому, вы можете войти в template1, поэтому вам должны быть предоставлены некоторые права в базе данных. Попробуйте это в командной строке:

createdb

а затем посмотреть, если вы можете войти снова с

psql -h localhost

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

Кирк Ройбал
источник
38
В моем случае я написал, $ createdb -h localhostчтобы решить ошибку could not connect to database postgres: could not connect to server. После этого я могу подключиться к консоли postgresql через psql -h localhost.
ExiRe
Я все еще получаю пароль prompt'd и понятия не имею, какой это, какой из них является паролем приложения postgres по умолчанию?
LasagnaAndroid
2
Спасибо @Kirk. Нам действительно нужна -d template1ваша первая команда? Я видел "template1" в учебных пособиях по всему Интернету, но он только вводит меня в заблуждение. На мой взгляд, более логичный подход: 1) создать пользователя PostgreSQL, например, «usera» 2) создать базу данных с тем же именем, что и пользователь «usera» (я думаю, что это безумие, но, похоже, PostgreSQL этого требует) 3) Войдите в PostgreSQL как суперпользователь "postgres" и назначьте привилегии базы данных "usera" пользователю "usera" (о боже, это действительно настоящая жизнь?)
ericn
@eric: -d template1 существует только для проверки того, что OP вообще может войти в систему. Так как он создается во время initdb, он всегда существует, и это было легко проверить. С этого момента ваша процедура, как правило, "настоящая жизнь".
Кирк Ройбал
@ExiRe Вы только что излечили сильную головную боль, которую я испытывал одной простой командой. Спасибо!
Дейв Мангер
194

Из терминала просто запустите команду в окне командной строки. (Не внутри PSQL) .

createdb <user>

А затем снова попробуйте запустить postgres.

Дананай
источник
3
Прекрасный! Это сделал это! После запуска все команды psql работают как charm! благодаря тонну!
тогдашний врач
1
И я пытался в PSQL шаблон. черт
user1735921
2
также вы можете просто бежатьcreatedb
Mantisimo
Совет для таких пользователей, как я;) (Не внутри PSQL). означает, что когда вы просто открываете окно терминала, просто введите в качестве первой команды этот созданный b, а затем попробуйте войти в psql.
Рохан Додея
Большой! У меня работал на OSX.
darkhipo
150

По умолчанию postgres пытается подключиться к базе данных с тем же именем, что и ваш пользователь. Чтобы предотвратить это поведение по умолчанию, просто укажите пользователя и базу данных:

psql -U Username DatabaseName 
Aneer Dev
источник
14
Спасибо, знаете ли вы причину такого дизайна - почему в мире я бы хотел использовать базу данных с моим именем по умолчанию?
Эрик
3
@eric Базы данных часто используются сервисами, работающими как выделенный пользователь. Поэтому я предполагаю, что стратегия использования имени пользователя в качестве имени базы данных по умолчанию, вероятно, более полезна, чем использование некоторого фиксированного имени базы данных по умолчанию (например, «postgres»).
user686249
5
Как вы запускаете сценарий SQL, который на самом деле создает базу данных? в моем случае он всегда пытается соединиться с базой данных <пользователь>, когда моя цель - создать другую БД: psql -U Username -f create_db.sqlэто вернет ошибку:database Username doesn't exists
Kostanos
Фантастический ответ спасибо, но напрашивается вопрос, почему это не в справке командной строки? psql --help
Шон Вейдер
1
psql -U Username postgresкогда у вас еще нет баз данных
Анатолий Степанюк
59
  1. Войти как пользователь по умолчанию: sudo -i -u postgres
  2. Создать нового пользователя: createuser --interactive
  3. В ответ на запрос имени роли введите имя пользователя linux и выберите «Да» на вопрос суперпользователя.
  4. Все еще вошли как пользователь postgres, создайте базу данных: createdb <username_from_step_3>
  5. Подтвердите, что ошибки исчезли, введя: psqlв командной строке.
  6. Выход должен показать psql (x.x.x) Type "help" for help.
user286539
источник
Чувак, ты сэкономил мне много времени.
Jp Reddy
Мне нужно было сделать это в Windows. Установите новое имя пользователя pg в Linux un. Исправлена.
RichieRich
Это сработало для меня как очарование
обещание Престон
42

Войдите в систему, используя базу данных template1 по умолчанию:

#psql -d template1
#template1=# \l

  List of databases
   Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------+---------+----------+-------------+-------------+---------------------
 postgres  | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
 template1 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
(3 rows)

Создайте базу данных с вашим userId:

template1=# CREATE DATABASE gogasca WITH OWNER gogasca ENCODING 'UTF8';
CREATE DATABASE

Выйдите и войдите снова

template1=# \q
gonzo:~ gogasca$ psql -h localhost
psql (9.4.0)
Type "help" for help.

gogasca=# \l
                                List of databases
   Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------+---------+----------+-------------+-------------+---------------------
 gogasca   | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
 template1 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
(4 rows)
gogasca
источник
20

Я столкнулся с той же ошибкой при попытке открыть postgresql на Mac

psql: FATAL:  database "user" does not exist

Я нашел эту простую команду, чтобы решить ее:

method1

$ createdb --owner=postgres --encoding=utf8 user

и введите

 psql

Способ 2:

psql -d postgres
Динеш Паллапа
источник
5
Метод 2 спас мою жизнь
Tom10271
9

Была такая же проблема, просто psql -d postgresсделал это (введите команду в терминале)

ржавчина
источник
6

Эта ошибка также может возникать, если для переменной среды PGDATABASE задано имя базы данных, которая не существует.

В OSX я увидел следующую ошибку при попытке запустить psql из меню Postgress.app:

psql: FATAL: database "otherdb" does not exist

Решение этой ошибки было удалить export PGDATABASE=otherdbиз ~/.bash_profile:

Кроме того, если для PGUSER установлено значение, отличное от вашего имени пользователя, произойдет следующая ошибка:

psql: FATAL: role "note" does not exist

Решение состоит в том, чтобы удалить export PGUSER=notmeиз ~/.bash_profile.

sdhca
источник
5

После установки postgres, в моем случае версия 12.2, я выполнил команду ниже createdb.

$ createdb `whoami`

$ psql

psql (12.2)
Type "help" for help.

macuser=# 
SuperNova
источник
ура это сработало для меня
FaISalBLiNK
4

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

Такое же сообщение об ошибке может появиться при запуске файла запроса psqlбез указания базы данных. Поскольку useв postgresql нет операторов, мы должны указать базу данных в командной строке, например:

psql -d db_name -f query_file.sql
Бабкен Варданян
источник
1
и дб template1 всегда существует
джан
4

Как указано в документации createb :

Первая база данных всегда создается командой initdb при инициализации области хранения данных ... Эта база данных называется postgres.

Таким образом, если некоторые дистрибутивы OS / postgresql делают это по-другому, это, конечно, не стандарт / стандарт (просто проверено, что initdbв openSUSE 13.1 создается БД «postgres», но не «<пользователь>»). Короче говоря, psql -d postgresожидается, что будет использоваться при использовании пользователя, кроме "postgres".

Очевидно, что принятый ответ, работающий createdbнад созданием БД с именем пользователя, также работает, но создает лишнюю БД.

user686249
источник
1

возникла проблема с использованием драйвера JDBC, поэтому нужно просто добавить базу данных (возможно, избыточно в зависимости от используемого вами инструмента) после имени хоста в URL, например jdbc:postgres://<host(:port)>/<db-name>

дальнейшие подробности описаны здесь: http://www.postgresql.org/docs/7.4/static/jdbc-use.html#JDBC-CONNECT

Андреас Дитрих
источник
Я знаю, что это немного не по теме, учитывая, что его попросили только psql, но Google привел меня сюда со своей проблемой, поэтому я думаю, что стоит упомянуть здесь
Andreas Dietrich
1

Подключитесь к postgres через существующего суперпользователя.

Создайте базу данных по имени пользователя, через которого вы подключаетесь к postgres.

create database username;

Теперь попробуйте подключиться через имя пользователя

Самир Кумар Чоудхари
источник
1

Попробуйте использовать-

psql -d postgres

Я также столкнулся с той же проблемой, когда я побежал psql

Hardik Chugh
источник
0

Во-первых, полезно создать базу данных с именем, совпадающим с вашим текущим использованием, чтобы предотвратить ошибку, когда вы просто хотите использовать базу данных по умолчанию и создавать новые таблицы без явного объявления имени базы данных.

Замените "skynotify" на ваше имя пользователя:

psql -d postgres -c "CREATE DATABASE skynotify ENCODING 'UTF-8';"

-d явно объявляет, какую базу данных использовать по умолчанию для операторов SQL, которые явно не включают имя БД во время этого интерактивного сеанса.

Основы для получения четкого изображения того, что ваш сервер PostgresQL имеет в нем.

Вы должны подключиться к существующей базе данных, чтобы использовать psql в интерактивном режиме. К счастью, вы можете запросить у psql список баз данных:

psql -l

,

                                          List of databases
               Name               | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
----------------------------------+-----------+----------+-------------+-------------+-------------------
 skynotify                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 myapp_dev                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres                         | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ruby-getting-started_development | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/skynotify          +
                                  |           |          |             |             | skynotify=CTc/skynotify
 template1                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/skynotify          +
                                  |           |          |             |             | skynotify=CTc/skynotify
(6 rows)

Это НЕ запускает интерактивную консоль, она просто выводит текстовую таблицу на терминал.

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

Аналогичным образом выберите таблицы из базы данных:

psql -d postgres -c "\dt;"

Моя база данных "postgres" не имеет таблиц, но любая база данных, которая делает это, будет выводить текстовую таблицу на терминал (стандартное завершение).

И для полноты мы можем выбрать все строки из таблицы:

psql -d ruby-getting-started_development -c "SELECT * FROM widgets;"

,

 id | name | description | stock | created_at | updated_at 
----+------+-------------+-------+------------+------------
(0 rows)

Даже если будет возвращено ноль строк, вы получите имена полей.

Если в ваших таблицах более десятка строк, или вы не уверены, будет полезно начать с подсчета строк, чтобы понять, сколько данных в вашей базе данных:

 psql -d ruby-getting-started_development -c "SELECT count(*) FROM widgets;"

,

 count 
-------
     0
(1 row)

И пусть эта «1 строка» вас не смущает, она просто показывает, сколько строк возвращено запросом, но 1 строка содержит желаемое количество, которое в данном примере равно 0.

ПРИМЕЧАНИЕ. БД, созданная без определения владельца, будет принадлежать текущему пользователю.

Sky Notify
источник
0

Я попробовал некоторые из этих решений, но они не совсем работали (хотя они были очень на правильном пути!)

В итоге моя ошибка была:

FATAL: аутентификация по паролю не удалась для пользователя

когда я выполнил следующую команду: psql

Итак, я запустил эти две команды:

dropdb()
createdb()

ПРИМЕЧАНИЕ: это приведет к удалению БД, но мне это не нужно, и по какой-то причине я больше не могу получить доступ к pqsl, поэтому я удалил и воссоздал его. Затем psqlснова работал.

Бен Картрайт
источник
0

Не уверен, что он уже добавлен в ответах, ответ Анатолия Степанюка был очень полезен:

psql -U Username postgres # when you have no databases yet
yosemite_k
источник
-1

Возникла эта проблема при установке postgresql через homebrew.

Пришлось создать супер-пользователя по умолчанию "postgres" с:

createuser --interactive postgres answer y для супер пользователя

createuser - интерактивный ответ пользователя для супер пользователя

Unom
источник
-3

У меня все еще была проблема выше после установки postgresql с помощью homebrew - я решил ее, добавив / usr / local / bin в мой путь перед / usr / bin

matw50
источник
-12

В простейшем объяснении; это нуб проблема. Просто печатать

pgres

приведет к этому ответу.

pgres <db_name> 

будет успешно без ошибок, если у пользователя есть права доступа к БД.

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

Джон Доу
источник
5
На самом деле не нравится «тип вопроса о нубах»
Киммо Хинтикка
Также он не рекомендовал, как решить проблему, поэтому не ответил на вопрос.
Дебора
1
никогда не слышал оpgres
Гленн Плас