مقدمه

چند وقت پیش حجم زیادی از اطلاعات را در یک دیتابیس وارد کردیم. تبدیل این اطلاعات به جداول تحت MySql/Mariadb بسیار زمان بر و پر زحمت بوده است. زیرا برخی از فیلد های این اطلاعات شامل تاریخ بوده که در بازه های زمانی متفاوت با فرمت های مختلف ثبت شده اند.

بروز مشکل

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

recovering-mariadb-from-ibd-and-frm-files

سروسی mysql که بر روی هر سیستم که نصب می شود به یک سری فایل به غیر فایل های اصلی جداول دیتابیس ها مثل ibdata1، ib_logfile0، ib_logfile1 و... را اجرا و تعامل دارد. به عبارت دیگر فایل های اصلی دیتابیس .frm و .idb با وجود این که حاوی اطلاعات هستند، در سرویس mysql دیگر به تنهایی قابل استفاده نمی باشند و فایل های مذکور نیز باید به همراه آن ها نیز منتقل شوند.

نکته ای که خیلی مهم بوده و باید به آن توجه داشت این است که در تنظیمات دیتابیس اولیه خط زیر باید بوده باشد. این تنظیم سرویس Mysql را ملزم می کند تا اطلاعات هر جدول را در فایل مربوط به خود آن ذخیره کند.

راهکار اول

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

راهکار دوم

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

در این مرحله، بعدی از ایجاد جدول دو فایل .frm و .idb برای آن ایجاد شده است. اکنون باید ارتباط ساختار(frm) از دیتا(ibd) را جدا کنیم:

ALTER TABLE mage_core_resource DISCARD TABLESPACE;

در مرحله بعدی دو تنظیم مهم باید در تنظیمات دیتابیس Mysql اضافه کنید:

[mysqld]
innodb_file_per_table = 1
innodb_force_recovery = 1

اکنون برای اعمال تنظیمات و انجام تغییرات،‌باید سرویس Mysql را متوقف کنیم:

sudo service mysql stop

به طور همزمان فایل .idb حاوی اطلاعات را به با فایل .idb ای که Mysql برای جدول جدید ایجاد کرده جایگزین می کنیم. اکنون سرویس Mysql را اجرا می کنیم:

sudo service mysql start

همانطور که مشاهده می کنید همچنان آن جدول فاقد اطلاعات می باشد که به دلیل جدا کردن دیتا از ساختار جدول در مراحل قبلی بود. اکنون باید این ارتباط را با دیتای جدید برقرار کنیم:

ALTER TABLE mage_core_resource IMPORT TABLESPACE;

ممکن است در حین اجرا با خطای زیر مواجه شدید، از راهکار اول استفاده کرده و از داشتن فضای کافی برای ذخیره اطلاعات مطمئن شوید:

ERROR 1030 (HY000): Got error -1 from storage engine

خاتمه

در پایان در صورتی که اطلاعات مهمی بر روی دیتابیس خود ندارید، راهکار اول، مطمئن تر بوده، اما در صوتری که دیتابیس سرور شما حاوی اطلاعات هست، راهکار دوم پیشنهاد می شود.

منابع

برچسب ها: mariadb mysql database recovery