it-swarm.asia

انتهى خادم MySQL من إعاقة استيراد مكبات كبيرة

أحاول استيراد ملف تفريغ sql كبير (2 غيغابايت) إلى الخلية المحلية على جهاز Mac الخاص بي. لقد تمكنت من القيام بذلك في الماضي (كنت أستخدم MAMP) ، ولكن الآن أحصل على خطأ 2006 (HY000) في السطر 7758: كان خادم MySQL يختفي في كل مرة أحاول استيراد التفريغ. تحتوي قاعدة البيانات على جداول innodb.

لقد حاولت نسخ ملف my-cnf my-innodb-heavy-4G.cnf لمعرفة ما إذا كانت هذه الإعدادات ستساعد أم لا.

أي أفكار حول ما يجب تعديله؟

أنا أستخدم "Mac OS X الإصدار 10.6 (x86 ، 64 بت) ، أرشيف DMG" من هنا: http://dev.mysql.com/downloads/mysql/

14
naxoc

واحدة من القتلة الصامتين لاتصالات MySQL هي حزمة MySQL. حتى موضوع I/O الخاص بتكرار MySQL يمكن أن يقع ضحية لذلك.

حسب توثيق MySQL

  • يمكنك أيضًا الحصول على هذه الأخطاء إذا قمت بإرسال استعلام إلى الخادم غير صحيح أو كبير جدًا. إذا تلقى mysqld حزمة كبيرة جدًا أو معطلة ، فيفترض أن هناك خطأ ما في العميل ويغلق الاتصال. إذا كنت بحاجة إلى استعلامات كبيرة (على سبيل المثال ، إذا كنت تعمل مع أعمدة BLOB كبيرة) ، فيمكنك زيادة حد الاستعلام عن طريق تعيين متغير max_allowed_packet الخاص بالخادم ، والذي تبلغ قيمته الافتراضية 1 ميجابايت. قد تحتاج أيضًا إلى زيادة الحد الأقصى لحجم الحزمة على طرف العميل. مزيد من المعلومات حول تحديد حجم الحزمة في القسم C.5.2.10 ، "الحزمة كبيرة جدًا".

  • يمكن أن تؤدي عبارة INSERT أو REPLACE التي تُدرج عددًا كبيرًا من الصفوف إلى حدوث هذه الأنواع من الأخطاء. ترسل أي من هذه العبارات طلبًا واحدًا إلى الخادم بغض النظر عن عدد الصفوف التي سيتم إدراجها ؛ وبالتالي ، يمكنك في كثير من الأحيان تجنب الخطأ عن طريق تقليل عدد الصفوف المرسلة لكل INSERT أو REPLACE.

على الأقل ، يجب أن تتأكد من أن أحجام الحزم لكل من الجهاز الذي قمت بإرساله والآلة التي تقوم بتحميلها متطابقة.

قد يكون هناك نهجان (2) يمكنك اتباعهما:

النهج # 1: قم بإجراء mysqldump باستخدام --skip-extension-insert

سيؤدي ذلك إلى التأكد من عدم غمر حزمة MySQL بالعديد من حقول BLOBS و TEXT. بهذه الطريقة يتم تنفيذ عمليات إدخال SQL واحدة في كل مرة. العيوب الرئيسية

  1. الخلية أكبر بكثير
  2. يستغرق إعادة تحميل هذا التفريغ وقتًا أطول.

النهج # 2: زيادة max_allowed_packet

قد يكون هذا هو الأسلوب المفضل لأن تنفيذ ذلك هو مجرد إعادة تشغيل الخلية. إن فهم ماهية حزمة MySQL قد يوضح ذلك.

وفقًا لـ الصفحة 99 من "فهم MySQL Internals" (ISBN 0-596-00957-7) ، فيما يلي الفقرات 1-3 التي تشرحها:

