امیر توحیدی
امیر توحیدی
خواندن ۲ دقیقه·۴ سال پیش

مشکل Repair نشدن جدول Innodb

سلام وقت بخیر

در جریان اتفاقات این روز ها و مشکلاتی که هم شدن ابر آروان به وجود آورده هستید.

بعد از بازیابی اطلاعات یکی از مشتریان دیتابیس که بر روی mysql طراحی شده بود دچار مشکل و اشکالات زیاد شد .

برای حل این مشکل روی جدوال myIsam عمل Repair جدول انجام شد و کار کرد . یک سری جداول به صورت Innodb انجین هاش تنظیم شده بود

برای بازیابی این موارد به مشکلات متعدد خوردم و هر کاری کردم repair نشد و راه کار هایی که داده بودن به نتیجه نرسیدم بعد از بررسی جدول متوجه شدم یه تعداد رکورد دچار مشکل شدن که تا با Select زدن روی جدول مورد نظر باعث دان شدن سرور mysql میشن .

برای این اتفاق چند تا راه حل بود که جدول innodb بیام به myisam تبدیل کنیم و repair کنیم که به مشکلات زیادی برخوردم و این کار شدنی نبود .

https://stackoverflow.com/questions/226172/how-do-i-repair-an-innodb-table

اخر سر به این راه حل در سایت stack overflow رسیدم .

این روش به این صورت است که وقتی یه تعداد رکورد به مشکل بر می خورن میام مانند ساختار جدول اصلی یک حدول ایجاد می کنیم و مییام رکورد هارو به اون جدول منتقل می کنم و بعد جدول اصلی پاک می کنیم و اون جدول جایگزین می کنم .

این در حالتی هست که در Select کردن اطلاعات دچار مشکل نباشید که من بودم یک راه کاری این جا مطرح شده بود که جالب بود

به طور مثال جدول user من دچار مشکل شده است و من یک جدول به نام user_transfer ایجاد کردم برا یانتقال اطلاعات اومدم با این دستور به صورت محدود در جدول جدید اطلاعات منتقل کردم

INSERT user_transfer SELECT * FROM user WHERE id NOT IN (SELECT id FROM user_transfer) LIMIT 100;

با این دستور 100 تا 100 رکورد هارو به جدول جدید منتقل کردم تا جایی که به کرش خوردم اومدم اون limit به 10 تا و بعد به یکی تغییر دادم تا جایی که رکوردها مشکل دارن پیدا کنم حدود 30 رکورد مشکل داشتن (بهتر از دست دادن حدود 1200 یوزر فعال بود ) اومدن اون 30 تارو دیدم تا رکورد ای دی 810 هست به صورت مثال این اشکال ادامه دارد اومدم دستور به صورت زیر اصلاح کردم

INSERT user_transfer SELECT * FROM user WHERE id NOT IN (SELECT id FROM user_transfer) and id > 810 LIMIT 100;

و بعد از 810 زدم رکورد ها در بانک اطلاعاتی ذخیره بشه .

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


امیدوارم مشکلی که برای ابرآروان به وجود امده حل بشه و همه اطلاعاتشون بتونند برگردانند.

innodbmysqlrepair table
امیر توحیدی هستم. برنامه نویس و توسعه دهنده یا هر چیزی که شما بگید. :)
شاید از این پست‌ها خوشتان بیاید