mysqldump | MySQL يعطي الكثير من خطأ الملفات المفتوحة.لماذا؟

StackOverflow https://stackoverflow.com/questions/83242

  •  01-07-2019
  •  | 
  •  

سؤال

لدي نظام RHEL 5 مع محرك أقراص ثابت جديد قمت بتخصيصه للتو لخادم MySQL.لبدء الأمور، استخدمت "mysqldump --hostotherhost -A | mysql"، على الرغم من أنني لاحظت أن صفحة manpage لا توصي صراحةً أبدًا بتجربة هذا (mysqldump في ملف أمر محظور.نحن نتحدث عن 500 جيجا من قاعدة البيانات).

تفشل هذه العملية على فترات عشوائية، بسبب الشكوى من وجود عدد كبير جدًا من الملفات المفتوحة (عند هذه النقطة يحصل mysqld على الإشارة ذات الصلة، ويموت ويعود إلى الحياة).

حاولت رفعه في sysctl و ulimit، ولكن المشكلة لا تزال قائمة.ماذا أفعل حيال ذلك؟

هل كانت مفيدة؟

المحلول

يقوم mysqldump بشكل افتراضي بإجراء قفل لكل جدول لجميع الجداول المعنية.إذا كان لديك العديد من الجداول التي يمكن أن تتجاوز مقدار واصفات الملفات لعملية خادم MySQL.حاول --skip-lock-tables أو إذا كان القفل ضروريًا --lock-all-tables.
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

--lock-all-tables, -x

قفل كافة الجداول عبر كافة قواعد البيانات.يتم تحقيق ذلك من خلال الحصول على قفل قراءة عالمي طوال مدة التفريغ بالكامل.يقوم هذا الخيار تلقائيًا بإيقاف تشغيل --معاملة واحدة و --lock-tables.

نصائح أخرى

تم الإبلاغ عن أن mysqldump يتسبب في هذا الخطأ لقواعد البيانات الأكبر حجمًا (1, 2, 3).الشرح والحل من أخطاء MySQL:

3 فبراير 2007 22:00] سيرجي جولوبشيك هذا ليس خطأً حقًا.

MySQLdump بشكل افتراضي-تمكين Tables Table ، مما يعني أنه يحاول قفل جميع الجداول ليتم إلقاؤها قبل بدء التفريغ.وعمل جداول القفل t1، t2، ...بالنسبة لعدد كبير من الجداول حقًا ، سوف يستنفد جميع واصفات الملفات المتاحة حتماً ، حيث يحتاج القفل إلى فتح جميع الجداول.

الحلول:--skip-lock-tables سوف يقوم بتعطيل مثل هذا القفل تمامًا.بدلاً من ذلك ، ستجعل الطاولات -lock-all mysqldump استخدام جداول التدفق مع قفل القراءة الذي يغلق جميع الجداول في جميع قواعد البيانات (دون فتحها).في هذه الحالة ، سيقوم MySqLdump بتعطيل الطاولات القفل تلقائيًا لأنه لا معنى له عندما يتم استخدام الطاولات المقفلة.

يحرر:يرجى التحقق من الحل البديل الذي قدمه Dave لـ InnoDB في التعليق أدناه.

إذا كانت قاعدة بياناتك كبيرة إلى هذا الحد، فلديك بعض المشكلات.

  1. يجب عليك قفل الجداول لتفريغ البيانات.

  2. سيستغرق mysqldump وقتًا طويلاً جدًا وسيحتاج جداولك إلى القفل خلال هذا الوقت.

  3. سيستغرق استيراد البيانات على الخادم الجديد وقتًا طويلاً أيضًا.

نظرًا لأن قاعدة البيانات الخاصة بك ستكون غير قابلة للاستخدام بشكل أساسي أثناء حدوث #1 و#2، فإنني أوصي بالفعل بإيقاف قاعدة البيانات واستخدام rsync لنسخ الملفات إلى الخادم الآخر.إنه أسرع من استخدام mysqldump وأسرع بكثير من الاستيراد لأنه ليس لديك IO ووحدة المعالجة المركزية المضافة لإنشاء الفهارس.

في بيئات الإنتاج على Linux، يقوم العديد من الأشخاص بوضع بيانات Mysql على قسم LVM.ثم يقومون بإيقاف قاعدة البيانات، وإجراء لقطة LVM، وبدء تشغيل قاعدة البيانات، ونسخ حالة قاعدة البيانات المتوقفة في وقت فراغهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top