مقدمه
گاهی اوقات جداول MySQL ممکن است خراب شوند، به این معنی که خطایی رخ داده و دادههای موجود در آنها قابل خواندن نیستند. تلاش برای خواندن از یک جدول خراب معمولاً منجر به کرش شدن سرور میشود.
دلایل شایع خراب شدن جداول
- توقف سرویس MySQL در میانه نوشتن دادهها
- تغییر جدول توسط برنامه خارجی در حالی که توسط سرور در حال تغییر است
- خاموش شدن غیرمنتظره ماشین
- خرابی سختافزار کامپیوتر
- وجود باگ نرمافزاری در کد MySQL
اگر مشکوک به خراب شدن یکی از جداول خود هستید، قبل از شروع تعمیر یا عیبیابی، باید از دایرکتوری دادههای خود نسخه پشتیبان تهیه کنید. این کار به شما کمک میکند تا خطر از دست رفتن دادهها را به حداقل برسانید.
مراحل تعمیر جدول خراب در MySQL
ابتدا سرویس MySQL را متوقف کنید:
sudo systemctl stop mysql
توجه: در برخی سیستمها مانند Rocky Linux، سرویس MySQL ممکن است با نام mysqld
شناخته شود.
سپس تمام دادههای خود را به یک دایرکتوری پشتیبان جدید کپی کنید. در سیستمهای Ubuntu، دایرکتوری داده پیشفرض /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 استفاده میکند، فرایند تعمیر آن متفاوت خواهد بود. InnoDB از نسخه 8.0 بهعنوان موتور ذخیرهسازی پیشفرض MySQL استفاده میشود و ویژگیهای چک و تعمیر خودکار خرابیها را دارد. InnoDB صفحات خراب را با استفاده از مجموعهای (checksum) هر صفحه که میخواند شناسایی میکند و اگر تفاوتی در مجموعها پیدا کند، بهطور خودکار سرور MySQL را متوقف میکند.
به ندرت نیاز به تعمیر جداول InnoDB است، زیرا InnoDB مکانیزم بازیابی کرش دارد که میتواند بیشتر مشکلات را با راهاندازی مجدد سرور حل کند. با این حال، اگر در موقعیتی قرار گرفتید که نیاز به بازسازی جدول InnoDB دارید، مستندات MySQL روش Dump and Reload را توصیه میکند. این روش شامل دسترسی مجدد به جدول خراب، استفاده از ابزار mysqldump
برای تهیه نسخه پشتیبان منطقی از جدول است که ساختار جدول و دادههای داخل آن را حفظ میکند و سپس جدول را دوباره وارد پایگاه داده میکند.
راهاندازی مجدد سرویس MySQL
در ابتدا سعی کنید سرویس MySQL را مجدداً راهاندازی کنید تا ببینید آیا این کار به شما دسترسی به سرور را میدهد یا خیر:
sudo systemctl restart mysql
اگر سرور هنوز خراب است یا قابل دسترسی نیست، میتوانید گزینه force_recovery
را در تنظیمات InnoDB فعال کنید. برای این کار فایل mysqld.cnf
را ویرایش کنید. در سیستمهای Ubuntu و Debian، این فایل معمولاً در /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
برای گرفتن نسخه پشتیبان از دادههای جدول استفاده کنید. شما میتوانید این فایل را هر نامی که میخواهید بدهید، اما در اینجا آن را out.sql
مینامیم:
mysqldump database_name table_name > out.sql
سپس جدول را از پایگاه داده حذف کنید. برای این کار میتوانید از دستور زیر استفاده کنید:
mysql -u user -p --execute="DROP TABLE database_name.table_name"
در نهایت جدول را با استفاده از فایل dump
که اخیراً ایجاد کردهاید بازیابی کنید:
mysql -u user -p < out.sql
توجه داشته باشید که موتور ذخیرهسازی InnoDB عموماً نسبت به موتور قدیمیتر MyISAM مقاومتر است. جداولی که از InnoDB استفاده میکنند ممکن است همچنان خراب شوند، اما به دلیل ویژگیهای خودترمیمی آن، خطر خرابی و کرش شدن جدول بسیار کمتر است.
نتیجه
با دنبال کردن این راهنما، نحوه تعمیر جداول خراب در MySQL و استفاده از روشهای مختلف برای حل مشکلات در هر دو موتور ذخیرهسازی MyISAM و InnoDB را یاد گرفتید. همیشه پیش از انجام هر گونه تغییر، از دادههای خود نسخه پشتیبان تهیه کنید تا از خطر از دست رفتن دادهها جلوگیری کنید.