وردپرس و ووکامرس

رفع خطای Error establishing a database connection در وردپرس

خطای Error establishing a database connection یعنی وردپرس نتوانسته به دیتابیس وصل شود. علت معمولا یکی از چند مورد مشخص است: اطلاعات اشتباه در wp-config.php، کاربری که به دیتابیس دسترسی ندارد، جدول خراب، فضای پر یا فشار روی سرور MySQL.

نوشته تیم فنی پیکوهاستبه روزرسانی: ۳ آبان ۱۴۰۵۸ دقیقه مطالعه

پاسخ کوتاه

خطای Error establishing a database connection یعنی وردپرس به MySQL وصل نمی شود. اول مقدار DB_NAME و DB_USER و DB_PASSWORD و DB_HOST را در wp-config.php با اطلاعات دیتابیس در cPanel مقایسه کنید. بعد دسترسی کاربر به دیتابیس، سالم بودن جدول ها، فضای آزاد حساب و در دسترس بودن phpMyAdmin را بررسی کنید.

وقتی به جای سایت فقط جمله Error establishing a database connection را می بینید، وردپرس در همان لحظه نتوانسته به دیتابیس MySQL وصل شود. بدون دیتابیس، وردپرس هیچ نوشته، تنظیم یا کاربری ندارد و چیزی برای نمایش نمی ماند. در بیشتر موارد داده ها از بین نرفته اند و فقط ارتباط برقرار نمی شود. علت ها در ادامه به ترتیب احتمال آمده اند و برای هر کدام مشخص شده در cPanel کجا را نگاه کنید.

این خطا دقیقا یعنی چه؟

هر بار که صفحه ای از سایت وردپرسی باز می شود، کد PHP با چهار مقدار به دیتابیس وصل می شود: نام دیتابیس، نام کاربر، رمز کاربر و آدرس سرور دیتابیس. این چهار مقدار در فایل wp-config.php نوشته شده اند. اگر یکی از آن ها با واقعیت نخواند، یا خود سرور MySQL در دسترس نباشد، وردپرس همین پیام را نشان می دهد.

دو حالت را از هم جدا کنید، چون مسیر رفع متفاوت است:

  • خطا همیشه هست و سایت هیچ وقت بالا نمی آید. معمولا مشکل در اطلاعات اتصال، کاربر دیتابیس یا خود دیتابیس است.
  • خطا گاهی می آید و گاهی نمی آید. معمولا مشکل از فشار روی سرور، سقف منابع حساب یا قطع کوتاه MySQL است.

اگر خطا فقط در بخش مدیریت وردپرس با عبارتی مثل Database may need to be repaired دیده می شود، یعنی اتصال برقرار است ولی یک یا چند جدول خراب شده اند. برای آن حالت به بخش تعمیر جدول ها بروید.

قدم اول: چهار مقدار wp-config.php

در cPanel از Files وارد File Manager شوید و فایل wp-config.php را در پوشه نصب وردپرس باز کنید. معمولا این پوشه public_html است. ابتدا از فایل یک نسخه کپی بگیرید و کپی را بیرون از public_html نگه دارید، یا بعد از کار پاک کنید. فایلی مثل wp-config.php.bak داخل پوشه سایت با آدرس مستقیم قابل دانلود است و رمز دیتابیس را لو می دهد. چهار خط مهم شبیه این هستند:

define( 'DB_NAME', 'cpuser_wp1' );
define( 'DB_USER', 'cpuser_wpuser' );
define( 'DB_PASSWORD', 'رمز' );
define( 'DB_HOST', 'localhost' );

در cPanel نام دیتابیس و نام کاربر دیتابیس با نام کاربری حساب شروع می شود، مثلا cpuser_wp1، و جا انداختن این پیشوند خطای رایجی است. اگر موقع انتقال سایت فقط wp1 را وارد کرده باشید، اتصال شکست می خورد. مقدار دقیق را از خود cPanel کپی کنید و دستی تایپ نکنید.

برای مقایسه، در cPanel از Databases وارد MySQL Databases شوید. فهرست Current Databases نام دقیق دیتابیس ها را نشان می دهد و فهرست Current Users نام کاربرها را. هر دو را با فایل wp-config.php حرف به حرف مقایسه کنید. حروف بزرگ و کوچک و خط زیر بین اجزای نام مهم اند.

