2013-10-25 5 views
33

Раз в неделю мне нужно запустить гигантское обновление базы данных в моей локальной среды разработки, как так:Есть ли способ показать прогресс на `gunzip <database.sql.gz | mysql ... `процесс?

$ gunzip < /path/to/database1.sql.gz | mysql -uUSER -p database1 & 
$ gunzip < /path/to/database2.sql.gz | mysql -uUSER -p database2 & 
$ gunzip < /path/to/database3.sql.gz | mysql -uUSER -p database3 & 

Я пытаюсь запустить эти ночи, так как это может занять несколько часов, чтобы закончить.

Можете ли вы помочь мне придумать способ показать прогресс в решении этих задач?

Вот некоторые предположения:

  1. Получить несжатый размер файла БД и сравнить с моим местным размером дб
  2. Выполнить show processlist в MySQL, чтобы увидеть, что таблица это в настоящее время вставки (мой текущий метод, но некоторые таблицы огромны, и по крайней мере один мой дБ имеет только один гигантский стол, поэтому основная часть процесса застряла в этой таблице, оставив эту опцию менее полезной)

Все файлы db.sql.gz являются стандартными gzipped mysqldumps, поэтому Я не думаю, что смогу построить что-нибудь на свалки, чтобы дать мне обновление. (Но я открыт к тому, что если я что-то отсутствует)


Баунти Правила

Ответы должны:

  1. Обеспечить полезный и достаточно точный ход (или визуальный как scp (предпочтительно!) или через простую таблицу базы данных прогресса, к которой можно легко получить доступ).
  2. Не нарушать регулярный mysqldump экспорт или регулярные gunzip ... | mysql импорта (для других инженеров, которые не могут использовать все, что вы придумали)
  3. не дать моему DBA сердечного приступа - так легко остаться на специальных mysqldump или альтернативных запросах MySQL филиалов.

ответ

87

Вы можете использовать -v: Подробный режим (показать прогресс) в вашей команде, или есть другой способ с использованием труб Viewer (pv), который показывает ход Gzip, команда Gunzip следующим образом:

$ pv database1.sql.gz | gunzip | mysql -u root -p database1 

Этого выхода прогресс будет похож на УППЫ:

$ pv database1.sql.gz | gunzip | mysql -uroot -p database1 
    593MiB 1:00:33 [ 225kiB/s] [====================>    ] 58% ETA 0:42:25 

Вы также можете использовать трубы просмотр для контроля туздЫшпра:

mysqldump -uroot -p database1 | pv | gzip -9 > database1.sql.gz 

Если вы уже не имеете pv, вы можете установить его с помощью:

yum install pv 

или MacPorts

sudo port install pv 
+0

Спасибо. Можете ли вы продемонстрировать, как это будет работать в контексте распаковки и импорта в MySQL для достижения значимого прогресса на протяжении всего процесса? – Ryan

+4

# pv gunzip] 11% ETA 0:02:10 – Ali

+0

Обновление: Это решение является фантастическим! Как можно лучше. Индикатор ETA колеблется больше, чем я хотел бы, но его следует ожидать, поскольку различные процессы замедляются или ускоряются на этом пути. @ factorde7 заслуживает крупных авансов для этого решения. Хотел бы я знать об этом много лет назад. – Ryan

1

Я думаю, что я бы выполнить базу данных раскрывающихся перед загрузкой копии данных, и после этого я смог запустить непрерывный «du -sh» в каталоге баз данных. Если я знаю размер исходного каталога базы данных (почему бы и нет?), то я могу использовать его в качестве монитора прогресса. Являются ли db недоступными?

+0

Да, я разделяю столько же в моем вопросе выше. Я надеялся на большее. – Ryan