ما هي أسرع طريقة لتفريغ وتحميل قاعدة بيانات MySQL InnoDB باستخدام mysqldump؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

أرغب في إنشاء نسخة من قاعدة بيانات تحتوي على ما يقرب من 40 جدول InnoDB وحوالي 1.5 جيجابايت من البيانات باستخدام mysqldump وMySQL 5.1.

ما هي أفضل المعلمات (على سبيل المثال:--معاملة واحدة) من شأنها أن تؤدي إلى أسرع تفريغ وتحميل للبيانات؟

كذلك، عند تحميل البيانات إلى قاعدة البيانات الثانية، هل من الأسرع:

1) قم بتوجيه النتائج مباشرة إلى مثيل خادم MySQL الثاني واستخدم خيار --compress

أو

2) تحميله من ملف نصي (على سبيل المثال:الخلية < my_sql_dump.sql)

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

المحلول

قم بتوصيله مباشرة إلى مثيل آخر، لتجنب الحمل الزائد على القرص.لا تهتم مع --compress إلا إذا كنت تعمل عبر شبكة بطيئة، نظرًا لأنه على شبكة LAN سريعة أو استرجاع، لا يهم الحمل الزائد للشبكة.

نصائح أخرى

تفريغ قاعدة بيانات تم إيقافها بسرعة:

يؤدي استخدام الخيار "-T" مع mysqldump إلى ظهور الكثير من ملفات .sql و.txt في الدليل المحدد.يعد هذا أسرع بنسبة 50% تقريبًا في تفريغ الجداول الكبيرة مقارنة بملف .sql واحد يحتوي على عبارات INSERT (يستغرق وقت ساعة الحائط أقل بنسبة 1/3).

بالإضافة إلى ذلك، هناك فائدة كبيرة عند الاستعادة إذا كان بإمكانك تحميل جداول متعددة بالتوازي، وتشبع النوى المتعددة.في صندوق ثماني النواة، يمكن أن يكون هذا فرقًا يصل إلى 8X في وقت ساعة الحائط لاستعادة التفريغ، بالإضافة إلى تحسينات الكفاءة التي يوفرها "-T".نظرًا لأن "-T" يؤدي إلى تخزين كل جدول في ملف منفصل، فإن تحميلها بالتوازي يكون أسهل من تقسيم ملف .sql ضخم.

بأخذ الاستراتيجيات المذكورة أعلاه إلى أقصى حدودها المنطقية، يمكن للمرء إنشاء برنامج نصي لتفريغ قاعدة بيانات على نطاق واسع بالتوازي.حسنًا، هذا هو بالضبط ما حدث في تفريغ Maakit mk-parallel-dump (انظر http://www.maatkit.org/doc/mk-parallel-dump.html) وأدوات الاستعادة mk-parallel هي؛البرامج النصية Perl التي تقوم بإجراء مكالمات متعددة لبرنامج mysqldump الأساسي.ومع ذلك، عندما حاولت استخدام هذه، واجهت مشكلة في إكمال عملية الاستعادة دون تكرار الأخطاء الرئيسية التي لم تحدث مع عمليات تفريغ الفانيليا، لذا ضع في اعتبارك أن المسافة المقطوعة قد تختلف.

تفريغ البيانات من قاعدة بيانات مباشرة (بدون انقطاع الخدمة):

يعد رمز التبديل --single-transaction مفيدًا جدًا لأخذ تفريغ قاعدة بيانات حية دون الحاجة إلى إخمادها أو أخذ تفريغ قاعدة بيانات تابعة دون الحاجة إلى التوقف عن العبودية.

للأسف، -T غير متوافق مع --single-transaction، لذلك تحصل على واحدة فقط.

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


عادة ما يكون نقل التفريغ عبر الشبكة بمثابة فوز

للاستماع إلى ملف تفريغ وارد على تشغيل مضيف واحد:

nc -l 7878 > mysql-dump.sql

ثم قم بتشغيل على مضيف قاعدة البيانات الخاص بك

mysqldump $OPTS | nc myhost.mydomain.com 7878

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

التحذيرات - من الواضح أنك تحتاج إلى ما يكفي من النطاق الترددي للشبكة حتى لا تبطئ الأمور بشكل لا يطاق، وإذا انقطعت جلسة TCP، فيجب عليك البدء من جديد، ولكن بالنسبة لمعظم عمليات تفريغ البيانات، لا يمثل هذا مصدر قلق كبير.


وأخيرا، أريد توضيح نقطة واحدة من الالتباس المشترك.

على الرغم من عدد المرات التي ترى فيها هذه العلامات في الأمثلة والبرامج التعليمية لـ mysqldump، إلا أنها غير ضرورية لأنها قيد التشغيل افتراضيًا:

  • --opt
  • --add-drop-table
  • --add-locks
  • --create-options
  • --disable-keys
  • --extended-insert
  • --lock-tables
  • --quick
  • --set-charset.

من http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html:

استخدام --opt هو نفس تحديد --add-drop-table، --add-locks، --create-options، --disable-keys، --extensive-insert، --lock-tables، -- سريع، و--set-charset.جميع الخيارات التي يرمز إليها --opt تكون قيد التشغيل أيضًا بشكل افتراضي لأن --opt تكون قيد التشغيل بشكل افتراضي.

من بين هذه السلوكيات، يعد "--quick" واحدًا من أهم السلوكيات (يتخطى التخزين المؤقت لمجموعة النتائج بأكملها في mysqld قبل إرسال الصف الأول)، ويمكن أن يكون مع "mysql" (الذي لا يتم تشغيل --quick بشكل افتراضي) لتسريع الاستعلامات التي تُرجع مجموعة نتائج كبيرة بشكل كبير (على سبيل المثال، تفريغ كافة صفوف جدول كبير).

أعتقد أنه سيكون أسرع كثيرًا وسيوفر لك مساحة على القرص إذا حاولت النسخ المتماثل لقاعدة البيانات على عكس استخدام mysqldump.شخصيا أستخدم مؤسسة sqlyog لرفعي الثقيل حقًا ولكن هناك أيضًا عددًا من أدوات أخرى التي يمكنها تقديم نفس الخدمات.ما لم تكن بالطبع ترغب في استخدام mysqldump فقط.

بالنسبة إلى innodb، عادةً ما يكون --order-by-primary --extensive-insert هو أفضل مجموعة.إذا كان لديك بعد كل جزء أخير من الأداء والمربع الهدف يحتوي على العديد من مراكز وحدة المعالجة المركزية، فقد ترغب في تقسيم ملف التفريغ الناتج وإجراء إدراجات متوازية في العديد من سلاسل العمليات، حتى innodb_thread_concurrency/2.

أيضًا، قم بتعديل innodb_buffer_pool_size على الهدف إلى الحد الأقصى الذي يمكنك تحمله، وقم بزيادة حجم innodb_log_file_size إلى 128 أو 256 ميجابايت (كن حذرًا في هذا الأمر، فأنت بحاجة إلى إزالة ملفات السجل القديمة قبل إعادة تشغيل البرنامج الخفي mysql وإلا فلن يتم إعادة تشغيله)

استخدم أداة mk-parallel-dump من Maatkit.

على الأقل ربما يكون ذلك أسرع.أنا أثق في mysqldump أكثر.

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

من ناحية أخرى، 1.5G عبارة عن قاعدة بيانات صغيرة جدًا، لذا ربما لن تمثل مشكلة كبيرة.

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