مقدمه
گاهی اوقات، جداول MySQL ممکن است خراب شوند، به این معنی که خطایی رخ داده است و داده های ذخیره شده در آنها قابل خواندن نیستند. تلاش برای خواندن از جدول خراب معمولاً منجر به از کار افتادن سرور می شود.
برخی از دلایل رایج خراب شدن جداول عبارتند از:
- سرور MySQL در وسط نوشتن متوقف می شود.
- یک برنامه خارجی جدولی را تغییر می دهد که به طور همزمان توسط سرور در حال تغییر است.
- دستگاه به طور غیر منتظره خاموش می شود.
- سخت افزار کامپیوتر از کار می افتد.
- یک اشکال نرم افزاری در جایی در کد MySQL وجود دارد.
اگر مشکوک هستید که یکی از جداول شما خراب شده است، باید قبل از عیب یابی یا تلاش برای تعمیر جدول، از فهرست داده های خود یک نسخه پشتیبان تهیه کنید. این به کاهش خطر از دست دادن اطلاعات کمک می کند.
ابتدا سرویس MySQL را متوقف کنید:
sudo systemctl stop mysql
سپس تمام داده های خود را در یک پوشه پشتیبان جدید کپی کنید. در سیستم های اوبونتو، دایرکتوری پیش فرض داده ها /var/lib/mysql/ است:
cp -r /var/lib/mysql /var/lib/mysql_bkp
پس از تهیه نسخه پشتیبان، آماده هستید تا بررسی کنید که آیا جدول واقعاً خراب است یا خیر. اگر جدول از موتور ذخیرهسازی MyISAM استفاده میکند، میتوانید با راهاندازی مجدد MySQL و اجرای عبارت CHECK TABLE از اعلان MySQL، خرابی آن را بررسی کنید:
sudo systemctl start mysql
CHECK TABLE table_name;
پیامی در خروجی این بیانیه ظاهر می شود که به شما اطلاع می دهد خراب است یا خیر. اگر جدول MyISAM واقعاً خراب باشد، معمولاً می توان با صدور بیانیه REPAIR TABLE آن را تعمیر کرد:
REPAIR TABLE table_name;
با فرض موفقیت آمیز بودن تعمیر، پیامی مانند این را در خروجی خود خواهید دید:
Output
+--------------------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status | OK |
+--------------------------+--------+----------+----------+
اگر جدول هنوز خراب است، اسناد MySQL چند روش جایگزین را برای تعمیر جداول خراب پیشنهاد می کند.
از طرف دیگر، اگر جدول خراب از موتور ذخیره سازی InnoDB استفاده کند، روند تعمیر آن متفاوت خواهد بود. InnoDB موتور ذخیرهسازی پیشفرض در MySQL از نسخه 8.0 است و دارای عملیات بررسی و تعمیر خودکار خرابی است. InnoDB با انجام چکسامها در هر صفحهای که میخواند، صفحات خراب را بررسی میکند، و اگر اختلاف جمعبندی را پیدا کند، بهطور خودکار سرور MySQL را متوقف میکند.
به ندرت نیاز به تعمیر جداول InnoDB وجود دارد، زیرا InnoDB دارای مکانیزم بازیابی خرابی است که می تواند اکثر مشکلات را هنگام راه اندازی مجدد سرور حل کند. با این حال، اگر با موقعیتی مواجه شدید که باید یک جدول InnoDB خراب را بازسازی کنید، مستندات MySQL استفاده از روش Dump and Reload را توصیه میکند. این شامل بازیابی دسترسی به جدول خراب، استفاده از ابزار mysqldump برای ایجاد یک نسخه پشتیبان منطقی از جدول است که ساختار جدول و دادههای درون آن را حفظ میکند و سپس جدول را دوباره در پایگاه داده بارگذاری میکند.
با در نظر گرفتن این موضوع، سرویس MySQL را مجددا راه اندازی کنید تا ببینید آیا انجام این کار به شما امکان دسترسی به سرور را می دهد یا خیر:
sudo systemctl restart mysql
اگر سرور از کار افتاده یا غیرقابل دسترسی باشد، ممکن است فعال کردن گزینه force_recovery InnoDB مفید باشد. می توانید این کار را با ویرایش فایل mysqld.cnf انجام دهید. در سیستمهای اوبونتو و دبیان، این فایل معمولاً به صورت etc/mysql است. در سیستمهای Red Hat و Rocky، این فایل معمولاً در /etc/my.cnf.d است.
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
در بخش [mysqld] خط زیر را اضافه کنید:
. . .
[mysqld]
. . .
innodb_force_recovery=1
فایل را ذخیره کرده و ببندید و سپس دوباره سرویس MySQL را راه اندازی مجدد کنید. اگر می توانید با موفقیت به جدول خراب دسترسی پیدا کنید، از ابزار mysqldump برای تخلیه داده های جدول خود در یک فایل جدید استفاده کنید. شما می توانید این فایل را هر چه دوست دارید نام گذاری کنید، اما در اینجا نام آن را خارج می کنیم.sql:
mysqldump database_name table_name > out.sql
سپس جدول را از پایگاه داده رها کنید. برای جلوگیری از باز کردن مجدد دستور MySQL، می توانید از دستور زیر استفاده کنید:
mysql -u user -p --execute="DROP TABLE database_name.table_name"
پس از این، جدول را با فایل dump که ایجاد کرده اید بازیابی کنید:
mysql -u user -p < out.sql
توجه داشته باشید که موتور ذخیره سازی InnoDB به طور کلی نسبت به موتور قدیمی MyISAM مقاوم تر از خطا است. جداول با استفاده از InnoDB هنوز هم می توانند خراب شوند، اما به دلیل ویژگی های بازیابی خودکار آن، خطر خراب شدن جدول و خرابی به طور قابل توجهی کمتر است.