it-swarm.asia

حل "اختفى خادم MySQL" ، خطأ الخلية 2006

لدي موقع في hostgator ، باستخدام "حساب الأعمال" الخاص بهم. إنه رخيص ، ويأتي مع شهادة SSL خاصة. ومع ذلك ، فإن إعدادات MySQL الخاصة بهم هي أن أي اتصال db يصبح قديمًا إلى حد ما ، ثم يحاول موظفو hostgator إقناعك باستخدام VPS أو خادم مخصص في عدة مرات على حساب.

أقوم بإنشاء ونشر WebAPIs ، والتي يمكن أن يكون لها "محادثة" تتجاوز 60 ثانية. عند حدوث ذلك ، يكون مؤشر اتصال db تالفًا ، مما يؤدي إلى فشل أي عمليات db بعد انتهاء المهلة.

أنا بصدد تنفيذ الحل التالي ، لكنني أشعر بالفضول إذا قام أي شخص آخر بحل هذه المشكلة (حيث لا يمكنهم تعديل my.ini أو my.cnf لإعطاء MySQL المزيد من الموارد) بطريقة مماثلة أو مختلفة تمامًا.

الجزء الأخير من hook_update:

$ret = db_query( "UPDATE {my_table} set field1 = '%s', field2 = %d ... WHERE vid - %d", $node->field1, $node->field2, ... $node->vid );
if (!$ret) {
       // get private storage directory for this node:
       $cexStorage    = _cex_front_getCexStore();
       $nodeFilesPath = DRUPALROOT.'/'.$cexStorage.'/'.$node->storeDir;
       $fname         = $nodeFilesPath.'/recover.node'; 
       $readyToWrite  = serialize( $node );
       file_put_contents( $fname, $readyToWrite );
       if (file_exists( $fname )) {
         _dbgReport( 'seems to have worked!' );
       }
    }

ثم يتم استدعاؤها في نموذج hook_form الخاص بي ، مباشرة بعد تحديد أن العقدة> nid صالحة:

function _cex_front_recover_node( &$node ) {
  if (!isset($node->storeDir)) {
     _dbgReport( '**************************** _cex_front_recover_node: no storeDir!!!' );
     return;
  }

  // get private storage directory for this node:
  $cexStorage    = _cex_front_getCexStore();
  $nodeFilesPath = DRUPALROOT.'/'.$cexStorage.'/'.$node->storeDir;
  $fname         = $nodeFilesPath.'/recover.node';
  if (file_exists( $fname )) {
    $recovered = file_get_contents( $fname );
    if ($recovered) {
      // no longer needed:
      unlink( $fname );
      $recoveredNode = unserialize( $recovered );
      // restore the key values I need to proceed with this node:
      $node->stage = $recoveredNode->stage;
      $node->rnid  = $recoveredNode->rnid;
      $node->iris  = $recoveredNode->iris;
      cex_front_update( $node );
    }
    else {
      _dbgReport( '********* failed to read "'.$fname.'"' );
    }
  }
}

سأقوم بإقران المنطق لتخزين الحقول الرئيسية التي أحتاجها فقط ، ولكن هذا يعمل! بالتأكيد يدق ترقية الخادم الخاص بي على حساب 3x. أي شخص آخر يفعل شيئا مثل هذا؟

5
Blake Senftner

كان لدي عميل في شركة استضافة رفض زيادة قيمة max_allowed_packet (2 ميغابايت) ، مما أدى بانتظام إلى عدم القدرة على إضافة عناصر معلومات إلى ذاكرة التخزين المؤقت. لقد حللت ذلك عن طريق إضافة الضغط. انظر ضغط بيانات ذاكرة التخزين المؤقت قبل تخزينها في قاعدة البيانات .

في حالتك ، قد يتم تقليل استخدام الموارد من خلال توزيعه على العمليات المجمعة.

5
fietserwin

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

لقد حللنا ذلك باستخدام إعداد mysqli.reconnect في php.ini - إذا لم يكن لديك حق الوصول إلى ذلك ، يمكنك إضافته إلى settings.php . هناك بعض المحاذير مع هذا الإعداد ، مثل المعاملات التي يتم إكمالها جزئيًا ، ولكن ربما لن تكون ذات صلة بإعدادك.

4
Mark B

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

لإصلاح ذلك ، تحتاج إلى زيادة قيمة max_allowed_packet في my.cnf (مثل ~/.my.cnf) ضمن قسم [mysqld] ، على سبيل المثال.

[mysqld]
max_allowed_packet=256M

جرب باستخدام 256M ، إذا لم يساعدك ، حاول زيادة المزيد (مثل 1G).

في حالتك ، أعتقد أن max_allowed_packet يجب أن يكون ضمن قسم [mysqld] على وجه التحديد ، وليس تحت [mysqld_safe] ، لذلك يتم تطبيق الإعدادات على المكون الصحيح.

انظر: B.5.2.9 خادم MySQL اختفى لمزيد من المعلومات التفصيلية.

شيء آخر هو أنه في هذه الحالة بالذات يحدث في وظيفة إيقاف التشغيل (والتي بعد Drupal معالجة الموقع) ، لذلك يمكن أن تكون مرتبطة ببعض مهام cron أو تصحيح الأخطاء.


إذا رفض موفر الاستضافة زيادة max_allowed_packet ، يجب أن تفكر في التغيير إلى موفر استضافة مختلف يدعم متطلبات نظام دروبال .


ذات صلة:

0
kenorb