بعد از مدتی اومدیم تا توی جدول یوزرای گوگل پلی با 1 میلیون رکورد یه ستون تازه به اسم city در جدول درج کنیم. هرکاری کردیم ستون درج نمیشد و بعد سرور هنگام درج ستون از کار میوفتاد مجبور میشدیم کل سرور ریستارت کنیم تا درست بشه و برنامه قابل استفاده باشه.
بعد متوجه شدیم که جدولمون از نوع MyISAM که قدیمیه هست.
توی جدول MyISAM وقتی میخواد یه ستون داخل جدول درج بشه کل جدول قفل میشه، از اونجایی که ترافیک روی این جدول بسیار زیاد بود و درلحظه عملیات Insert یا update زیادی روی جدول انجام میشد درحال انجام بود بخاطر همین وقتی که میخواستیم ستون city به جدول اضافه کنیم جدول قفل میکرد و کل برنامه و سرور قطع میشد مجبور به ریستارت میشدیم.
این مشکل با کلی بهبود کارایی دیگه توی جدول از نوع IoDB رفع شده. توی جدول ioDB دیگه این اتفاق هنگام درج ستون تازه نمیوفته و مشکلی بوجود نمیاد.
حالا برای تبدیل یک جدول با نزدیک 30 ستون با 1 میلیون رکورد با 3.5 گیگ حجم چالشی بزرگ داشتیم که بخواییم نوعشو از MyISAM به ioDB تغییر بدیم.
چون توی aapanel قسمت دیتابیس هرموقع جدولو انتخاب میکردیم و گزینه convert to ioDB میزدیم کل سرور بعد از 1 دقیقه از کار میوفتاد و بازم مجبور میشدیم که کل سرورو ریستارت کنیم تا مشکل رفع بشه.
بعد متوجه شدیم که هنگام انجام این عملیات حتما باید ترافیک روی جدول مفصل برداشته بشه تا هنگام تبدیل به ioDB سرور قطع نشه. اومدیمو اینکارو کردیم و مجدد روی convert to ioDB زدیم. بعد از اون متوجه شدیم که وقتی عملیات convert درحال انجامه مثلا برای یک جدول 3.5 گیگی باید حدود 5 گیگ یا حتی بیشتر فضای خالی توی سرور موجود باشه چون کل جدول از نو ساخته میشه. بخاطر همین این مشکلو رفع کردیم و مجدد روی convert to ioDB زدیم جدول بدون مشکل به ioDB تبدیل شد.
تبدیلش ممکنه تا 10 دقیقه هم طول بکشه که بسته به نوع هارد سرورو مقدار حجم جدول با چیزای دیگه داره.
نکته:
درصورتی که به هر دلیلی نتونستیم با روش بالا جدولو از MyISAM به ioDB تبدیل کنیم باید با دستورات زیر خودمون به صورت دستی و کم کم اینکارو انجام بدیم تا مشکل رفع بشه:
CREATE TABLE xcode_master_users_new LIKE xcode_master_users;
ALTER TABLE xcode_master_users_new ENGINE=IoDB, ROW_FORMAT=DYNAMIC;
ابتدا دو دستور بالارو توی mysql میزنیم که یک جدول تازه از نوع IoDB ساخته بشه.
بعد رکورد های جدول قبلی که از نوع MyISAM هستو یکی یکی با دستور زیر به جدول بهروز منتقل میکنیم. با این روشم میشه جدولو به ioDB تبدیل کرد:
INSERT INTO xcode_master_users_new
SELECT * FROM xcode_master_users
WHERE id BETWEEN 1 AND 50000;
INSERT INTO xcode_master_users_new
SELECT * FROM xcode_master_users
WHERE id BETWEEN 50001 AND 100000;
مثلا برای یک جدول با 100 هزار رکورد برای اینکه سرور هنگ نکنه دو دستور بالارو میزنیم تا تیکه تیکه به جدول بهروز منتقل بشه.
اینطوری مشکل رفع میشه جدولم به ioDB میشه تبدیلش کرد.
نکته بسیار مهم:
در هر دوروش اگه ترافیک روی جدول باشه یا جدول در حال insert یا update باشه احتمال خطا خوردن یا مشکل بوجود اومدن بسیار بالاست پس حتما باید کل ترافیک روی جدول برداشته بشه بعد این عملیات انجام بشه که مشکل بوجود نیاد.
اپدیت نکته:
بعد از تبدیل تبدیل جدول با روش select دستی وقتی وارد جدول بهروز شدیم اون بالا مقدار رکورد رو 300 هزارتا کمتر از جدول اصلی زد اول فکر کردیم گزارشها درست اضافه نشده ولی متوجه شدیم جدول خراب نیست فقط در IoDB برای اینکه سرعت نمایش بیشتر بشه یه عدد تقریبی رو به عنوان تعداد بالای صفحه میزنه این طبیعیه.
برای فهمیدن عدد دقیق سطر ها باید از دستور SELECT COUNT(*) FROM xcode_master_users_new; استفاده کنیم.
برچسب:
نویسنده: مهسا مقدم