أنا أستورد 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
كيف يمكنني مراقبة تقدمها؟
إذا كنت تستورد للتو من ملف تفريغ من CLI على * nix ، على سبيل المثال.
mysql -uxxx -pxxx dbname < /sqlfile.sql
ثم قم أولاً بتثبيت عارض الأنابيب على نظام التشغيل الخاص بك ثم جرب شيئًا مثل هذا:
pv sqlfile.sql | mysql -uxxx -pxxxx dbname
والتي ستظهر شريط تقدم أثناء تشغيل البرنامج.
إنه مفيد للغاية ويمكنك أيضًا استخدامه للحصول على تقدير لتقدم mysqldump.
pv يفرغ sqlfile.sql
ويمررها إلى mysql (بسبب عامل الأنابيب). أثناء الإغراق ، يظهر التقدم. الشيء الرائع هو أن mysql لا يأخذ البيانات إلا بالسرعة التي يمكن أن تقدم بها ، لذلك يمكن أن يظهر pv تقدم الاستيراد. ليس لدي أي دليل. لكن يبدو ذلك. أعتقد أن هناك بعض المخزن المؤقت المستخدم ، ولكن في مرحلة ما أعتقد mysql
لا يقرأ أي بيانات أخرى عندما لا يزال مشغولاً.
إذا كنت قد بدأت عملية الاستيراد بالفعل ، فيمكنك تنفيذ هذا الأمر في نافذة أخرى لمعرفة الحجم الحالي لقواعد البيانات الخاصة بك. يمكن أن يكون هذا مفيدًا إذا كنت تعرف الحجم الإجمالي لملف .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.
عند تنفيذ mysqldump لقاعدة بيانات واحدة ، يتم تفريغ جميع الجداول بترتيب أبجدي.
وبطبيعة الحال ، فإن إعادة تحميل الخلية إلى قاعدة بيانات ستكون أيضًا مرتبة أبجديًا.
يمكنك فقط القيام بعملية العرض ؛ ومعرفة اتصال DB تشغيل mysqldump. عند إعادة تحميل التفريغ ، سوف يختفي اتصال DB.
إذا كنت تريد معرفة الجداول الموجودة في ملف التفريغ ، فقم بتشغيلها مقابل foobar.sql
cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'
آسف لعدم ملاحظة وجود جدول واحد فقط.
إذا كان الجدول هو MyISAM ، فإن الطريقة الوحيدة للمراقبة هي من وجهة نظر نظام التشغيل. السبب؟ الجدول مؤمن ضد الكتابة طوال عملية إعادة التحميل. عن ماذا تبحث؟ حجم .MYD
و .MYI
الملفات. بالطبع ، تحتاج إلى مقارنة ذلك بما كان عليه حجم الجدول من قبل على خادم DB الآخر الذي استوردت منه.
إذا كان الجدول InnoDB وتم تمكين innodb_file_per_table ، فإن الطريقة الوحيدة للمراقبة هي من وجهة نظر نظام التشغيل. السبب؟ الجدول مؤمن ضد الكتابة طوال عملية إعادة التحميل. عن ماذا تبحث؟ حجم .ibd
ملف. بالطبع ، تحتاج إلى مقارنة ذلك بما كان عليه حجم الجدول من قبل على خادم DB الآخر الذي استوردت منه.
إذا كان الجدول InnoDB وكان لديك innodb_file_per_table معطل ، فحتى وجهة نظر نظام التشغيل يمكن أن تساعد.
لقد خاطبت شيئًا مثل هذا العام الماضي: كيف أحصل على نسبة التقدم لـ "type db.sql | mysql"
نظرًا لأن كتابة 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
علق من ملف النفاية ...
كل ثانيتين سترى العمليات قيد التشغيل.
watch 'echo "show processlist;" | mysql -uuser -ppassword';
إذا كنت تريده أقل تكرارا قم بإضافة -n x
حيث x هو عدد الثواني. 5 ثوان ستكون:
watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';
إذا كنت تريد فقط التحقق مما إذا كان معطلاً ، يمكنك الاستعلام
show processlist;
ونرى ما يجري تنفيذه.
كحل لشخص لا يمكنه الحصول على PV للعمل أو لمن يكمن في حماية الأكاذيب. يمكنك مراقبة حجم ملف ibdata1 في/var/lib/mysql الذي يحتوي على البيانات. سينتهي هذا بنفس الحجم (أو فيما بعد) من حجم الملف في خادم المصدر الخاص بك.
إذا كان هناك العديد من الجداول ، يمكنك أيضًا مشاهدتها تظهر واحدة تلو الأخرى في/var/lib/mysql/<اسم قاعدة البيانات>.
تصادف أنني استخدمت هذه الحقيقة مؤخرًا عندما قامت قاعدة بيانات طويلة الأمد بتكوين ملف سجل من حوالي 20G على مدى ثلاث أو أربع سنوات. لاحظت أن عملية النقل كانت تستغرق وقتًا طويلاً واستخدمت هذه التقنية لمراقبة التقدم.
أعتقد أنه من غير المحتمل إلى حد كبير أن يفجر اليوم عندما لا تتضمن قاعدة البيانات ملفًا في مكان آخر أو آخر. وفي الوقت نفسه ، يمكنك مراقبة الملف لمعرفة مدى تقدم عملية النقل. كانت الطريقة التي اقترحتها شيء يمكنك القيام به بشكل أو بآخر منذ كتابة قاعدة بيانات SQL الأولى. لم أكن أقصد أبدًا الإيحاء بأن أي نوع من التقنيات "الرسمية" يمكن أن يتراجع فيها الفارس اليدوي. يفترض مستوى عام من الكفاءة مع أجهزة الكمبيوتر بشكل عام ويونيكس بشكل خاص.
إذا كان DB الخاص بك هادئًا بخلاف ذلك (أي ليس هناك مستخدمون آخرون نشطون) وتريد فقط رؤية نشاط القراءة/الكتابة ، فلماذا لا تفعل شيئًا مثل:
mysqladmin -h<Host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'
سترى عدد من القراءات/يكتب/إدراج/ينتظر/التحديثات.
إذا كنت تقوم بالإدراج على سبيل المثال ، فسوف ترى شيئًا مثل:
Innodb_rows_inserted | 28958
حيث 28958 هو عدد الصفوف المدرجة للفاصل الزمني الخاص بك (10 ثوان في حالتي).
بالنسبة لشخص يبحث عن مثال عارض الأنبوب باستخدام mysqldump
يمكنك فقط القيام بشيء مثل هذا:
mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql
ال -W
إشارة تخبر pv فقط بانتظار أول بايت يأتي قبل إظهار التقدم (بعد المطالبة)
إذا كان لديك 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 لا تفهم "الحالة = التقدم"
حسنا ، عمل آخر حولها. ولكن قد يكون هذا هو الخيار الأسوأ وغير الدقيق.
ومع ذلك ، إليك حل 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
كان لدي ملف 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
أنا أستخدم https://github.com/Xfennec/progress لذلك والمراقبة عبر watch
watch progress
بعد إطلاق الاستيراد zcat example.sql.gz | mysql -u root -proot -h localhost example
يمكنك مراقبة الاستيراد في المجلد\Msql\Data [اسم DB]