Получить индикатор прогресса при импорте баз данных MySQL

21

Я часто импортирую базы данных MySQL, и это может занять некоторое время. Нет никакого индикатора прогресса вообще. Можно ли это как-то показать? Либо импортированные записи, импортированные МБ, либо импортированные таблицы ... все лучше, чем просто ожидание. Есть идеи?

Я использую эту команду:

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: Еще лучшее решение с полной шкалой прогресса. Для этого вам нужно использовать 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}'

Уф ... так что последнее, что вам нужно сделать, это просто объединить все вместе.

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

Чтобы сделать его еще лучше, вы можете добавить progres 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файл.

sobi3ch
источник
это круто.
Дэйва
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;
Джордж М
источник