it-swarm.asia

كيف يمكنني مراقبة تقدم عملية استيراد ملف .sql كبير؟

أنا أستورد 7 جيجابايت foobar.sql لاستعادة جدول في قاعدة بيانات محلية.

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for Apple-darwin9.8.0 (i386) using readline 5.1

كيف يمكنني مراقبة تقدمها؟

219
qazwsx

إذا كنت تستورد للتو من ملف تفريغ من CLI على * nix ، على سبيل المثال.

mysql -uxxx -pxxx dbname < /sqlfile.sql

ثم قم أولاً بتثبيت عارض الأنابيب على نظام التشغيل الخاص بك ثم جرب شيئًا مثل هذا:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

والتي ستظهر شريط تقدم أثناء تشغيل البرنامج.

إنه مفيد للغاية ويمكنك أيضًا استخدامه للحصول على تقدير لتقدم mysqldump.

pv يفرغ sqlfile.sql ويمررها إلى mysql (بسبب عامل الأنابيب). أثناء الإغراق ، يظهر التقدم. الشيء الرائع هو أن mysql لا يأخذ البيانات إلا بالسرعة التي يمكن أن تقدم بها ، لذلك يمكن أن يظهر pv تقدم الاستيراد. ليس لدي أي دليل. لكن يبدو ذلك. أعتقد أن هناك بعض المخزن المؤقت المستخدم ، ولكن في مرحلة ما أعتقد mysql لا يقرأ أي بيانات أخرى عندما لا يزال مشغولاً.

Pipe Viewer screenshot

288
Rob

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

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

الائتمان إلى: http://forums.mysql.com/read.php؟108،201578،201578


يوضح مرجع MySQL 8. ما يلي حول الدقة:

طول البيانات

بالنسبة إلى MyISAM ، DATA_LENGTH هو طول ملف البيانات بالبايت.

بالنسبة إلى InnoDB ، DATA_LENGTH هي المقدار التقريبي للذاكرة المخصصة لفهرس المجموعة بالبايت. على وجه التحديد ، هو حجم فهرس المجموعة ، مضروبًا في حجم صفحة InnoDB.

INDEX_LENGTH

بالنسبة إلى MyISAM ، INDEX_LENGTH هو طول ملف الفهرس بالبايت.

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

32
Josh Grinberg

عند تنفيذ mysqldump لقاعدة بيانات واحدة ، يتم تفريغ جميع الجداول بترتيب أبجدي.

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

يمكنك فقط القيام بعملية العرض ؛ ومعرفة اتصال DB تشغيل mysqldump. عند إعادة تحميل التفريغ ، سوف يختفي اتصال DB.

إذا كنت تريد معرفة الجداول الموجودة في ملف التفريغ ، فقم بتشغيلها مقابل foobar.sql

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

تحديث 2012-05-02 13:53 EDT

آسف لعدم ملاحظة وجود جدول واحد فقط.

إذا كان الجدول هو MyISAM ، فإن الطريقة الوحيدة للمراقبة هي من وجهة نظر نظام التشغيل. السبب؟ الجدول مؤمن ضد الكتابة طوال عملية إعادة التحميل. عن ماذا تبحث؟ حجم .MYD و .MYI الملفات. بالطبع ، تحتاج إلى مقارنة ذلك بما كان عليه حجم الجدول من قبل على خادم DB الآخر الذي استوردت منه.

إذا كان الجدول InnoDB وتم تمكين innodb_file_per_table ، فإن الطريقة الوحيدة للمراقبة هي من وجهة نظر نظام التشغيل. السبب؟ الجدول مؤمن ضد الكتابة طوال عملية إعادة التحميل. عن ماذا تبحث؟ حجم .ibd ملف. بالطبع ، تحتاج إلى مقارنة ذلك بما كان عليه حجم الجدول من قبل على خادم DB الآخر الذي استوردت منه.

إذا كان الجدول InnoDB وكان لديك innodb_file_per_table معطل ، فحتى وجهة نظر نظام التشغيل يمكن أن تساعد.

تحديث 2012-05-02 13:56 بتوقيت شرق الولايات المتحدة

لقد خاطبت شيئًا مثل هذا العام الماضي: كيف أحصل على نسبة التقدم لـ "type db.sql | mysql"

تحديث 2012-05-02 14:09 بتوقيت شرق الولايات المتحدة

نظرًا لأن كتابة mysqldump القياسية تقفل الجدول مثل هذا:

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

ثم ، لا توجد طريقة للحصول على تقدم من mysql حتى يتم تحرير قفل الجدول.

إذا استطعت الحصول على LOCK TABLES و UNLOCK TABLES علق من ملف النفاية ...

  • إذا كان الجدول MyISAM ، فسيعمل SELECT COUNT (*)
  • إذا كان الجدول InnoDB ، فمن المحتمل أن SELECT COUNT (*) سيبطئ/يوقف الحمل حتى يتم العد
17
RolandoMySQLDBA

كل ثانيتين سترى العمليات قيد التشغيل.

watch 'echo "show processlist;" | mysql -uuser -ppassword';

إذا كنت تريده أقل تكرارا قم بإضافة -n x حيث x هو عدد الثواني. 5 ثوان ستكون:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';
10
Marcelo Luiz Onhate

