رفع Error establishing a database connection

پیام «Error establishing a database connection» یعنی وردپرس نتوانسته به دیتابیس MySQL یا MariaDB وصل شود. چهار علت رایج دارد: اطلاعات اتصال در wp-config.php اشتباه است، سرویس دیتابیس خاموش شده، دیتابیس خراب یا پر شده، یا سرور به‌خاطر کمبود حافظه سرویس دیتابیس را متوقف کرده است. با یک بررسی چندمرحله‌ای، معمولاً در چند دقیقه علت پیدا می‌شود.

پیش از هر تغییر، از دیتابیس بکاپ بگیرید؛ بسیاری از مراحل زیر فقط می‌خوانند، ولی یک مرحله ترمیم جداول را عوض می‌کند. روش بکاپ‌گیری در بکاپ دیتابیس MySQL آمده است.

Error establishing a database connection کجا دیده می‌شود؟

جایی که پیام می‌آیدمعنی
همه صفحات سایت و پیشخوانمشکل کلی اتصال یا خود دیتابیس
فقط پیشخوان (wp-admin) با پیام «One or more database tables are unavailable»جدول خراب است
فقط گاهی و بعد خودبه‌خود درست می‌شودکمبود حافظه یا بار زیاد
بعد از انتقال سایت یا تغییر رمزاطلاعات اتصال تغییر کرده است

مرحله اول: بررسی دیتابیس در Error establishing a database connection

sudo systemctl status mysql
sudo systemctl status mariadb

یکی از این دو سرویس روی سرور شما نصب است. اگر inactive یا failed است:

sudo systemctl start mysql
sudo journalctl -u mysql --since "1 hour ago"

اگر سرویس بالا آمد و سایت درست شد، سراغ علت خاموش شدن بروید. لاگ را بخوانید؛ پیام Out of memory: Killed process یعنی سرور حافظه نداشته و دیتابیس را متوقف کرده است. کم‌کردن مصرف، اضافه کردن حافظه یا ساخت swap کمک می‌کند. بهینه‌سازی دیتابیس در بهینه سازی دیتابیس سرور آمده است.

مرحله دوم: اطلاعات اتصال در wp-config.php

فایل را باز کنید و چهار مقدار را بررسی کنید:

define( 'DB_NAME', 'wp_dbname' );
define( 'DB_USER', 'wp_user' );
define( 'DB_PASSWORD', 'رمز' );
define( 'DB_HOST', 'localhost' );

بعد با همین اطلاعات مستقیم وصل شوید:

mysql -u wp_user -p -h localhost wp_dbname

اگر خطای Access denied گرفتید، نام کاربر یا رمز اشتباه است. اگر Unknown database گرفتید، نام دیتابیس درست نیست. رمز واقعی را در پیام یا گفتگوی عمومی ننویسید. اگر کاربر وجود ندارد یا رمز باید عوض شود، با یک کاربر مدیر دیتابیس:

ALTER USER 'wp_user'@'localhost' IDENTIFIED BY 'رمز-جدید-و-قوی';
FLUSH PRIVILEGES;

بعد همان رمز را در wp-config.php بنویسید. اگر دیتابیس روی سرور جدا است، مقدار DB_HOST باید آدرس همان سرور (و در صورت نیاز پورت) باشد. بعد از انتقال سایت هم همین بخش را بررسی کنید؛ مراحل انتقال در انتقال سایت وردپرس به هاست جدید آمده است.

مرحله سوم: دسترسی کاربر به دیتابیس

ممکن است کاربر وجود داشته باشد ولی به دیتابیس دسترسی نداشته باشد:

SHOW GRANTS FOR 'wp_user'@'localhost';

اگر دسترسی روی دیتابیس وردپرس نیست:

GRANT ALL PRIVILEGES ON wp_dbname.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;

برای وردپرس فقط روی همان دیتابیس دسترسی بدهید و از کاربر root در wp-config.php استفاده نکنید.

مرحله چهارم: ترمیم جداول خراب

اگر پیام درباره جدول در دسترس نبودن است، وردپرس ابزار ترمیم دارد. در wp-config.php این خط را موقتاً اضافه کنید:

