Як я можу стежити за ходом імпорту великого .sql-файлу?


204

Я імпортую 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

Як я можу стежити за його прогресом?


1
Відповіді на це запитання показують, що це явний недолік клієнта mysql
Вільям Ентрікен

Відповіді:


267

Якщо ви просто імпортуєте з дамп-файлу з 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


1
Я б здогадався, що у mysql може бути буфер, в який можна вводити деякі дані, не будучи повністю «обробленими» (тобто, якщо вони помиляються, pv, можливо, трохи переоцінив те, що насправді потрапляє). Але в цілому так працюють труби. Це та сама причина, що ви можете робити sudo hd /dev/sda1 | lessі не мати весь системний розділ у пам'яті.
snapfractalpop

2
@snapfractalpop pvу багатьох випадках не буде надто точним, оскільки для обробки деяких фрагментів SQL знадобиться більше часу, ніж для інших. Рядок, що становить просту вставку, запуститься набагато швидше, ніж той, який створюється за індексом таблиці, у якої, наприклад, уже є багато рядків. Але брутальне уявлення про хід виводу має бути корисним, якщо буфер читання, який використовується, mysqlособливо великий (для введення 7 Гбітром буфер повинен бути дуже великим, щоб зробити pvвихід зовсім не корисним.
Девід Спіллетт

1
@DavidSpillett дійсно. Ваш коментар відображає мої настрої. В основному, pv сирий, але ефективний. Що мені найбільше подобається в тому, наскільки це загальне. Така краса унікс-труб (спасибі Макілрой).
snapfractalpop

1
@rob Це дивовижний чувак, чи можете ви також навести приклад mysqldump?
Джозеу Олександр Ібарра

Дуже приємне рішення! Якщо пароль вручну, Pv не чекає, поки він відобразить свою прогресію
Pierre de LESPINAY

26

Якщо ви вже розпочали імпорт, ви можете виконати цю команду в іншому вікні, щоб побачити поточний розмір ваших баз даних. Це може бути корисно, якщо ви знаєте загальний розмір файлу .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.0 говорить про точність:

DATA_LENGTH

Для MyISAM DATA_LENGTH - це довжина файлу даних у байтах.

Для InnoDB DATA_LENGTH - це приблизний об'єм пам'яті, виділений для кластерного індексу, у байтах. Зокрема, це розмір кластерного індексу у сторінках, помножений на розмір сторінки InnoDB.

 

INDEX_LENGTH

Для MyISAM, INDEX_LENGTH - це довжина файлу індексу, в байтах.

Для InnoDB INDEX_LENGTH - це приблизний об'єм пам'яті, виділений для некластеризованих індексів, у байтах. Зокрема, це сума розмірів некластеризованих індексів у сторінках, помножена на розмір сторінки InnoDB.


Зараз мій стіл становить 12 Гб, відповідно до команд з цієї відповіді, та все ще імпортує. Мій файл sqldump складає всього 5 Гб. Мені було б цікаво пояснення цієї невідповідності
lucidbrot

17

Коли ви виконуєте mysqldump єдиної бази даних, всі таблиці скидаються в алфавітному порядку.

Природно, перезавантаження mysqldump у базу даних також відбуватиметься в алфавітному порядку.

Ви можете просто зробити ПОКАЗНИК ПРОЦЕСЛІСТА; і з'ясуйте З'єднання БД під управлінням mysqldump. Коли дамп буде перезавантажено, з'єднання БД зникне.

Якщо ви хочете знати, які таблиці є у dumpfile, запустіть це проти foobar.sql

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

ОНОВЛЕННЯ 2012-05-02 13:53 EDT

Вибачте, що не помітили, що є лише одна таблиця.

Якщо таблиця MyISAM, єдиний спосіб моніторингу - це з точки зору ОС. Причина? Таблиця записується під час перезавантаження. Що ти шукаєш? Розмір .MYDі .MYIфайлів. Звичайно, вам потрібно порівняти це з тим, яким був розмір таблиці на іншому сервері БД, з якого ви імпортували.

Якщо таблиця InnoDB і у вас увімкнено innodb_file_per_table , єдиний спосіб моніторингу - це з точки зору ОС. Причина? Таблиця записується під час перезавантаження. Що ти шукаєш? Розмір .ibdфайлу. Звичайно, вам потрібно порівняти це з тим, яким був розмір таблиці на іншому сервері БД, з якого ви імпортували.

Якщо таблиця InnoDB і ви відключили innodb_file_per_table , навіть точка зору ОС не може допомогти.

ОНОВЛЕННЯ 2012-05-02 13:56 EDT

У минулому році я звернувся до чогось подібного: як отримати% прогрес для "типу db.sql | mysql"

ОНОВЛЕННЯ 2012-05-02 14:09 EDT

Оскільки стандартний 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прокоментувати з dumpfile ...

  • якщо таблиця MyISAM, спрацює SELECT COUNT (*)
  • якщо таблиця InnoDB, SELECT COUNT (*), ймовірно, сповільнить / зупинить завантаження, поки не буде виконано підрахунок

Це спрацювало. Дякую. Останнє питання - за досвідом, чи знаєте ви, чи час імпорту приблизно лінійний щодо розмірів .MYDта .MYIфайлів?
qazwsx

1
Перезавантаження таблиць лінійне. Перебудови індексу лінійні. Роки тому це було не так, як я зважився на це як запитання до MySQL ( list.mysql.com/mysql/202489 ), і я згадав про це у DBA StackExchange ( dba.stackexchange.com/a/2697/877 )
RolandoMySQLDBA,

8

Кожні 2 секунди ви побачите запущені процеси.

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

Якщо ви хочете, щоб це було рідше, тоді додайте, -n xде x - кількість секунд. 5 секунд буде:

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

Чи можете ви розмістити приклад результату? Крім того, чи він просто показує процес чи він справді вказує на хід імпорту, про який я справді просив?
qazwsx

Це такий корисний код. Thankyou
NarayaN

6

Якщо ви просто хочете перевірити, чи він застопорився, ви можете запитувати

show processlist; 

і подивіться, що виконується.


5

Як рішення для того, хто не може змусити працювати на телевізорі або кому він каже брехню. Ви можете відстежувати розмір ibdata1 файлу в / var / lib / mysql, який містить дані. Це призведе до того ж розміру (або звідси) розміру файлів на вихідному сервері.

Якщо є багато таблиць, ви також можете спостерігати, як вони з'являються одна за одною в / var / lib / mysql / <ім'я бази даних>.

Цей факт я нещодавно використав, коли багаторічна база даних накопичила файл журналу приблизно 20G протягом періоду трьох-чотирьох років. Я помітив, що передача проходила у віці і використовувала цю методику для моніторингу прогресу.

Я думаю, що навряд чи настане день, коли база даних не містить файлу десь чи іншого. Тим часом ви можете відстежувати файл, щоб побачити, як передача прогресує. Запропонований нами метод - це те, що ви могли зробити в тій чи іншій формі з моменту написання першої бази даних sql. Я ніколи не збирався припускати, що ручний жокей може повернутися до будь-якої "офіційної" техніки. Він передбачає загальний рівень володіння комп’ютерами взагалі та unix зокрема.


2

Якщо ваш БД інакше тихий (тобто немає інших користувачів активних), і ви хочете просто побачити читання / запис, чому б просто не зробити щось на кшталт:

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

Ви побачите кількість читань / записів / вставок / очікувань / оновлень.

Якщо ви вставляєте, наприклад, ви побачите щось на кшталт:

Innodb_rows_inserted                          | 28958 

Де 28958 - кількість рядків, вставлених за ваш інтервал (у моєму випадку 10 секунд).


1

Для того, хто шукає приклад перегляду труб, використовуючи mysqldumpвас, ви просто зробите щось подібне:

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

-WПрапор просто говорить р чекати перших байти прийти перед показом прогресу (після запрошення)



0

Гаразд, ще одна робота навколо. Але це може бути найгірший і неточний варіант.

Однак, ось моє рішення для Windows:

Відкрийте диспетчер завдань, натиснувши

CTRL + SHIFT + ESC

Скопіюйте швидкість значення диска "mysqld.exe"

e.g. 11mb/s

Помістіть це в такий калькулятор: https://techinternets.com/copy_calc?do

Оцініть ЗНО. Моя справа:

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

Результати:

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

-1

Я настільки здивований, що ніхто не опублікував опцію "mysql -v". Якщо він застрягне, вихід припиниться.


3
"Моніторинг прогресу" зазвичай означає намагатися оцінити, наскільки прогресував процес або коли він завершиться, що mysql -vне запропонує. Крім того, виведення 7 Гб даних на термінал значно сповільнить відновлення.
мустаччо

бачу, дякую за пояснення. це правда, вихід 7 Гб не буде корисним для виведення в термінал. Я здогадуюсь, що я використовую -v був лише для невеликого місцевого тестового випадку, де мій db просто застряг би.
dtc

2
Ця пропозиція допомогла мені визначити проблему, наскільки це непрактично для використання з великими файлами. (Моя була маленька).
Кейсі Перкінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.