psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: role "yourname" does not existيربك الناس لأنهم لم يطلبوا مطلقًا الاتصال باسم “اسمك”. يقوم PostgreSQL بتعيين اسم مستخدم قاعدة البيانات افتراضيًا على اسم مستخدم نظام التشغيل الخاص بك، وما لم يوجد دور مطابق، يفشل الاتصال.
📋 Table of Contents
- لماذا يحدث
- أسرع فحص — التأكد من أن الخادم قيد التشغيل ويمكن الوصول إليه.
- هذا هو الحل المناسب للتنمية المحلية، لأنه يجعل
- غالبًا ما ينتج عن إنشاء الدور الخطأ التالي، والذي يخطئ الأشخاص في أنه نفس المشكلة.
- إذا كنت لا تريد دورًا يطابق اسم مستخدم نظام التشغيل الخاص بك، فقم بتمرير الدور الذي تريده.
- داخل الحاوية، الدور هو أي شيء
- في Linux، عادةً ما تستخدم اتصالات مأخذ التوصيل المحلي
- يقوم PostgreSQL الخاص بـ Homebrew بإنشاء مستخدم متميز يطابق اسم مستخدم macOS الخاص بك وقاعدة بيانات تحمل الاسم نفسه، لذلك فقط
- إن مقارنة الخطوتين 2 و5 تجيب على السؤال فورًا في كل حالة تقريبًا.
- خطأ
- س: ما الفرق بين الدور والمستخدم؟
- يعني هذا الخطأ أن PostgreSQL حاولت مصادقة دور غير موجود — دائمًا تقريبًا بسبب
لماذا يحدث
عند تشغيلpsql بدون وسائط، يقوم PostgreSQL بملء ثلاثة إعدادات افتراضية:
- اسم المستخدم – اسم مستخدم نظام التشغيل الخاص بك
- قاعدة البيانات – نفس اسم المستخدم
- المضيف – مقبس يونكس المحلي
لذلك على الجهاز الذي تقوم بتسجيل الدخول فيه كـaliceعاديpsql يعني “الاتصال بقاعدة البياناتaliceكدور “. يؤدي تثبيت PostgreSQL الجديد إلى إنشاءaliceفقط دور المستخدم المتميز، بحيث يفشل الاتصال على الفور.postgresالإصلاح 1: الاتصال بدور postgres
أسرع فحص — التأكد من أن الخادم قيد التشغيل ويمكن الوصول إليه.
إذا تم الاتصال، فهذا يعني أن الخادم يعمل بشكل جيد وتحتاج فقط إلى إنشاء دورك.
# 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أو في SQL، وهو أكثر وضوحًا بشأن ما تمنحه:
# 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
إذا كنت لا تريد دورًا يطابق اسم مستخدم نظام التشغيل الخاص بك، فقم بتمرير الدور الذي تريده.
لاحظ أن
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
عبر مأخذ توصيل Unix قد يستمر الفشل اعتمادًا على تكوين المصادقة الخاص بك – راجع-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
في Linux، عادةً ما تستخدم اتصالات مأخذ التوصيل المحلي
المصادقة، والتي تتطلب أن يتطابق اسم دور قاعدة البيانات مع اسم مستخدم نظام التشغيل تمامًا. لهذا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();'
. يسمح ذلك لأي مستخدم محلي بالاتصال بأي دور بدون كلمة مرور، بما في ذلك المستخدمين المتميزين.peer to trustمواصفات نظام التشغيل MacOS
يقوم PostgreSQL الخاص بـ Homebrew بإنشاء مستخدم متميز يطابق اسم مستخدم macOS الخاص بك وقاعدة بيانات تحمل الاسم نفسه، لذلك فقط
يعمل عادة. يتصرف Postgres.app بالمثل. إذا رأيت هذا الخطأ على نظام التشغيل macOS، فإن الأسباب المعتادة هي أن الخدمة لا تعمل أو أن التثبيت الأقدم يحجب التثبيت الأحدث.psqlالتشخيص بشكل منهجي
brew services list
brew services start postgresql@17
# Check which psql is first on PATH
which psql
psql --version
إن مقارنة الخطوتين 2 و5 تجيب على السؤال فورًا في كل حالة تقريبًا.
# 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 |
الخادم لا يعمل أو المضيف/المنفذ خاطئ |
could not connect to server |
اسم مستخدم نظام التشغيل لا يتطابق مع الدور |
Peer authentication failed |
الأسئلة المتداولة |
س: ما الفرق بين الدور والمستخدم؟
ج: لا شيء، من الناحية الوظيفية.
هو اختصار لـCREATE USER. يستخدم PostgreSQL “الدور” لكل من المستخدمين والمجموعات.CREATE ROLE ... WITH LOGINس: هل يجب أن أجعل دوري التطويري مستخدمًا متميزًا؟
ج: بالنسبة لقاعدة بيانات محلية بحتة، فهو مناسب. لا تفعل ذلك أبدًا من أجل أي شيء يمكن للآخرين الوصول إليه، ولا تفعل ذلك أبدًا من أجل دور يتصل به تطبيقك.
س: لماذا يعمل في Docker وليس على المضيف؟
ج: خوادم مختلفة. تحتوي الحاوية على PostgreSQL الخاصة بها مع أدوارها الخاصة. يتطلب الاتصال من المضيف تعيين المنفذ وبيانات اعتماد الحاوية.
س: تطبيقي يتصل بشكل جيد ولكن psql لا يتصل. لماذا؟
ج: يحتوي التطبيق على سلسلة اتصال تحتوي على اسم مستخدم وكلمة مرور ومضيف صريح. عارية
يستخدم الإعدادات الافتراضية. اقرأ اسم الدور من سلسلة اتصال تطبيقك وقم بتمريره باستخدامpsqlس: كيف يمكنني تغيير كلمة مرور الدور؟-U.
كمستخدم متميز.
A: ALTER ROLE alice WITH PASSWORD 'new-password';الخلاصة
يعني هذا الخطأ أن PostgreSQL حاولت مصادقة دور غير موجود — دائمًا تقريبًا بسبب
تم التخلف عن اسم مستخدم نظام التشغيل الخاص بك. psqlتحقق من الأدوار الموجودة مع، قارن مع\du، ثم أنشئ دورًا مطابقًا باستخدامwhoami أو تمريرLOGIN صراحة.-U صراحة.في نظام Linux، تذكر أنpeer تتطلب المصادقة تطابق الأسماء عبر المقابس المحلية؛ في Docker، تذكر أنPOSTGRES_USER ينطبق فقط عند إنشاء وحدة التخزين لأول مرة.
🔗 Share this article
✍️ Leave a Comment