أول جدار يصطدم به كل من يبدأ ربط تطبيقه بقاعدة SQL:
ERROR 1045 (28000): Access denied for user 'root'@'localhost'
(using password: YES)
الرسالة مخيفة الشكل لكنها من أكثر الرسائل إفصاحًا — فيها ثلاث معلومات:
المستخدم (root)، المضيف الذي أتيت منه (localhost)، وهل أرسلت كلمة
مرور (YES/NO). لنستخدمها في التشخيص.
الأسباب الأربعة في جدول
| السبب | العلامة المميزة | الحل |
|---|---|---|
| لم ترسل كلمة مرور | using password: NO | أضف -p أو املأ خانة password |
| كلمة مرور خاطئة | using password: YES | صحّحها أو أعد ضبطها |
| root عبر auth_socket (أوبنتو) | الطرفية العادية تُرفض | sudo mysql ثم أنشئ مستخدم تطبيق |
| المستخدم/المضيف غير متطابقين | التطبيق يُرفض والطرفية تنجح | راجع 'user'@'host' و.env |
1) using password: NO — أنت لم ترسل شيئًا
mysql -u root # ❌ بلا -p: لن يسأل عن كلمة المرور أصلًا
mysql -u root -p # ✅ سيطلبها الآن
وفي الكود: خانة password فارغة أو undefined في الاتصال تعطي نفس
النتيجة — افحص قيمها الفعلية قبل أي شيء آخر.
2) على أوبنتو: root لا يعمل بكلمة مرور أصلًا
المفاجأة التي تصدم الجميع: في تثبيتات أوبنتو/دبيان الحديثة، مصادقة root تتم عبر auth_socket — أي عبر هوية مستخدم النظام، لا كلمة مرور:
sudo mysql # ✅ يدخل مباشرة — لأنك root النظام
ومن الداخل، الممارسة الصحيحة: أنشئ مستخدمًا خاصًا لتطبيقك بدل العبث بـ root:
CREATE USER 'thecodefix'@'localhost' IDENTIFIED BY 'كلمة-مرور-قوية';
GRANT ALL PRIVILEGES ON thecodefix_db.* TO 'thecodefix'@'localhost';
FLUSH PRIVILEGES;
لاحظ أن الصلاحيات على قاعدة التطبيق فقط (thecodefix_db.*) — لو
تسربت بيانات الاتصال يومًا تبقى بقية القواعد بأمان.
3) نسيت كلمة مرور مستخدم؟ أعد ضبطها من الداخل
-- ادخل بـ sudo mysql ثم:
ALTER USER 'thecodefix'@'localhost' IDENTIFIED BY 'الكلمة-الجديدة';
FLUSH PRIVILEGES;
ولا تنسَ تحديثها في .env تطبيقك — عدم تطابق .env مع القاعدة هو
السبب الأول لحالة "شغّال بالطرفية، مرفوض بالتطبيق".
4) فخ المضيف: 'user'@'localhost' ليس 'user'@'%'
صلاحيات MySQL تُمنح لثنائية مستخدم + مضيف. المستخدم المعرّف من
localhost يُرفض إذا اتصل من أي مكان آخر — وحاوية Docker "مكان آخر":
-- اعرف المعرَّف فعلًا:
SELECT user, host FROM mysql.user;
-- تطبيقك يتصل من حاوية/خادم آخر؟ عرّفه للمضيف الصحيح أو للجميع:
CREATE USER 'thecodefix'@'%' IDENTIFIED BY 'كلمة-مرور-قوية';
GRANT ALL PRIVILEGES ON thecodefix_db.* TO 'thecodefix'@'%';
💡 معلومة تنقذ ساعات:
localhostيتصل عبر ملف socket بينما127.0.0.1يتصل عبر TCP — بعض الإعدادات تعامل الاثنين مختلفَين. إن فشل أحدهما جرّب الآخر في.env.
قائمة تحقّق سريعة
- اقرأ
using password— NO تعني ما أرسلت، YES تعني خاطئة. - على أوبنتو:
sudo mysqlهي بوابة root — ومنها أنشئ مستخدم التطبيق. - تطبيقك لا يستخدم root أبدًا — مستخدم خاص بصلاحيات على قاعدته فقط.
- الطرفية تنجح والتطبيق يفشل؟ →
.envأو ثنائية المستخدم@المضيف. - بعد أي
CREATE/ALTER/GRANT: حدّث.envوأعد تشغيل التطبيق.
الخلاصة
Access denied رسالة دقيقة وليست غامضة: من؟ من أين؟ وبكلمة مرور أم لا؟
جاوب الأسئلة الثلاثة من نص الرسالة نفسها، وتذكّر خصوصية أوبنتو
(auth_socket)، وأعطِ تطبيقك مستخدمه الخاص — وستغلق هذا الباب نهائيًّا.
أتقن الاستعلامات في مسار SQL بالعربي، وقارن عوالم القواعد في الفرق بين SQL و NoSQL، وإذا كان خادمك في حاوية فراجع حل خطأ المنفذ المحجوز في Docker.