define( 'WP_ALLOW_REPAIR', true );

بعد آدرس https://example.com/wp-admin/maint/repair.php را باز کنید و گزینه Repair را بزنید. این صفحه بدون ورود در دسترس است، پس فوراً بعد از پایان کار آن خط را حذف کنید. از خط فرمان هم می‌توان:

mysqlcheck -u root -p --auto-repair --check wp_dbname

اگر دیتابیس از نوع InnoDB است و جدول واقعاً آسیب دیده، ترمیم ممکن است کافی نباشد و باید از بکاپ بازیابی کنید. بکاپ سالم داشتن و بازیابی آزمایش‌شده، تنها راه مطمئن است؛ برنامه‌ریزی آن را در بکاپ و بازیابی بحران ببینید.

مرحله پنجم: دیسک پر یا inode تمام‌شده

وقتی دیسک پر است، دیتابیس نمی‌تواند بنویسد و ممکن است بیفتد:

df -h
df -i

اگر Use% نزدیک 100 است، لاگ‌های قدیمی، بکاپ‌های بزرگ یا فایل‌های موقت را پیدا کنید. روش پیدا کردن بزرگ‌ترین فایل‌ها در راهنمای grep و find آمده است. اگر دیسک واقعاً کم است، گسترش آن را در افزایش حجم دیسک لینوکس با LVM ببینید.

مرحله ششم: محدودیت اتصال و بار زیاد

اگر خطا فقط در ساعات شلوغ می‌آید، ممکن است تعداد اتصال‌ها از حد مجاز گذشته باشد:

SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';

اگر Max_used_connections به max_connections رسیده، یا بار را کم کنید (کش، حذف افزونه‌های سنگین) یا مقدار را با توجه به حافظه بالا ببرید. بالا بردن بی‌حساب آن حافظه را تمام می‌کند و علت اصلی را حل نمی‌کند.

مرحله هفتم: بررسی از طریق WP-CLI

اگر دسترسی SSH دارید:

wp db check
wp db size --tables

دستور اول وجود اتصال و سلامت جداول را بررسی می‌کند. اگر WP-CLI هم خطای اتصال می‌دهد، مشکل قطعاً در اطلاعات اتصال یا خود دیتابیس است و به وردپرس و افزونه‌ها ربطی ندارد.

جدول عیب‌یابی سریع

نشانهعلت محتملراه حل
سرویس mysql خاموش استکمبود حافظه یا خطای دیسکشروع سرویس و بررسی لاگ
Access denied for userرمز یا نام کاربر اشتباهاصلاح wp-config.php یا تغییر رمز
Unknown databaseنام دیتابیس اشتباه یا حذف‌شدهبررسی نام یا بازیابی از بکاپ
بعد از انتقال سایتDB_HOST یا اطلاعات قدیمیبه‌روزرسانی wp-config.php
پیام جدول در دسترس نیستجدول خرابترمیم با repair یا بازیابی بکاپ
فقط در ساعات شلوغحد اتصال یا کمبود منابعبهینه‌سازی و بررسی max_connections
No space left on deviceدیسک یا inode پرپاک‌سازی یا افزایش حجم

سوالات متداول

آیا با این خطا اطلاعات سایت از بین رفته است؟

معمولاً خیر. در بیشتر موارد داده‌ها سر جایشان است و فقط اتصال برقرار نمی‌شود. تا قبل از تغییر، بکاپ بگیرید.

آیا برای رفع آن باید وردپرس را دوباره نصب کنم؟

نه. نصب مجدد لازم نیست و ممکن است اطلاعات را عوض کند. علت را در اتصال یا دیتابیس پیدا کنید.

چرا بعد از انتقال هاست این خطا آمد؟

دیتابیس جدید نام، کاربر یا رمز متفاوتی دارد و باید در wp-config.php به‌روز شود. بعضی هاست‌ها مقدار DB_HOST غیر از localhost می‌خواهند.

چطور از تکرار آن جلوگیری کنم؟

بکاپ منظم، پایش وضعیت سرویس دیتابیس و فضای دیسک، و تنظیم حافظه متناسب با ترافیک. هشدار قطع سایت را با ابزارهای پایش بگیرید.

منابع

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *