psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: role "yourname" does not existलोगों को भ्रमित करता है क्योंकि उन्होंने कभी भी “आपका नाम” के रूप में जुड़ने के लिए नहीं कहा। PostgreSQL डेटाबेस उपयोगकर्ता नाम को आपके ऑपरेटिंग सिस्टम उपयोगकर्ता नाम पर डिफॉल्ट करता है, और जब तक कोई मेल खाने वाली भूमिका मौजूद नहीं होती, कनेक्शन विफल हो जाता है।
📋 Table of Contents
- ऐसा क्यों होता है
- सबसे तेज़ जांच – पुष्टि करें कि सर्वर चल रहा है और पहुंच योग्य है।
- यह स्थानीय विकास के लिए उचित समाधान है, क्योंकि यह नंगे
- भूमिका बनाने से अक्सर अगली त्रुटि उत्पन्न होती है, जिसे लोग गलती से वही समस्या समझ लेते हैं।
- यदि आप अपने OS उपयोगकर्ता नाम से मेल खाने वाली भूमिका नहीं चाहते हैं, तो जिसे आप चाहते हैं उसे पास कर दें।
- एक कंटेनर के अंदर, भूमिका जो भी हो
- लिनक्स पर, स्थानीय सॉकेट कनेक्शन आमतौर पर
- आमतौर पर काम करता है. Postgres.app इसी तरह व्यवहार करता है। यदि आप macOS पर यह त्रुटि देखते हैं, तो सामान्य कारण यह है कि सेवा नहीं चल रही है या कोई पुराना इंस्टॉलेशन नए को छाया दे रहा है।
- संबंधित त्रुटियाँ
- मतलब
- ए: कोई नहीं, कार्यात्मक रूप से।
- आपके OS उपयोगकर्ता नाम पर डिफ़ॉल्ट।
ऐसा क्यों होता है
जब आप दौड़ते हैंpsql बिना किसी तर्क के, PostgreSQL तीन डिफ़ॉल्ट भरता है:
- उपयोगकर्ता नाम — आपका OS उपयोगकर्ता नाम
- डेटाबेस — उपयोक्तानाम के समान
- मेज़बान – स्थानीय यूनिक्स सॉकेट
तो एक मशीन पर जहां आपaliceके रूप में लॉग इन करते हैं , सादाpsql इसका अर्थ है “डेटाबेस से कनेक्ट करेंaliceभूमिका के रूप में “। एक ताज़ा PostgreSQL इंस्टाल केवलaliceबनाता है सुपरयूजर भूमिका, ताकि कनेक्शन तुरंत विफल हो जाए।postgresसमाधान 1: पोस्टग्रेस भूमिका के रूप में कनेक्ट करें
सबसे तेज़ जांच – पुष्टि करें कि सर्वर चल रहा है और पहुंच योग्य है।
यदि यह कनेक्ट होता है, तो सर्वर ठीक है और आपको केवल अपनी भूमिका बनाने की आवश्यकता है।
# Linux: the postgres OS user maps to the postgres role
sudo -u postgres psql
# macOS with Homebrew: your own user is usually the superuser
psql postgres
# Explicit form that works anywhere
psql -U postgres -d postgres -h localhost
समाधान 2: एक ऐसी भूमिका बनाएं जो आपके उपयोगकर्ता नाम से मेल खाती हो
यह स्थानीय विकास के लिए उचित समाधान है, क्योंकि यह नंगे
बनाता है जिस तरह से आपने अपेक्षा की थी उसी तरह काम करें।psqlया एसक्यूएल में, जो इस बारे में स्पष्ट है कि आप क्या दे रहे हैं:
# From the shell
sudo -u postgres createuser --interactive --pwprompt
# It will ask:
# Enter name of role to add: alice
# Enter password for new role: ****
# Shall the new role be a superuser? (y/n) n
# Shall the new role be allowed to create databases? (y/n) y
# Shall the new role be allowed to create more new roles? (y/n) n
आवश्यक है और चूकना आसान है।
sudo -u postgres psql
CREATE ROLE alice WITH LOGIN PASSWORD 'a-strong-password';
ALTER ROLE alice CREATEDB;
\q
LOGIN इसके बिना एक समूह भूमिका बनती है जो कनेक्ट नहीं हो सकती है, और आपको एक अलग भ्रमित करने वाली त्रुटि मिलती है।CREATE ROLE alice;समाधान 3: मिलान करने वाला डेटाबेस भी मौजूद होना चाहिए
भूमिका बनाने से अक्सर अगली त्रुटि उत्पन्न होती है, जिसे लोग गलती से वही समस्या समझ लेते हैं।
इसे बनाएं, या हमेशा डेटाबेस को स्पष्ट रूप से नाम दें।
psql
# psql: FATAL: database "alice" does not exist
समाधान 4: उपयोगकर्ता को स्पष्ट रूप से निर्दिष्ट करें
createdb alice
# Or specify one every time
psql -d postgres
यदि आप अपने OS उपयोगकर्ता नाम से मेल खाने वाली भूमिका नहीं चाहते हैं, तो जिसे आप चाहते हैं उसे पास कर दें।
ध्यान दें कि
psql -U myapp -d myapp_development -h localhost
# Or set it in the environment for the session
export PGUSER=myapp
export PGDATABASE=myapp_development
export PGHOST=localhost
psql
आपके प्रमाणीकरण कॉन्फ़िगरेशन के आधार पर यूनिक्स सॉकेट अभी भी विफल हो सकता है –-Uदेखें नीचे अनुभाग.peerफिक्स 5: डॉकर और डॉकर-कंपोज़
एक कंटेनर के अंदर, भूमिका जो भी हो
निर्दिष्ट किया गया जब वॉल्यूम पहली बार प्रारंभ किया गया था।POSTGRES_USERजाल:
services:
db:
image: postgres:17
environment:
POSTGRES_USER: myapp
POSTGRES_PASSWORD: secret
POSTGRES_DB: myapp_development
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
# Connect from the host
psql -U myapp -d myapp_development -h localhost -p 5432
# Connect inside the container
docker compose exec db psql -U myapp -d myapp_development
वे पर्यावरण चर केवल तभी प्रभावी होते हैं जब डेटा निर्देशिका खाली होती है। यदि आप बदलते हैं मौजूदा वॉल्यूम पर, कुछ नहीं होता है और आपको पुरानी भूमिका मिलती रहती है। इसे लागू करने के लिए वॉल्यूम दोबारा बनाएं।POSTGRES_USERसहकर्मी प्रमाणीकरण को समझना
# Destroys the database contents — make sure that is acceptable
docker compose down -v
docker compose up -d
लिनक्स पर, स्थानीय सॉकेट कनेक्शन आमतौर पर
का उपयोग करते हैं प्रमाणीकरण, जिसके लिए डेटाबेस भूमिका नाम का OS उपयोगकर्ता नाम से बिल्कुल मेल खाना आवश्यक है। यही कारण है किpeer काम करता है जबकिsudo -u postgres psql जैसा कि आपका अपना उपयोगकर्ता नहीं करता.psql -U postgres को स्विच करना लाइन टू
# Find the config file
sudo -u postgres psql -c 'SHOW hba_file;'
# e.g. /etc/postgresql/17/main/pg_hba.conf
# pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
# peer: OS username must equal the role name
local all all peer
# scram-sha-256: password authentication, any username
local all all scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
चलोlocal पासवर्ड के साथ सॉकेट पर काम करें। बाद में पुनः लोड करें – फ़ाइल स्वचालित रूप से दोबारा नहीं पढ़ी जाती है।scram-sha-256मत बदलो-U. यह सुपरयूजर्स सहित किसी भी स्थानीय उपयोगकर्ता को बिना पासवर्ड के किसी भी भूमिका के रूप में जुड़ने की अनुमति देता है।
sudo systemctl reload postgresql
# or
sudo -u postgres psql -c 'SELECT pg_reload_conf();'
macOS विशिष्टताएंpeer to trustHomebrew का PostgreSQL आपके macOS उपयोगकर्ता नाम और उसी नाम के डेटाबेस से मेल खाता हुआ एक सुपरयूज़र बनाता है, इसलिए केवल
आमतौर पर काम करता है. Postgres.app इसी तरह व्यवहार करता है। यदि आप macOS पर यह त्रुटि देखते हैं, तो सामान्य कारण यह है कि सेवा नहीं चल रही है या कोई पुराना इंस्टॉलेशन नए को छाया दे रहा है।
व्यवस्थित रूप से निदानpsqlचरण 2 और 5 की तुलना करने से लगभग हर मामले में तुरंत प्रश्न का उत्तर मिल जाता है।
brew services list
brew services start postgresql@17
# Check which psql is first on PATH
which psql
psql --version
संबंधित त्रुटियाँ
# 1. Is the server running?
pg_isready
# /tmp:5432 - accepting connections
# 2. Which roles exist?
sudo -u postgres psql -c '\du'
# 3. Which databases exist?
sudo -u postgres psql -c '\l'
# 4. What is psql defaulting to?
psql -d postgres -c 'SELECT current_user, current_database();'
# 5. What is your OS username?
whoami
त्रुटि
मतलब
| ऐसी कोई भूमिका नहीं – इसे बनाएं | भूमिका मौजूद है, डेटाबेस नहीं है – |
|---|---|
role "x" does not exist |
भूमिका बिना |
database "x" does not exist |
के बनाई गई भूमिका मौजूद है, गलत पासवर्डcreatedb x |
role "x" is not permitted to log in |
सर्वर नहीं चल रहा है या गलत होस्ट/पोर्टLOGIN |
password authentication failed |
OS उपयोगकर्ता नाम भूमिका से मेल नहीं खाता |
could not connect to server |
अक्सर पूछे जाने वाले प्रश्न |
Peer authentication failed |
प्रश्न: भूमिका और उपयोगकर्ता के बीच क्या अंतर है? |
ए: कोई नहीं, कार्यात्मक रूप से।
Q: What is the difference between a role and a user?
के लिए आशुलिपि है . PostgreSQL उपयोगकर्ताओं और समूहों दोनों के लिए “भूमिका” का उपयोग करता है।CREATE USERप्रश्न: क्या मुझे अपनी विकास भूमिका को सुपरयूज़र बनाना चाहिए?CREATE ROLE ... WITH LOGINउत्तर: विशुद्ध रूप से स्थानीय डेटाबेस के लिए, यह सुविधाजनक है। ऐसा कभी भी दूसरों की पहुंच वाली किसी चीज़ के लिए न करें, और न ही उस भूमिका के लिए करें जिससे आपका एप्लिकेशन जुड़ता है।
प्रश्न: यह डॉकर में क्यों काम करता है लेकिन होस्ट पर नहीं?
ए: विभिन्न सर्वर। कंटेनर की अपनी भूमिकाओं के साथ अपना स्वयं का PostgreSQL है। होस्ट से कनेक्ट करने के लिए पोर्ट मैपिंग और कंटेनर के क्रेडेंशियल्स की आवश्यकता होती है।
प्रश्न: मेरा ऐप ठीक से कनेक्ट होता है लेकिन psql नहीं। क्यों?
उ: ऐप में एक स्पष्ट उपयोगकर्ता नाम, पासवर्ड और होस्ट के साथ एक कनेक्शन स्ट्रिंग है। नंगे
डिफ़ॉल्ट का उपयोग करता है. अपने ऐप की कनेक्शन स्ट्रिंग से भूमिका का नाम पढ़ें और इसे
से पास करें प्रश्न: मैं किसी भूमिका का पासवर्ड कैसे बदलूं?psql एक सुपरयूजर के रूप में।-U.
निष्कर्ष
A: ALTER ROLE alice WITH PASSWORD 'new-password';इस त्रुटि का अर्थ है कि PostgreSQL ने एक ऐसी भूमिका को प्रमाणित करने का प्रयास किया जो मौजूद नहीं है – लगभग हमेशा क्योंकि
आपके OS उपयोगकर्ता नाम पर डिफ़ॉल्ट।
जाँचें कि कौन सी भूमिकाएँpsqlके साथ मौजूद हैं , तुलनासे करें , फिर या तो\duके साथ एक मेल खाती भूमिका बनाएं या पासwhoami स्पष्ट रूप से.LOGIN स्पष्ट रूप से.-U स्पष्ट रूप से.लिनक्स पर, याद रखें किpeer प्रमाणीकरण के लिए नामों का स्थानीय सॉकेट से मिलान आवश्यक है; डॉकर में, याद रखें किPOSTGRES_USER केवल तभी लागू होता है जब वॉल्यूम पहली बार बनाया जाता है।
🔗 Share this article
✍️ Leave a Comment