تمت كتابة رمز اتصال شبكة MySQL على افتراض أن الاستعلامات قصيرة دائمًا إلى حد معقول ، وبالتالي يمكن إرسالها إلى الخادم ومعالجتها في قطعة واحدة ، والتي تسمى = packet في مصطلحات MySQL. يخصص الخادم الذاكرة لمخزن مؤقت مؤقت لتخزين الحزمة ، ويطلب ما يكفي لتناسبها تمامًا. تتطلب هذه البنية احتياطًا لتجنب نفاد ذاكرة الخادم - وهو حد أقصى لحجم الحزمة ، والذي يحققه هذا الخيار.

تم العثور على رمز الفائدة فيما يتعلق بهذا الخيار في sql/net_serv.cc . ألق نظرة على my_net_read () ، ثم اتبع المكالمة my_real_read () وإيلاء اهتمام خاص لـ net_realloc () .

يحد هذا المتغير أيضًا من طول نتيجة العديد من سلاسل الأحرف. راجع sql/field.cc و sql/intem_strfunc.cc لمزيد من التفاصيل .

نظرًا لهذا التفسير ، فإن جعل INSERTs المجمعة سيؤدي إلى تحميل/إلغاء تحميل حزمة MySQL بسرعة إلى حد ما. وينطبق هذا بشكل خاص عندما يكون max_allowed_packet صغيرًا جدًا بالنسبة للحمل المحدد للبيانات الواردة عليه.

[~ # ~] استنتاج [~ # ~]

في معظم عمليات تثبيت MySQL ، عادة ما أضبط هذا الخيار على 256M أو 512M. يجب أن تجرب قيمًا أكبر عندما ينتج عن تحميل البيانات أخطاء "لقد اختفت MySQL".

15
RolandoMySQLDBA

أولئك الذين لم ينجحوا في الاقتراحات الأخرى قد يفكرون في إلقاء نظرة على BigDump PHP تفريغ MySQL المتدفق البرنامج النصي للمستورد .

إنه حل بديل لاستيراد مقالب قاعدة البيانات الكبيرة إلى MySQL. لقد استخدمتها بنجاح لاستيراد ملف تفريغ MySQL كبير إلى بيئة التطوير المحلية الخاصة بي (أستخدم MAMP في هذه الحالة).

2
Marcus Barnes

إلى متى يستمر هذا قبل انتهاء الوقت؟ ستراهن الخطوة الأولى على التحقق من wait_timeout و interactive_timeout الإعدادات للتأكد من أنها كبيرة بما يكفي لاستيرادك:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

القيمة الافتراضية هي 8 ساعات (28800) ، لذا من المحتمل ألا تكون هذه هي المشكلة. يمكن العثور على مؤشرات أخرى لهذه المشكلة هنا . واحد بارز هو هذا:

لا يمتلك تطبيق العميل الذي يعمل على مضيف مختلف الامتيازات اللازمة للاتصال بخادم MySQL من ذلك المضيف.

تحقق من الأذونات أولاً ، ثم انتقل بعد ذلك إلى قائمة المشاكل المحتملة.

2
Derek Downey

قد لا يكون الشيء "الصحيح" الذي يجب فعله ، ولكنه قد يعمل (يتم "حقًا"؟):

حاول تقسيم ملف التفريغ الكبير إلى ملفات متعددة وتشغيلها في وقت واحد بالتسلسل. سيكون نهجي هو كسرها إلى النصف واختبارها. ثم قم بكسر كل نصف إلى نصفين ، وأعد الاختبار ، وهكذا.

أشعر بالفضول إلى حد ما إذا كان مقدار RAM التي حصلت عليها في صندوقك قد يكون له علاقة بهذا. هل يقوم MySQL بتحميل التفريغ بالكامل في الذاكرة عندما يذهب لتشغيله؟ لا أعلم ... ولكن إذا كان لديك 2 غيغابايت فقط من RAM وبعضها قيد التشغيل يشغل نظام التشغيل الخاص بك وتطبيقات أخرى ، فهذا قد كن مشكلة.

2
Day Davis Waterbury

نعم ، اللعب في العادة مع انتظار_الوقت و max_allowed_packets يسمح لي بالالتفاف حول رسالة الخطأ أيضًا.

2
p4guru