it-swarm.asia

MySQL بأي شكل من الأشكال لاستيراد تفريغ SQL ضخمة (32 جيجابايت) أسرع؟

لدي هذا تفريغ SQL 32 جيجابايت ضخم أحتاج إلى استيراده إلى MySQL. لم يكن لدي لاستيراد مثل هذا تفريغ SQL ضخمة من قبل. فعلت المعتاد:

mysql -uroot dbname < dbname.sql

يستغرق وقتا طويلا. هناك جدول يحتوي على حوالي 300 مليون صف ، وقد وصل إلى 1.5 مليون صف في حوالي 3 ساعات. لذا ، يبدو أن الأمر برمته سيستغرق 600 ساعة (24 يومًا) وهو غير عملي. لذا سؤالي هو ، هل هناك طريقة أسرع للقيام بذلك؟

مزيد من المعلومات/النتائج

  1. الجداول كلها InnoDB ولا توجد مفاتيح أجنبية محددة. ومع ذلك ، هناك العديد من الفهارس.
  2. ليس لدي حق الوصول إلى الخادم الأصلي و DB لذا لا يمكنني عمل نسخة احتياطية جديدة أو عمل نسخة "ساخنة" وما إلى ذلك.
  3. ضبط innodb_flush_log_at_trx_commit = 2 كما هو مقترح هنا يبدو أنه لم يحدث أي تحسن (مرئي/أسي واضح).
  4. إحصائيات الخادم أثناء الاستيراد (من MySQL Workbench): https://imgflip.com/gif/ed0c8 .
  5. نسخة MySQL هي 5.6.20 مجتمع.
  6. innodb_buffer_pool_size = 16 مليونًا و innodb_log_buffer_size = 8 مليونًا. هل أحتاج لزيادة هذه؟
81
SBhojani

قدم فاديم تكاشينكو من بيركونا هذا التمثيل التصويري الجيد لـ InnoDB

InnoDB Architecture

أنت بالتأكيد بحاجة إلى تغيير ما يلي

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

لماذا هذه الإعدادات؟

أعد تشغيل الخلية مثل هذا

service mysql restart --innodb-doublewrite=0

يؤدي هذا إلى تعطيل المخزن المؤقت للكتابة المزدوجة InnoDB

استيراد بياناتك. عند الانتهاء ، أعد تشغيل الخلية بشكل طبيعي

service mysql restart

هذا يعيد تمكين التخزين المؤقت للكتابة المزدوجة InnoDB

جربها !!!

ملاحظة جانبية: يجب الترقية إلى 5.6.21 لأحدث تصحيحات الأمان .

97
RolandoMySQLDBA

هل تحتاج حقًا إلى استعادة قاعدة البيانات بالكامل؟ إذا لم تقم بذلك ، 2c الخاص بي:

يمكنك استخراج جداول محددة للقيام باستعادتك على "قطع". شيء من هذا القبيل:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

لقد فعلت ذلك مرة واحدة واستغرق الأمر 10 دقائق لاستخراج الجدول الذي احتاجه - استغرقت الاستعادة الكاملة 13 ~ 14 ساعة ، مع تفريغ 35 جيجابايت (مضغوط).

ال /pattern/,/pattern/p مع ال -n تضع المعلمة شريحة "بين الأنماط" - بما في ذلك.

على أي حال ، لاستعادة 35 جيجابايت ، استخدمت آلة AWS EC2 (c3.8xlarge) ، وقمت بتثبيت Percona عبر yum (Centos) وأضفت/غيرت الخطوط التالية في my.cnf:

max_allowed_packet=256M
wait_timeout=30000

أعتقد أن الأرقام مرتفعة للغاية ، لكنها عملت مع إعدادي.

13
Bruno J. Araujo

إن أسرع طريقة لاستيراد قاعدة البيانات هي نسخ ملفات (.frm ، .MYD ، .MYI) إذا كانت MyISAM ، مباشرة إلى/var/lib/mysql/"اسم قاعدة البيانات".

وإلا يمكنك المحاولة: mysql > use database_name; \. /path/to/file.sql

هذه طريقة أخرى لاستيراد بياناتك.

6
Alex

تتمثل إحدى طرق المساعدة في تسريع عملية الاستيراد في تأمين الجدول أثناء الاستيراد. استخدم الخيار --add-locks إلى mysqldump.

mysqldump --add-drop-table --add-locks --database db > db.sql

أو يمكنك تشغيل بعض المعلمات المفيدة باستخدام - opt يؤدي هذا إلى تشغيل مجموعة من الأشياء المفيدة للتفريغ.

mysqldump --opt --database db > db.sql

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

يمكنك أيضًا تصفية الجداول غير المطلوبة باستخدام - طاولة تجاهل

1
pgee70