رفتن به محتوای اصلی
دیدگاه کلود | ارائه‌کننده سرورهای ابری و اختصاصی
آموزش رفع خرابی (Corruption) جدول‌ها در MySQL

آموزش رفع خرابی (Corruption) جدول‌ها در MySQL

گاهی جدول‌های MySQL دچار خرابی (Corruption) می‌شوند. یعنی داده‌های داخل جدول دیگر قابل خواندن نیستند و در بعضی موارد حتی تلاش برای خواندن آن‌ها می‌تواند باعث کرش کردن سرور MySQL شود.

گاهی جدول‌های MySQL دچار خرابی (Corruption) می‌شوند. یعنی داده‌های داخل جدول دیگر قابل خواندن نیستند و در بعضی موارد حتی تلاش برای خواندن آن‌ها می‌تواند باعث کرش کردن سرور MySQL شود.

دلایل رایج خراب شدن جدول‌ها:

  • توقف MySQL وسط عملیات نوشتن

  • تغییر جدول توسط برنامه‌ای دیگر همزمان با کار سرور

  • خاموش شدن ناگهانی سیستم

  • خرابی سخت‌افزار

  • باگ نرم‌افزاری در MySQL

قبل از هر کاری، بکاپ بگیرید. بدون بکاپ جلو رفتن یعنی علاقه عجیب به فاجعه.


مرحله اول: گرفتن نسخه پشتیبان

ابتدا سرویس MySQL را متوقف کنید:

 
sudo systemctl stop mysql

در بعضی توزیع‌ها نام سرویس ممکن است mysqld باشد.

سپس از پوشه داده‌ها کپی بگیرید (مسیر پیش‌فرض در اوبونتو):

 
cp -r /var/lib/mysql /var/lib/mysql_bkp

حالا اگر اوضاع بدتر شد، حداقل چیزی برای برگشت دارید.


بررسی خرابی جدول‌های MyISAM

اگر جدول از موتور MyISAM استفاده می‌کند:

  1. سرویس را دوباره اجرا کنید:

 
sudo systemctl start mysql
  1. وارد MySQL شوید و جدول را بررسی کنید:

 
CHECK TABLE table_name;

اگر جدول خراب باشد، در خروجی مشخص می‌شود.

تعمیر جدول MyISAM

 
REPAIR TABLE table_name;

اگر موفق باشد، خروجی چیزی شبیه این است:

 
status | OK

اگر تعمیر نشد، باید از روش‌های پیشرفته‌تر که در مستندات MySQL آمده استفاده شود.


جدول‌های InnoDB (حالت رایج امروزی)

از MySQL 8 به بعد، موتور پیش‌فرض InnoDB است. خوشبختانه InnoDB نسبت به MyISAM خیلی مقاوم‌تر است.

ویژگی‌ها:

  • بررسی خودکار خرابی

  • مکانیزم Crash Recovery

  • توقف خودکار سرور در صورت تشخیص خطای جدی

بیشتر مواقع فقط با ریستارت مشکل حل می‌شود:

 
sudo systemctl restart mysql

اگر MySQL بالا نمی‌آید

می‌توان حالت بازیابی اجباری InnoDB را فعال کرد.

فایل تنظیمات را باز کنید:

 
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

در بخش [mysqld] این خط را اضافه کنید:

 
innodb_force_recovery=1

سپس سرویس را ریستارت کنید.

اگر با مقدار 1 بالا نیامد، می‌توان اعداد بالاتر (تا 6) را امتحان کرد، اما هرچه عدد بالاتر باشد، محدودیت‌ها بیشتر می‌شود.


روش اصلی تعمیر InnoDB: Dump و Reload

اگر جدول InnoDB خراب شده، روش توصیه‌شده:

1. خروجی گرفتن از جدول

 
mysqldump database_name table_name > out.sql

2. حذف جدول خراب

 
mysql -u user -p --execute="DROP TABLE database_name.table_name"

3. بازگردانی جدول

 
mysql -u user -p < out.sql

در این روش، ساختار جدول و داده‌ها دوباره از فایل دامپ ساخته می‌شوند.


مقایسه MyISAM و InnoDB

ویژگیMyISAMInnoDB
مقاومت در برابر خرابیکمبالا
بازیابی خودکارندارددارد
ریسک کرشبیشترکمتر
پیشنهاد برای پروژه جدید

جمع‌بندی

خرابی جدول در MySQL اتفاقی است که دیر یا زود سراغ هر مدیر سروری می‌آید. ترتیب درست کار:

  1. بکاپ بگیرید

  2. نوع موتور جدول را مشخص کنید

  3. برای MyISAM از REPAIR TABLE

  4. برای InnoDB بیشتر مواقع ریستارت کافی است

  5. در موارد جدی از روش Dump & Reload استفاده کنید

مدیریت درست بکاپ و استفاده از InnoDB می‌تواند احتمال فاجعه را به شدت کم کند.