آپلود دیتابیس حجیم روی هاست ابری یکی از رایج ترین دردسرهای مهاجرت سایت است؛ فایل SQL شما بزرگ تر از حد مجاز آپلود است، ایمپورت وسط کار قطع میشود یا با خطای مهلت زمانی (Timeout) متوقف میشود. خبر خوب این است که این مشکل کاملا قابل حل است و فقط باید روش مناسب اندازهٔ دیتابیس خود را انتخاب کنید.
در این مقاله به صورت کاربردی و گام به گام می بینیم چطور دیتابیس های بزرگ را بدون خطا روی هاست ابری آپلود کنیم: از phpMyAdmin و تنظیمات لازم آن، تا روش خط فرمان MySQL که برای فایل های بزرگ مطمئن ترین راه است، و تکنیک تقسیم فایل برای دیتابیس های بسیار حجیم. خطاهای رایج و راه حلشان را هم مرور میکنیم.
قبل از راه حل، خوب است بدانید ریشهٔ مشکل کجاست. هاست ها برای جلوگیری از فشار روی سرور، چند محدودیت پیش فرض دارند که هنگام ایمپورت فایل های بزرگ به مانع تبدیل میشوند.
مهم ترین این محدودیت ها عبارت اند از حداکثر حجم فایل قابل آپلود، حداکثر حجم درخواست، و مهلت اجرای اسکریپت. وقتی فایل SQL شما از این مقادیر بزرگ تر باشد، ابزارهای تحت وب مثل phpMyAdmin وسط کار متوقف میشوند. برای همین هرچه فایل بزرگ تر باشد، باید سراغ روش هایی برویم که به این محدودیت های تحت وب وابسته نیستند.
اگر دیتابیس شما نسبتا کوچک است (مثلا زیر محدودیت آپلود هاست)، ساده ترین راه استفاده از phpMyAdmin در کنترل پنل است. کافی است وارد phpMyAdmin شوید، دیتابیس مقصد را انتخاب کنید و از تب Import فایل SQL را بارگذاری کنید.
اگر فایل کمی بزرگ تر از حد مجاز است، دو کار کمک میکند. اول، فایل SQL را به صورت فشرده (zip یا gzip) آپلود کنید؛ phpMyAdmin فایل فشرده را میپذیرد و حجم انتقال کمتر میشود. دوم، اگر به فایل php.ini دسترسی دارید، محدودیت ها را موقتا افزایش دهید:
# افزایش محدودیت ها در php.ini upload_max_filesize = 256M post_max_size = 256M max_execution_time = 600 max_input_time = 600 memory_limit = 512M
بعد از این تغییر، سرویس وب را ری استارت کنید یا اگر روی هاست اشتراکی هستید، از پشتیبانی بخواهید این مقادیر را افزایش دهند. با این حال برای فایل های واقعا بزرگ، این روش همچنان ممکن است شکست بخورد و بهتر است سراغ خط فرمان بروید.
مطمئن ترین راه برای آپلود دیتابیس حجیم، استفاده از خط فرمان است، چون به محدودیت های تحت وب وابسته نیست و میتواند فایل های بسیار بزرگ را بدون قطع شدن ایمپورت کند. اگر به SSH دسترسی دارید (روی هاست ابری، سرور مجازی یا اختصاصی)، این بهترین انتخاب است. برای جزئیات کامل این روش، راهنمای ایمپورت دیتابیس از طریق SSH را ببینید.
برای گرفتن خروجی استاندارد از دیتابیس مبدا بهتر است از mysqldump استفاده کنید، چون یک فایل تمیز و کامل میسازد که احتمال خطای ایمپورت را کم میکند:
mysqldump -u USERNAME -p DATABASE_NAME > backup.sql
سپس فایل SQL را با FTP یا SCP به سرور منتقل کنید و با یک دستور ساده آن را ایمپورت کنید:
# ایمپورت فایل SQL از طریق خط فرمان mysql -u USERNAME -p DATABASE_NAME < /path/to/backup.sql # اگر فایل فشرده (gzip) است، بدون باز کردن کامل: gunzip < /path/to/backup.sql.gz | mysql -u USERNAME -p DATABASE_NAME
این روش حتی برای دیتابیس های چند گیگابایتی هم پایدار کار میکند. اگر با cPanel کار میکنید و میخواهید با کل محیط آن از جمله مدیریت دیتابیس و دسترسی ها آشناتر شوید، مطلب سی پنل چیست نقطهٔ شروع خوبی است.
گاهی حتی خط فرمان هم به دلیل محدودیت منابع یا نبود دسترسی SSH کافی نیست. در این حالت میتوانید فایل SQL را به چند تکهٔ کوچک تر تقسیم کنید و هر تکه را جداگانه ایمپورت کنید. ابزارهایی مثل SQLDumpSplitter یا افزونه های مخصوص این کار را ساده میکنند.
یک راه هوشمندانه تر هم این است که هنگام گرفتن خروجی، جدول های حجیم را جدا از بقیه اکسپورت کنید تا هر فایل کوچک تر و مدیریت آن ساده تر شود. با این روش، اگر یک تکه با خطا مواجه شد، مجبور نیستید کل فرآیند را از اول شروع کنید.
اگر به SSH دسترسی ندارید و روی هاست اشتراکی هستید، اسکریپت رایگان BigDump یک راه حل عالی برای ایمپورت تکه تکه است. این اسکریپت PHP فایل SQL بزرگ را به صورت مرحله ای و خودکار وارد دیتابیس میکند تا به محدودیت مهلت اجرا و حجم آپلود نخورد. مراحل استفاده به این صورت است:
یک نکتهٔ مهم: BigDump با فایل هایی که از دستورهای INSERT چندخطی (extended insert) استفاده میکنند مشکل دارد. برای همین هنگام گرفتن خروجی، دامپ را با حالت «هر ردیف یک INSERT» (complete insert) بگیرید تا BigDump درست کار کند.
هنگام آپلود دیتابیس حجیم چند خطا بیشتر از بقیه تکرار میشوند و خوب است راه حلشان را از قبل بدانید تا وسط کار غافلگیر نشوید.
خطای «MySQL server has gone away» معمولا به دلیل کوچک بودن مقدار max_allowed_packet رخ میدهد؛ یعنی یک ردیف یا دستور بزرگ تر از حد مجاز است و با افزایش این مقدار برطرف میشود. خطای مهلت زمانی هم اغلب با رفتن به خط فرمان از بین میرود. اگر با خطای کلید خارجی (Foreign Key) مواجه شدید، میتوانید موقتا بررسی کلیدها را غیرفعال کنید تا ترتیب ایمپورت جدول ها مشکل ساز نشود:
# افزایش حداکثر اندازه بسته در my.cnf max_allowed_packet = 256M # غیرفعال کردن موقت بررسی کلید خارجی در ابتدای فایل SQL SET FOREIGN_KEY_CHECKS = 0; # ... دستورهای ایمپورت ... SET FOREIGN_KEY_CHECKS = 1;
یک نکتهٔ مهم دیگر هماهنگی کاراکترست (Charset) و کولیشن است. اگر دیتابیس مبدا و مقصد از کاراکترست متفاوتی استفاده کنند، ممکن است متن های فارسی به هم بریزند. بهتر است هر دو را روی utf8mb4 تنظیم کنید تا کاراکترهای فارسی و حتی ایموجی درست ذخیره شوند و بعد از ایمپورت با متن خراب روبرو نشوید.
آپلود موفق پایان کار نیست. یک دیتابیس حجیم اگر بهینه نباشد، میتواند سایت را کند کند. بعد از ایمپورت، مطمئن شوید جدول ها ایندکس مناسب دارند و کوئری های سنگین بهینه شده اند.
اگر بعد از انتقال متوجه کندی سایت شدید، اولین قدم پیدا کردن کوئری های کند است. راهنمای پیدا کردن کوئری های کند کمک میکند نقاط ضعف دیتابیس را شناسایی و برطرف کنید تا عملکرد سایت پس از انتقال افت نکند.
بخشی از موفقیت در آپلود دیتابیس حجیم به منابع هاست شما بستگی دارد. روی هاست اشتراکی با منابع محدود، حتی با روش درست هم ممکن است به سقف منابع بخورید. اما روی هاست ابری یا سرور مجازی با منابع تضمین شده، آزادی عمل بیشتری برای افزایش محدودیت ها و استفاده از خط فرمان دارید. همچنین سرعت دیسک و مقدار رم سرور، مستقیما روی زمان ایمپورت یک دیتابیس بزرگ اثر میگذارد و منابع بیشتر یعنی انتقال سریع تر.
اگر مرتب با دیتابیس های بزرگ کار میکنید، یک سرور مجازی با منابع کافی و دسترسی کامل، انتقال و مدیریت دیتابیس را بسیار ساده تر میکند و دیگر درگیر محدودیت های سخت گیرانهٔ هاست اشتراکی نمیشوید.
برای آپلود بدون دردسر یک دیتابیس حجیم، این ترتیب ساده را دنبال کنید تا کمترین احتمال خطا را داشته باشید.
حجم فایل SQL را ببین و با محدودیت آپلود هاست مقایسه کن تا روش درست را انتخاب کنی.
فایل کوچک با phpMyAdmin، فایل بزرگ با خط فرمان MySQL، و فایل بسیار حجیم را تکه تکه ایمپورت کن.
صحت داده ها و ایندکس ها را چک کن و در صورت کندی، کوئری های کند را پیدا و بهینه کن.
جمع بندی: آپلود دیتابیس حجیم روی هاست ابری با انتخاب روش درست کاملا قابل انجام است: phpMyAdmin برای فایل های کوچک، خط فرمان MySQL برای فایل های بزرگ، و تقسیم فایل برای موارد بسیار حجیم. علت اصلی خطاها هم محدودیت حجم آپلود و مهلت اجراست که با چند تنظیم ساده یا رفتن به خط فرمان کنار میرود.
بعد از انتقال، حتما سلامت و عملکرد دیتابیس را بررسی کنید تا سایت پس از مهاجرت کند نشود. و اگر مرتب با دیتابیس های بزرگ سروکار دارید، هاستی با منابع کافی، کل این فرآیند را ساده و بی دردسر میکند.
هاست ابری و سرور مجازی با منابع کافی و دسترسی کامل؛ بقیه اش با ما.
به دلیل محدودیت حجم آپلود و مهلت اجرای اسکریپت در هاست. برای فایل های بزرگ بهتر است به جای phpMyAdmin از خط فرمان MySQL استفاده کنید که به این محدودیت ها وابسته نیست.
اگر به SSH دسترسی دارید، خط فرمان MySQL مطمئن ترین راه است و حتی فایل های چند گیگابایتی را بدون قطع شدن ایمپورت میکند. برای فایل های کوچک، phpMyAdmin کافی است.
با ویرایش مقادیری مثل upload_max_filesize و post_max_size و max_execution_time در php.ini. روی هاست اشتراکی میتوانید از پشتیبانی بخواهید این مقادیر را افزایش دهند.
فایل SQL را به چند تکهٔ کوچک تر تقسیم کنید و هر تکه را جداگانه ایمپورت کنید، یا جدول های حجیم را جدا اکسپورت و ایمپورت کنید. اگر SSH ندارید، اسکریپت BigDump هم فایل بزرگ را به صورت تکه تکه و خودکار ایمپورت میکند.
ابتدا کوئری های کند را پیدا کنید و مطمئن شوید جدول ها ایندکس مناسب دارند. بهینه سازی کوئری ها و ایندکس ها معمولا کندی پس از انتقال را برطرف میکند.
فاماسرور