Как далеко продвигается мой дамп MySQL?

В моей компании мы время от времени импортируем большие клиентские базы данных MySQL (40 ГБ +), которые могут занять более одного дня, чтобы загрузить наши машины для разработчиков. Хотя мы принимаем это время загрузки, так как оно выполняется в фоновом режиме, нам не хватает твердой способности оценивать, когда импорт будет завершен. Это блокирует нас от планирования соответствующего времени, чтобы действовать на нем. Это похоже на ожидание появления телеги.

Сейчас моя лучшая стратегия - это быстрая команда show tables, чтобы увидеть, какой процент загружаемых таблиц был загружен. Однако, поскольку размеры таблиц сильно различаются как друг с другом, так и с каждым клиентом, это даже не близко к надежным.

Есть ли у кого-нибудь хорошая техника или инструмент, которые можно использовать для получения надежного процента того, насколько далеко продвигается импорт MySQL?

Ответ 1

Вы можете сделать это с помощью команды pv, отправив дамп в mysql.

pv -i 1 -p -t -e /path/to/sql/dump | mysql -u USERNAME -p DATABASE_NAME

Он покажет вам индикатор выполнения во время выполнения импорта, основанный на пропускной способности ввода-вывода. (Как видно здесь.)

Ответ 2

HeidiSql расскажет вам, сколько GB загружено до сих пор, что очень полезно при попытке выяснить, сколько еще нужно загрузить.

Ответ 3

Вы также можете сделать show processlist в исходной базе данных, чтобы узнать, как далеко (путем автоматического увеличения ID) в определенную таблицу экспортируется. Эрик прекрасно понимает, что вы можете контролировать размер каталога данных базы данных по сравнению с размером источника.

Что-то, что я нашел полезным для ускорения дампов/импорта, заключается в том, чтобы делать это по таблицам, а затем запускать несколько mysqldumps одновременно, по сути, многопоточность вашего процесса. Обычно я делал около 4 отдельных сброса/восстановления одновременно. Оптимальное количество будет зависеть от ваших аппаратных и дисковых возможностей.

Очень простой пример, чтобы дать вам идею:

mysqldump dbname table1 table2 table3 | mysql -h host &
mysqldump dbname table4 table5 table6 | mysql -h host &
mysqldump dbname table7 table8 table9 | mysql -h host &