درباره DB_HOST: روی بیشتر هاست های cPanel مقدار localhost درست است. اگر هاست شما مقدار دیگری اعلام کرده، همان را بگذارید. بعد از انتقال سایت از سرویس دیگر، اغلب این خط هنوز آدرس سرور قبلی را دارد و دقیقا به همین دلیل خطا می آید. در راهنمای انتقال سایت وردپرس هم همین مورد در فهرست بررسی بعد از انتقال آمده است.

رمز کاربر دیتابیس را دوباره بگذارید

رمز دیتابیس را نمی شود در cPanel دید، ولی می شود عوض کرد. اگر مطمئن نیستید رمز داخل wp-config.php درست است، در همان صفحه MySQL Databases پایین تر در بخش Current Users روی Change Password کنار کاربر بزنید و رمز تازه بگذارید. بعد همان رمز را در wp-config.php جایگزین کنید.

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

کاربر به دیتابیس دسترسی دارد؟

ساختن دیتابیس و ساختن کاربر در cPanel دو کار جدا هستند. کاربری که به هیچ دیتابیسی اضافه نشده، می تواند وارد MySQL شود ولی به دیتابیس شما دسترسی ندارد. این حالت بعد از ساخت دستی دیتابیس بسیار پیش می آید.

در MySQL Databases پایین صفحه بخش Add User To Database را باز کنید. کاربر و دیتابیس را انتخاب کنید، روی Add بزنید و در صفحه بعد All Privileges را فعال کنید. در فهرست Current Databases باید کنار نام دیتابیس، کاربر شما دیده شود.

با یک فایل کوچک اتصال را جدا از وردپرس تست کنید

برای این که بدانید مشکل از وردپرس است یا از خود اتصال، یک فایل تست بسازید. در public_html فایلی با نام تصادفی و سخت حدس، مثلا t8k2x9q.php، درست کنید و مقدارهای واقعی را جایگزین کنید. PHP 8.1 و جدیدتر هنگام خطای اتصال به جای پیام ساده یک استثنا پرتاب می کند، پس خطا را همین طور بگیرید:

<?php
mysqli_report(MYSQLI_REPORT_OFF);
$c = @new mysqli('localhost', 'cpuser_wpuser', 'رمز', 'cpuser_wp1');
echo $c->connect_error ? $c->connect_error : 'OK';

آدرس دامنه-شما/t8k2x9q.php را یک بار باز کنید و بلافاصله فایل را پاک کنید، چون رمز دیتابیس داخلش به صورت متن ساده است. اگر نوشته OK دیده شد، اتصال سالم است و مشکل در مقدارهای wp-config.php یا جای دیگری از وردپرس است. اگر پیام Access denied for user آمد، نام کاربر، رمز یا دسترسی اشتباه است. اگر پیام Unknown database آمد، نام دیتابیس درست نیست. پیام Can't connect یا Connection refused معمولا یعنی خود سرور MySQL در دسترس نیست.

جدول های خراب را تعمیر کنید

گاهی اتصال برقرار است ولی یکی از جدول ها بعد از قطع برق، پر شدن فضا یا بسته شدن ناگهانی MySQL خراب شده است. نشانه معمول، پیام Database may need to be repaired یا پیام درباره در دسترس نبودن جدول ها در بخش مدیریت است.

دو راه برای تعمیر وجود دارد. راه اول در cPanel است: در MySQL Databases بخش Modify Databases گزینه های Check Database و Repair Database را دارد. دیتابیس سایت را انتخاب کنید و اول Check را اجرا کنید. اگر خطایی گزارش شد، Repair را بزنید.

راه دوم خود وردپرس است. این خط را به wp-config.php اضافه کنید:

define( 'WP_ALLOW_REPAIR', true );

بعد آدرس دامنه-شما/wp-admin/maint/repair.php را باز کنید و دکمه Repair Database را بزنید. این صفحه بدون ورود هم کار می کند و به همین دلیل بعد از تعمیر باید خط WP_ALLOW_REPAIR را از فایل حذف کنید. تا وقتی این خط هست، هر کسی که آدرس را بداند می تواند صفحه تعمیر را باز کند.

