есть ли способ иметь индикатор выполнения mysqldump, который показывает пользователям статус их резервных копий?


Мне было интересно, есть ли способ определить, в то время как mysqldump работает, сколько из резервной копии завершено или сколько осталось?

Я хотел бы предоставить моим пользователям индикатор выполнения консоли, чтобы показать им состояние их резервных копий...

кстати я хочу написать выше программу в стандартном c++ и платформа будет linux. спасибо!

3 55

3 ответа:

да, a патч был совершен 27 марта, 2010:

этот новый патч имеет дополнительный параметр -- show-progress-size который по по умолчанию установлен на 10 000. Поэтому, когда используется -- verbose, каждые 10 000 строки вы получите регулярный вывод состояния количества строк для a конкретный стол свалил.

Так что проверьте свою версию, обновите при необходимости и наслаждайтесь.

установить и использовать pv (он доступен в виде пакета yum для CentOS)

http://www.ivarch.com/programs/pv.shtml

PV ("Pipe Viewer") - это инструмент для мониторинга хода выполнения данных по трубопроводу. Его можно ввести в любой нормальный трубопровод между двумя процессами, чтобы дать визуальное представление о том, как быстро данные проходит через, сколько времени это заняло, как близко к завершению его есть, и оценка того, как долго это будет до завершения.

предполагая ожидаемый размер результирующего файла дампа.sql файл 100м (100 мегабайт), использование pv будет выглядеть следующим образом:

mysqldump <parameters> | pv --progress --size 100m > dumpfile.sql

выход консоли будет выглядеть так:

[===> ] 20%

посмотрите на главную страницу man pv дополнительные параметры. Вы можете отобразить скорость передачи, или сколько времени прошло, или сколько байтов было передано, и многое другое.

если вы не знаете размер файла дампа, есть способ, чтобы получить размер базы данных MySQL из table_schema - это не будет размер файла дампа, но это может быть достаточно близко для ваших нужд:

SELECT table_schema AS "Database", ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema;

обновление

по моему опыту, при сбросе всего сервера MySQL фактический несжатый размер дампа mysql (используя опцию mysqldump --hex-blob) составляет примерно от 75% до 85% от реального размера данных MySQL, полученных из information_schema. Так для общего решения, я мог бы попробовать следующее:

SIZE_BYTES=$(mysql --skip-column-names <parameters> <<< 'SELECT ROUND(SUM(data_length) * 0.8) AS "size_bytes" FROM information_schema.TABLES;')

mysqldump <parameters> --hex-blob | pv --progress --size $SIZE_BYTES > dumpfile.sql

полная версия Russell E Glaue ответ. Получить округленный размер БД, как pv принимает только целое число и вычислить длину данных без индексов, в @mtoloo комментарий:

db_size=$(mysql  -h"$DB_HOST" \
    -u"$DB_USERNAME" \
    -p"$DB_PASSWORD" \
    --silent \
    --skip-column-names \
    -e "SELECT ROUND(SUM(data_length) / 1024 / 1024, 0) \
        FROM information_schema.TABLES \
        WHERE table_schema='$DB_NAME';")

создайте резервную копию в имя файла с меткой времени:

mysqldump -h"$DB_HOST" \
    -u"$DB_USERNAME" \
    -p"$DB_PASSWORD" \
    --single-transaction \
    --order-by-primary \
    --compress \
    $DB_NAME | pv --progress --size "$db_size"m > "$(date +%Y%m%d)"_backup.sql