خطای اتصال دیتابیس؛ وقتی وردپرس یکباره از دسترس خارج میشود
سایت شما تا پنج دقیقه پیش کار میکرد. حالا به جای صفحه اصلی، یک جمله سفید و بیرنگ میبینید: Error establishing a database connection. بازدیدکنندهها هم دقیقاً همین را میبینند. نه صفحه ۴۰۴، نه خطای ۵۰۰، نه صفحهای که بگوید «بهزودی برمیگردیم». فقط همین جمله.
این خطا یعنی وردپرس به MySQL دسترسی ندارد. نه اینکه دیتابیس حتماً سوخته باشد. در هشت مورد از ده مورد، مشکل از جای دیگری است. بیایید به ترتیب احتمال، سراغ پنج علت واقعی برویم.
اولین تست: آیا سرویس MySQL واقعاً بالا است؟
از SSH وارد سرور شوید و این دستور را اجرا کنید:
systemctl status mysql
اگر سرویس غیرفعال است، وضعیت را ببینید:
systemctl start mysql
systemctl enable mysql
اینجا اشتباه میکنند: خیلیها بعد از ریاستارت سرور، سرویس MySQL را دوباره فعال نمیکنند. enable را اجرا نمیکنند و تا دفعه بعدی که سرور ریاستارت شود، سایت کار میکند. بعد از ریاستارت، خطا برمیگردد. اگر سرویس بالا است اما خطا persists، لاگ را چک کنید:
tail -50 /var/log/mysql/error.log
دنبال عبارت Out of memory یا Too many connections بگردید. هر دو معنی مشخصی دارند: سرور رم کافی ندارد یا تعداد اتصالهای همزمان از حد مجاز گذشته است.
تست اتصال با یک اسکریپت کوتاه
قبل از اینکه wp-config.php را دستکاری کنید، یک تست مستقیم بزنید. فایلی به نام db-test.php در ریشه سایت بسازید:
<?php
$conn = @new mysqli('localhost', 'DB_USER', 'DB_PASSWORD', 'DB_NAME');
if ($conn->connect_error) {
die('Connection failed: ' . $conn->connect_error);
}
echo 'Connected successfully';
$conn->close();
?>
مقادیر DB_USER، DB_PASSWORD و DB_NAME را از فایل wp-config.php بردارید. حالا از مرورگر به https://yourdomain.com/db-test.php بروید.
دو حالت پیش میآید. اگر پیام Connected successfully را دیدید، یعنی اتصال برقرار است و مشکل از جای دیگری است. اگر خطای Access denied for user دیدید، یعنی نام کاربری یا رمز عبور اشتباه است. این سادهترین حالت است و راهحلش هم ساده: رمز را درست کنید.
اما اگر خطای Unknown database دیدید، یعنی دیتابیس وجود ندارد. این حالت معمولاً بعد از انتقال سایت یا restore از بکاپ پیش میآید. فایل wp-config.php را باز کنید و نام دیتابیس را با دقت چک کنید. یک فاصله اضافه یا حرف بزرگ و کوچک، همین خطا را میدهد.
مشکل از wp-config.php است یا از خود MySQL؟
اسکریپت تست را که اجرا کردید، حالا میدانید مشکل کجاست. اگر اتصال با اسکریپت برقرار شد اما وردپرس همچنان خطا میدهد، سه احتمال باقی میماند.
۱. تعریفهای تکراری در wp-config.php
بعضی افزونههای کش یا امنیتی، تعریفهای دیتابیس را به فایل wp-config.php اضافه میکنند. اگر دو بار define('DB_NAME', ...) در فایل باشد، PHP فقط اولی را میخواند. فایل را باز کنید و دنبال تعریفهای تکراری بگردید. هر کدام را که اضافه است، حذف کنید.
۲. هاست دیتابیس اشتباه است
مقدار DB_HOST معمولاً localhost است. اما بعضی سرویسهای میزبانی از آدرس جداگانه استفاده میکنند. اگر سایت را از هاستی به هاست دیگر منتقل کردهاید، این مقدار را چک کنید. آدرس جدید را از پنل میزبان جدید بگیرید. در مستندات و پایگاه دانش سرورنت، جدول مقادیر پیشفرض برای هر نوع هاست را گذاشتهایم.
۳. جدولهای دیتابیس خراب شدهاند
این همان حالتی است که همه از آن میترسند. اگر اسکریپت تست اتصال برقرار کرد و wp-config.php هم سالم بود، احتمال خرابی جدولها بالا میرود. وردپرس وقتی به جدول wp_options دسترسی نداشته باشد، همین خطا را نشان میدهد. نه خطای دیگری، نه توضیح بیشتری. فقط همین جمله.
تعمیر جدول خراب؛ دستوری که جان سایت را نجات میدهد
MySQL ابزار تعمیر داخلی دارد. از SSH وارد شوید و این دستور را اجرا کنید:
mysqlcheck -u root -p --auto-repair --optimize --all-databases
این دستور همه دیتابیسها را چک میکند، جدولهای خراب را تعمیر میکند و جدولهای سالم را بهینهسازی میکند. اگر فقط دیتابیس وردپرس را میخواهید:
mysqlcheck -u root -p --auto-repair your_database_name
خروجی را بخوانید. اگر جدولی با خطای Table is marked as crashed مواجه شد، یعنی مشکل از همانجاست. دستور بالا معمولاً آن را تعمیر میکند. اگر تعمیر نشد، باید از بکاپ استفاده کنید. اینجا اشتباه میکنند: بعضیها بعد از تعمیر، سایت را چک نمیکنند و فکر میکنند کار تمام شده است. جدول تعمیرشده ممکن است دوباره خراب شود. اگر ظرف ۲۴ ساعت دوباره خطا برگشت، یعنی مشکل سختافزاری است و باید دیسک را چک کنید.
چرا این خطا ناگهانی ظاهر میشود؟
خطای اتصال دیتابیس معمولاً یکباره ظاهر میشود، نه تدریجی. سه سناریوی رایج را ببینید:
- ریاستارت ناگهانی سرور: اگر سرور به دلیل مصرف بالای RAM ریاستارت شود، MySQL ممکن است درست بالا نیاید. لاگ
/var/log/syslogرا برای عبارتOut of memoryچک کنید. - پر شدن دیسک: MySQL وقتی دیسک پر باشد، نمیتواند بنویسد و اتصال را قطع میکند. با
df -hفضای خالی را ببینید. اگر زیر ۵٪ بود، مشکل از اینجاست. - حمله یا ترافیک غیرعادی: اگر تعداد اتصالهای همزمان از
max_connectionsبگذرد، MySQL اتصالهای جدید را رد میکند. مقدار فعلی را با این دستور ببینید:
mysql -u root -p -e "SHOW VARIABLES LIKE 'max_connections';"
مقدار پیشفرض معمولاً ۱۵۱ است. اگر سایت شما واقعاً به بیشتر از این نیاز دارد، باید مقدار را در /etc/mysql/mysql.conf.d/mysqld.cnf تغییر دهید. اما اول مطمئن شوید که مشکل از کوئریهای سنگین نیست، نه از تعداد اتصال.
وقتی همه چیز درست است اما خطا persists
حالتی را در نظر بگیرید که سرویس بالا است، اسکریپت تست اتصال برقرار میکند، wp-config.php سالم است و جدولها هم تعمیر شدهاند. اما خطا هنوز هست. این حالت نادر است اما اتفاق میافتد.
مقصر معمولاً کش است. وردپرس یا افزونه کش، نتیجه خطای قبلی را در حافظه نگه داشته است. کش را خالی کنید. اگر از Redis یا Memcached استفاده میکنید، سرویس را ریاستارت کنید:
systemctl restart redis-server
systemctl restart memcached
اگر باز هم خطا ماند، DNS را چک کنید. بعضیوقتها سایت شما روی سرور درست کار میکند اما بازدیدکننده به سروری دیگر هدایت میشود. با dig yourdomain.com آدرس IP را ببینید و با IP سرور خودتان مقایسه کنید. راهنمای کامل تنظیم DNS برای سایت تازهکار را در این نوشته بخوانید.
پیشگیری؛ کاری که الان باید بکنید
این خطا را تجربه کردهاید و نمیخواهید دوباره تکرار شود. سه کار انجام دهید:
- بکاپ خودکار دیتابیس: اگر بکاپ ندارید، الان درستش کنید. نه هفته بعد، الان. یک کرونجاب ساده که هر شب از دیتابیس بکاپ میگیرد، کافی است.
- پایش خودکار: منتظر نمانید کاربران بگویند سایت از دسترس خارج شده. یک سرویس پایش آپتایم راه بیندازید که هر ۵ دقیقه سایت را چک کند و اگر خطا دید، به شما ایمیل بزند. راهنمای عملی پایش آپتایم سایت را در این نوشته بخوانید.
- مستندات خطا را نگه دارید: هر بار که این خطا را حل کردید، علت و راهحل را یادداشت کنید. دفعه بعد، ده دقیقه زودتر حلش میکنید.
اگر سرور شما منابع کافی ندارد و مکرر با این خطا مواجه میشوید، شاید وقت ارتقا باشد. هاست وردپرس سرورنت با منابع اختصاصی و پایش خودکار، این دسته از خطاها را ریشهکن میکند. اما قبل از هر اقدامی، تستهای این مقاله را اجرا کنید. هشت بار از ده بار، مشکل با یک دستور ساده حل میشود.
پرسشهای پرتکرار
خطای Error establishing a database connection یعنی چه؟
یعنی وردپرس نمیتواند به دیتابیس MySQL متصل شود. این خطا معمولاً به معنی از بین رفتن اطلاعات نیست، بلکه نشانه قطع ارتباط بین وردپرس و MySQL است. علت میتواند خاموش بودن سرویس، رمز اشتباه، یا خرابی جدول باشد.
چطور خطای اتصال دیتابیس وردپرس را بدون دسترسی SSH حل کنم؟
اگر به SSH دسترسی ندارید، از پنل مدیریت هاست استفاده کنید. در بیشتر پنلها مثل cPanel یا DirectAdmin، گزینه Restart MySQL وجود دارد. اگر نه، با پشتیبانی هاست تماس بگیرید و بگویید سرویس MySQL را ریاستارت کنند. بعد از آن، کش سایت را خالی کنید.
آیا خرابی جدول دیتابیس باعث از بین رفتن اطلاعات میشود؟
خیر. جدول خراب به معنی از بین رفتن اطلاعات نیست. دستور mysqlcheck --auto-repair معمولاً جدول را بدون از دست دادن اطلاعات تعمیر میکند. فقط در موارد نادر که دیسک آسیب دیده باشد، ممکن است اطلاعات از بین برود. به همین دلیل بکاپ منظم ضروری است.
چرا بعد از انتقال سایت به هاست جدید این خطا ظاهر میشود؟
معمولاً به دلیل اشتباه در wp-config.php است. نام دیتابیس، نام کاربری یا رمز عبور در هاست جدید متفاوت است. مقدار DB_HOST هم ممکن است تغییر کرده باشد. فایل wp-config.php را با مقادیر جدید هاست آپدیت کنید و اگر مطمئن نیستید، از پشتیبانی هاست جدید بخواهید مقادیر دقیق را بدهد.
دیدگاهها ۰
هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!