پیش از هر تعمیر از دیتابیس بکاپ بگیرید. روش بکاپ و بازیابی دیتابیس در راهنمای بکاپ و ریستور در cPanel آمده است.

فضای پر حساب هم همین خطا را می سازد

اگر دیسک سرور یا سهم حساب پر شود، در بعضی پیکربندی ها نوشتن در دیتابیس یا ساختن فایل موقت با خطا روبه رو می شود و نتیجه می تواند همین خطای اتصال باشد. اثر دقیق به تنظیم هاست بستگی دارد. بیشتر وقت ها پر شدن حساب اول جلوی نوشتن کش، سشن و آپلود را می گیرد. اگر سایت تا دیروز درست کار می کرد و چیزی را عوض نکرده اید، این علت را جدی بگیرید.

در صفحه اصلی cPanel مصرف دیسک و تعداد فایل ها را ببینید. اگر یکی به سقف رسیده، اول فضا را آزاد کنید و بعد دوباره سایت را باز کنید. روش پیدا کردن بزرگ ترین مصرف کننده ها در راهنمای پر شدن فضای هاست توضیح داده شده است. جدول های بزرگ لاگ و ترنزینت در دیتابیس هم ارزش بررسی دارند. روی بعضی هاست ها حجم دیتابیس هم از سهم دیسک حساب کم می شود.

فشار روی MySQL و سقف منابع

اگر خطا فقط در ساعت های شلوغ می آید و با رفرش دوباره سایت بالا می آید، ظرفیت را بررسی کنید. هر حساب هاست سقفی برای منابع پردازشی و تعداد اتصال همزمان به دیتابیس دارد و سقف را پلن شما تعیین می کند. وقتی افزونه ای کوئری سنگین بزند یا ترافیک ناگهان بالا برود، اتصال های تازه رد می شوند و وردپرس همین پیام را می دهد.

برای تشخیص، در cPanel بخش Metrics یا Resource Usage را نگاه کنید. نام دقیق آن به نسخه و تم بستگی دارد. اگر مصرف به سقف می رسد، سقف را در راهنمای خطای 508 ببینید. راه حل معمول بهینه کردن کوئری ها و کش است. اگر سایت واقعا بزرگ شده، ارتقای پلن راه حل بعدی است.

اگر هیچ کدام از موارد بالا پیدا نشد و حتی فایل تست هم Connection refused می دهد، احتمالا سرویس MySQL روی سرور مشکل دارد. در این حالت تیکت بزنید و پیام دقیقی را که فایل تست نشان می دهد بنویسید.

بعد از رفع، این موارد را بررسی کنید

  • صفحه اصلی و یک نوشته داخلی را باز کنید.
  • وارد wp-admin شوید و یک تغییر کوچک ذخیره کنید تا مطمئن شوید نوشتن در دیتابیس هم کار می کند.
  • فایل تست و خط WP_ALLOW_REPAIR را پاک کنید.
  • مقدار رمز دیتابیس را جایی امن ثبت کنید، تا دفعه بعد مجبور به ریست نشوید.
  • اگر تازه سایت را منتقل کرده اید، لینک ها و تصاویر را هم نگاه کنید. مشکل محتوای مختلط در راهنمای خطای mixed content آمده است.

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

بیشتر دفعه ها این خطا بعد از یک تغییر پیش می آید: انتقال سایت، تغییر رمز دیتابیس یا پر شدن فضا. قبل از هر تغییر از فایل ها و دیتابیس بکاپ بگیرید و بعد از آن چهار مقدار wp-config.php را یک بار مقایسه کنید. بکاپ منظم با افزونه یا با ابزار cPanel بازگشت به حالت قبل را ساده می کند.

اگر دیتابیس را خودتان روی VPS مدیریت می کنید، لاگ خود MySQL را هم بخوانید. معمولا در /var/log/ یا پوشه داده MySQL است و علت قطع شدن سرویس، مثلا کمبود حافظه، را همان جا می بینید. نام منوهای cPanel را هم با نسخه خودتان در docs.cpanel.net مطابقت بدهید.