الاستيرادُ الكبير عبر واجهة ويبٍ يفشل في الغالب الأعمّ: فحدُّ الرفع أو زمنُ التنفيذ أو مهلةُ الطلب توقفه في منتصف الطريق. واستورد من سطر الأوامر فلا يسري شيءٌ من ذلك.
mysql -u user -p dbname < dump.sql
# or, compressed
zcat dump.sql.gz | mysql -u user -p dbname
اجعله سريعًا
# at the top of the session
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
-- import --
SET foreign_key_checks=1;
SET unique_checks=1;
COMMIT;
معظمُ وقت الاستيراد الكبير يُنفَق في فحص القيود والإفراغ بعد كل صفّ. وإطفاءُ ذلك لنسخةٍ موثوقة ثم إعادتُه بعدها يحوّل الساعات إلى دقائق على نحوٍ معتاد.
ولا يكون ذلك إلّا على نسخةٍ تثق بها وقاعدةٍ لا يكتب فيها شيءٌ آخر. فمع إطفاء فحص المفاتيح الأجنبية تستورد نسخةٌ معطوبة بياناتٍ معطوبة بصمت.
راقبه وهو يجري
pv dump.sql | mysql -u user -p dbname
الأمر pv يطبع شريطَ تقدّمٍ وتقديرًا للوقت. وبدونه لا يُفرَّق بين استيرادٍ طويل واستيرادٍ متعلّق، فيقتله الناس في منتصفه — وذلك أسوأ من الانتظار.
وإن فشل في منتصف الطريق
- نفادُ القرص — فقاعدة البيانات تحتاج مساحةً للبيانات وللملفّات المؤقّتة معًا. افحص
df -hقبل أن تبدأ. - MySQL server has gone away — صفٌّ واحد أكبر من max_allowed_packet. فارفعه:
max_allowed_packet = 256M. - Unknown collation — النسخةُ جاءت من MySQL أحدث. فإمّا أن تُرقّي، وإمّا أن تعيد كتابة الترتيب في الملفّ.
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' dump.sql
واستورد إلى قاعدةٍ فارغة لا فوق قاعدةٍ حيّة. فإن فشل في منتصفه كان عندك نسخةٌ نصفُ مستوردة تُلقيها، لا موقعٌ نصفُ مهدوم.