خطای اتصال دیتابیس: چرا سایت شما ناگهان از دسترس خارج میشود؟
یکی از ترسناکترین لحظات برای هر مدیر سایتی، مشاهده پیغام خطای اتصال دیتابیس (Database Connection Error) است. این خطا معمولاً بهصورت ناگهانی ظاهر میشود و دسترسی به کل سایت را مسدود میکند. در وردپرس، این خطا اغلب با پیام "Error Establishing a Database Connection" همراه است، اما در اپلیکیشنهای PHP سفارشی ممکن است خطاهای متفاوتی مانند "PDOException: SQLSTATE[HY000] [2002]" یا "mysqli::connect(): (HY000/2002)" را ببینید.
خبر خوب این است که در اکثر موارد، این خطا قابلرفع است و نیازی به وحشت ندارد. در این مقاله، هفت علت رایج خطای اتصال دیتابیس را به ترتیب اولویت بررسی میکنیم و راهحل عملی هرکدام را با دستورات واقعی ارائه میدهیم. این ترتیب بر اساس تجربه عملی و احتمال وقوع هر مشکل طراحی شده است.
اگر از سرویسهای میزبانی وب حرفهای مانند سرورنت استفاده میکنید، معمولاً ابزارهای مانیتورینگ و پشتیبانی فنی برای رفع این خطا در دسترس هستند. اما دانستن اصول عیبیابی به شما کمک میکند در کمترین زمان ممکن مشکل را حل کنید.
علت اول: اطلاعات اتصال نادرست در فایل کانفیگ
شایعترین دلیل خطای اتصال دیتابیس، اشتباه در اطلاعات اتصال است. در وردپرس، این اطلاعات در فایل wp-config.php ذخیره میشود. در اپلیکیشنهای PHP دیگر، معمولاً فایلهایی مانند config.php، .env یا database.php مسئول این تنظیمات هستند.
بررسی فایل wp-config.php در وردپرس
فایل wp-config.php را با یک ویرایشگر متن باز کنید و این چهار خط را بررسی کنید:
define('DB_NAME', 'your_database_name');
define('DB_USER', 'your_database_user');
define('DB_PASSWORD', 'your_database_password');
define('DB_HOST', 'localhost');
اشتباهات رایج:
- DB_HOST: اگر دیتابیس روی یک سرور مجزا باشد، مقدار آن باید IP یا دامنه سرور دیتابیس باشد (مثلاً
192.168.1.100یاdb.example.com). استفاده ازlocalhostدر این حالت باعث خطا میشود. - DB_PASSWORD: ممکن است پسورد حاوی کاراکترهای خاصی باشد که در رشته PHP درست تفسیر نشوند. اگر پسورد شامل
'(آپاستروف) است، باید آن را با\'escape کنید. - DB_NAME: نام دیتابیس باید دقیقاً مطابق با نام ایجاد شده در MySQL باشد. حروف بزرگ و کوچک در نام دیتابیس در لینوکس حساس هستند.
نکته عیبیابی: یک فایل PHP ساده به نام test-db.php در ریشه سایت ایجاد کنید و کد زیر را در آن قرار دهید:
<?php
$link = mysqli_connect('localhost', 'your_user', 'your_password', 'your_database');
if (!$link) {
die('خطا: ' . mysqli_connect_error());
}
echo 'اتصال موفقیتآمیز بود';
mysqli_close($link);
?>
سپس این فایل را در مرورگر باز کنید. اگر خطا نشان داد، دقیقاً میتوانید ببینید مشکل از کدام بخش است.
علت دوم: خرابی یا حذف شدن دیتابیس
گاهی اوقات دیتابیس به دلایل مختلف خراب میشود یا بهطور تصادفی حذف میگردد. این مشکل معمولاً با خطاهای متفاوتی همراه است.
بررسی وجود دیتابیس و جداول
از طریق SSH یا cPanel به سرور متصل شوید و با دستور زیر وارد MySQL شوید:
mysql -u root -p
سپس دیتابیسهای موجود را لیست کنید:
SHOW DATABASES;
اگر دیتابیس شما در لیست نبود، باید آن را بازسازی کنید. اگر دیتابیس وجود داشت اما جداول خراب هستند، از دستور زیر برای تعمیر استفاده کنید:
mysqlcheck -u root -p --auto-repair --all-databases
اشتباه رایج: بسیاری از کاربران تصور میکنند که اگر دیتابیس در phpMyAdmin نمایش داده شود، حتماً سالم است. اما گاهی جداول داخلی دیتابیس (مانند wp_options در وردپرس) خراب میشوند و باعث خطای اتصال میشوند. همیشه از دستور mysqlcheck برای بررسی استفاده کنید.
علت سوم: محدودیت منابع سرور (MySQL از کار افتاده)
یکی از دلایل پنهان خطای اتصال دیتابیس، مصرف بیش از حد منابع توسط MySQL است. وقتی حافظه یا CPU سرور به حداکثر میرسد، سرویس MySQL ممکن است بهطور خودکار متوقف شود.
بررسی وضعیت سرویس MySQL
در سرورهای لینوکسی، با دستور زیر وضعیت MySQL را بررسی کنید:
systemctl status mysql
اگر سرویس فعال نبود، آن را راهاندازی کنید:
systemctl start mysql
برای بررسی لاگ خطاهای MySQL از دستور زیر استفاده کنید:
tail -100 /var/log/mysql/error.log
در این لاگ معمولاً خطاهایی مانند "Out of memory" یا "Too many connections" دیده میشود که نشاندهنده محدودیت منابع است.
راهحل موقت: اگر سرور شما رم کافی ندارد، میتوانید پارامترهای MySQL را در فایل /etc/mysql/my.cnf تنظیم کنید. مثلاً مقدار max_connections را کاهش دهید:
[mysqld]
max_connections = 50
innodb_buffer_pool_size = 256M
پس از تغییر، سرویس را ریستارت کنید.
علت چهارم: فایروال یا محدودیت IP
اگر دیتابیس روی یک سرور مجزا (مثلاً سرور دیتابیس اختصاصی) قرار دارد، ممکن است فایروال سرور دیتابیس اتصال از IP سرور وب شما را مسدود کرده باشد.
بررسی دسترسی از راه دور
از سرور وب، با دستور زیر اتصال به پورت MySQL (پیشفرض 3306) را تست کنید:
telnet your-db-server-ip 3306
اگر اتصال برقرار نشد، یعنی فایروال یا تنظیمات شبکه مشکل دارد. در سرور دیتابیس، با دستور زیر قوانین iptables را بررسی کنید:
iptables -L -n | grep 3306
همچنین در MySQL، کاربر دیتابیس باید اجازه اتصال از IP سرور وب را داشته باشد. با دستور زیر در MySQL بررسی کنید:
SELECT host, user FROM mysql.user WHERE user = 'your_user';
اگر مقدار host فقط localhost است، باید آن را به IP سرور وب یا % (برای همه IPها) تغییر دهید:
GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'your-web-server-ip' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES;
اشتباه رایج: استفاده از % برای همه IPها امنیت را کاهش میدهد. بهتر است دقیقاً IP سرور وب را مشخص کنید.
علت پنجم: خرابی فایلهای وردپرس یا اپلیکیشن
گاهی اوقات فایلهای اصلی وردپرس یا اپلیکیشن PHP خراب میشوند و باعث بروز خطای اتصال دیتابیس میشوند. این مشکل معمولاً پس از آپدیت ناقص یا حمله هکری رخ میدهد.
بازنشانی فایل wp-config.php
در وردپرس، اگر فایل wp-config.php خراب شده باشد، میتوانید آن را با یک نسخه تمیز جایگزین کنید. ابتدا فایل فعلی را بکاپ بگیرید:
cp wp-config.php wp-config.php.backup
سپس یک فایل جدید از روی نمونه ایجاد کنید:
cp wp-config-sample.php wp-config.php
حالا اطلاعات دیتابیس صحیح را در فایل جدید وارد کنید.
برای اپلیکیشنهای PHP دیگر، فایلهای کانفیگ را با نسخه اصلی (معمولاً در مخزن گیت یا بسته نصب) مقایسه کنید.
علت ششم: مشکل در DNS یا Hostname دیتابیس
اگر در تنظیمات اتصال از hostname (مثلاً db.example.com) استفاده میکنید، ممکن است DNS بهدرستی resolve نشود.
تست DNS resolution
از سرور وب، با دستور زیر hostname را به IP تبدیل کنید:
nslookup db.example.com
اگر پاسخ درستی دریافت نکردید، در فایل /etc/hosts یک نگاشت دستی اضافه کنید:
192.168.1.100 db.example.com
سپس اتصال را دوباره تست کنید.
علت هفتم: نسخه ناسازگار PHP یا MySQL
گاهی اوقات پس از آپدیت PHP یا MySQL، نسخهها با یکدیگر سازگار نیستند. مثلاً وردپرس نسخه ۵.۰ با PHP 8.0 به خوبی کار میکند، اما برخی افزونههای قدیمی ممکن است با نسخه جدید PHP مشکل داشته باشند.
بررسی نسخهها
نسخه PHP را با دستور زیر بررسی کنید:
php -v
نسخه MySQL را:
mysql --version
اطمینان حاصل کنید که اپلیکیشن شما از این نسخهها پشتیبانی میکند. برای وردپرس، حداقل نیاز به PHP 7.4 و MySQL 5.6 است.
نکته مهم: اگر از MySQL 8 استفاده میکنید، ممکن است افزونههای قدیمی وردپرس با روش احراز هویت جدید MySQL (caching_sha2_password) مشکل داشته باشند. در این صورت، کاربر دیتابیس را به روش قدیمی تغییر دهید:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;
ترتیب نهایی بررسی (Checklist)
برای رفع سریع خطای اتصال دیتابیس، این ترتیب را دنبال کنید:
- فایل کانفیگ (wp-config.php یا معادل آن) را بررسی کنید.
- وضعیت سرویس MySQL را با
systemctl status mysqlچک کنید. - اتصال دستی با
mysql -u user -pرا تست کنید. - وجود دیتابیس و جداول را با
SHOW DATABASES;وmysqlcheckبررسی کنید. - فایروال و دسترسی IP را با
telnetتست کنید. - لاگ خطاهای MySQL را در
/var/log/mysql/error.logبخوانید. - در صورت نیاز، سرویس MySQL را ریستارت کنید.
با رعایت این مراحل، در ۹۰٪ موارد مشکل برطرف میشود. اگر همچنان خطا persist کرد، احتمالاً مشکل از سختافزار سرور یا تنظیمات پیشرفتهتر است که نیاز به بررسی تیم فنی دارد.