Отримайте показник прогресу при імпорті баз даних MySQL


21

Я часто імпортую бази даних MySQL, і це може зайняти деякий час. Індикатора прогресу взагалі немає. Можна когось показати, якось? Або імпортовані записи, або імпортовані MB, або імпортовані таблиці ... все краще, ніж просто чекати. Хтось має ідею?

Я використовую цю команду:

mysql -uuser -p -hhost database < largefile.sql

Файли розміром від 40 до 300 Мб, а хост знаходиться в локальній мережі.



@sr_ Я думаю pv, саме запитувач шукає. Я щойно встановив його на CentOS через rpmforge. Якщо задати параметр розміру, він навіть покаже ETA.
Нілс

pvсправді трюк! Якщо хтось може відповісти на це, я можу це прийняти!
Відновіть Моніку

Відповіді:


31

Є приємний інструмент під назвою pv

# On Ubuntu/Debian system
$ sudo apt-get install pv

# On Redhat/CentOS
$ sudo yum install pv

тоді, наприклад, ви можете використовувати його так

$ zcat dbpackfile.sql.gz | pv -cN zcat | mysql -uuser -ppass dbname

Перевірте ОНОВЛЕННЯ 2 для моєї останньої версії

ps: перевірте цей блог http://blog.larsstrand.org/2011/12/tip-pipe-viewer.html

ОНОВЛЕННЯ: здається, що вище посилання порушено, але я знайшов ту саму статтю тут http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

ОНОВЛЕННЯ 2: Ще краще рішення з ПОВНОЮ панеллю прогресу. Для цього вам потрібно скористатися двома pvпараметрами збірки . Одне - --progressвказати смугу прогресу, а друге - --sizeсказати, pvнаскільки великий загальний файл.

pv --progress --size UNPACKED-FILE-SIZE-IN-BYTES

.. проблема в .gzоригінальному розмірі файлу. Вам потрібно якось отримати розпаковану оригінальну інформацію про розмір файлу, не розпаковуючи її самостійно, інакше ви втратите дорогоцінний час, щоб розпакувати цей файл вдвічі (перший раз за pvдругий раз zcat). Але на щастя, у вас є gzip -lваріант, який містить нестиснуту інформацію про наш gziped файл. На жаль, у вас він є у форматі таблиці, тому його потрібно витягнути, перш ніж він зможе його використовувати. Все разом можна побачити нижче:

gzip -l /path/to/our/database.sql.gz | sed -n 2p | awk '{print $2}'

Uff .. тому останнє, що вам потрібно зробити, це просто поєднати все разом.

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` | mysql -uuser -ppass dbname

Щоб зробити це ще приємніше, ви можете додати прогреси NAME, як це

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass dbname

Кінцевий результат:

Importing.. : [===========================================>] 100%

ОНОВЛЕННЯ 3: Для швидкого використання створіть власну функцію.

mysql_import() {
  zcat $2 | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass $1
}

використання:

mysql_import dbname /path/to/our/database.sql.gz

Якщо ви не знаєте, куди його покласти, прочитайте цю відповідь: /unix//a/106606/20056

Ви можете додавати функції серед псевдонімів. Таким чином, ви можете використовувати, наприклад, ~/.bash_aliasesфайл.


Це круто.
Дейв

1
Один лайнер з кращим результатом - це може бути такий:pv --progress --name 'DB Import in progress' -tea /path/to/our/database.sql.gz | zcat | mysql -h db_host -u db_user -pdb_password db_name
Денис Пітзаліс

16

Чому так складно?

Це добре працює:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database

Набагато простіше і чистіше!
donquixote

7

Я завжди імпортую бази даних з оболонки MySql. Він не забезпечує показника прогресу, але він (швидко) прокручує дії, які він виконує, тому я знаю, що це працює.

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.