إذا كنت تريد فقط التحقق مما إذا كان معطلاً ، يمكنك الاستعلام

show processlist; 

ونرى ما يجري تنفيذه.

7
SCL

كحل لشخص لا يمكنه الحصول على PV للعمل أو لمن يكمن في حماية الأكاذيب. يمكنك مراقبة حجم ملف ibdata1 في/var/lib/mysql الذي يحتوي على البيانات. سينتهي هذا بنفس الحجم (أو فيما بعد) من حجم الملف في خادم المصدر الخاص بك.

إذا كان هناك العديد من الجداول ، يمكنك أيضًا مشاهدتها تظهر واحدة تلو الأخرى في/var/lib/mysql/<اسم قاعدة البيانات>.

تصادف أنني استخدمت هذه الحقيقة مؤخرًا عندما قامت قاعدة بيانات طويلة الأمد بتكوين ملف سجل من حوالي 20G على مدى ثلاث أو أربع سنوات. لاحظت أن عملية النقل كانت تستغرق وقتًا طويلاً واستخدمت هذه التقنية لمراقبة التقدم.

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

5
nerak99

إذا كان DB الخاص بك هادئًا بخلاف ذلك (أي ليس هناك مستخدمون آخرون نشطون) وتريد فقط رؤية نشاط القراءة/الكتابة ، فلماذا لا تفعل شيئًا مثل:

mysqladmin -h<Host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

سترى عدد من القراءات/يكتب/إدراج/ينتظر/التحديثات.

إذا كنت تقوم بالإدراج على سبيل المثال ، فسوف ترى شيئًا مثل:

Innodb_rows_inserted                          | 28958 

حيث 28958 هو عدد الصفوف المدرجة للفاصل الزمني الخاص بك (10 ثوان في حالتي).

2
user113373

بالنسبة لشخص يبحث عن مثال عارض الأنبوب باستخدام mysqldump يمكنك فقط القيام بشيء مثل هذا:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

ال -W إشارة تخبر pv فقط بانتظار أول بايت يأتي قبل إظهار التقدم (بعد المطالبة)

1
Mauricio Trajano

إذا كان لديك gnu coreutils/dd version> = 8.24 (تم إصداره في 2015 يوليو 03) ، يمكنك استخدام حالة dd = وسيطة التقدم ،

على سبيل المثال

cat dbdump.gz | gzip -d | mysql --password=root -v | time dd of=/dev/null status=progress

* ملاحظة: لا لا تعمل مع busybox ، dboxbox لا تفهم "الحالة = التقدم"

0
hanshenrik

حسنا ، عمل آخر حولها. ولكن قد يكون هذا هو الخيار الأسوأ وغير الدقيق.

ومع ذلك ، إليك حل Windows:

افتح إدارة المهام بالضغط

CTRL + SHIFT + ESC

انسخ سرعة قيمة القرص "mysqld.exe"

e.g. 11mb/s

ضع ذلك في آلة حاسبة مثل هذه: https://techinternets.com/copy_calc؟do

تقدير ETA. قضيتي كانت:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

النتائج:

Beg -> 11:19
ETA -> 11:31
End -> 11:39
0
Daniel

كان لدي ملف SQL سعة 500 ميجابايت لاستيراده. استغرق الأمر حوالي ساعتين. كان استخدام وحدة المعالجة المركزية mysqld بجوار 100٪ في بداية عملية الاستيراد. ولكن بعد بضع دقائق انخفض استخدام وحدة المعالجة المركزية إلى 15٪.

لقد جربت العديد من التعديلات ولكن هذا فقط ساعدني: innodb_flush_log_at_trx_commit = 0

بعد تطبيق هذا الإعداد وإعادة تشغيل الخلية ، استغرق الاستيراد 3 دقائق فقط! كان استخدام وحدة المعالجة المركزية بنسبة 100٪ طوال الوقت.

إذا كنت ترغب في استخدام هذا الإعداد ، فستحتاج إلى تحرير ملف "/etc/mysql/my.cnf" وإعادة تشغيل خادم mysql باستخدام "Sudo service mysql إعادة تشغيل".

فيما يلي إعدادات ملف "my.conf" الخاص بي:

    [mysqld]
    innodb_log_buffer_size = 256M
    innodb_fast_shutdown = 0
    innodb-doublewrite = OFF
    innodb_io_capacity = 1000
    innodb_flush_log_at_trx_commit = 0

يرجى ملاحظة أن "innodb_flush_log_at_trx_commit = 0" ستنفذ كل ثانية فقط. لذلك لا يتوافق مع ACID ، ولكن بالنسبة للاستيراد بالجملة مقبول. بعد الاستيراد ، يمكنك تعيين قيمة "innodb_flush_log_at_trx_commit" مرة أخرى إلى 1 وإعادة تشغيل قاعدة البيانات الخاصة بك. رابط إلى وثائق mySQL

0
MaFli

أنا أستخدم https://github.com/Xfennec/progress لذلك والمراقبة عبر watch

watch progress

بعد إطلاق الاستيراد zcat example.sql.gz | mysql -u root -proot -h localhost example

0
michalzuber

يمكنك مراقبة الاستيراد في المجلد\Msql\Data [اسم DB]

0
Hotcronchy