Навеяно статьёй "Ускорение резервирования базы данных" из журнала "Системный администратор" за декабрь 2012 год #12(121).
Основной смысл статьи был в том что бы не сохранять предварительные данные из mysqldump в файл который будет сжиматься, а сразу сжимать поток и записывать его на диск. Я сразу заинтересовался этой статьёй, т.к. у меня на сервере то же существует так скажем лишняя нагрузка которая меня нервирует.
У себя я использую bzip2 т.к. он лучше сжимает файл, но как результат у меня бекап снимается за 13m18.770s то есть всё выгляло изначально примерно так:
mysqldump --user=dumper --password=secret db_name --single-transaction --lock-tables --quick ${work_dir}/mysql/db_name.sql bzip2 -9 ${work_dir}/mysql/db_name.sql #13m18.770s
Я решил поменять это метод сжатия на gzip и избавиться от промежуточного файла
mysqldump --user=dumper --password=secret db_name --single-transaction --lock-tables --quick | gzip > ${work_dir}/mysql/$db_name.sql.gz #1m46.244s
Заметное сокращение по времени! Но я решил попробовать использовать pigz - он использует при сжатие несколько потоков что сокращает время создания бекапа:
mysqldump --user=dumper --password=secret db_name --single-transaction --lock-tables --quick | pigz > ${work_dir}/mysql/$db_name.sql.gz #1m21.159s
Разница не большая но есть. В итоге что я получаю: при смене алгоритма сжатия размер дампа увеличился на четверть (с 400МБ до 500 МБ), а скорость создания уменьшилась в 10 раз. Учитывая что размер дисков мне позволяет хранить ежедневные дампы за несколько лет, то я решил что увеличение размера дампа это не большая потеря по сравнению с выйгрышем во времени. А вот что касается использования pigz вместо gzip то тут я решил что это лишнее, т.к. увеличение скорости слишком маленькое, а в результате вместо одного занятого ядра у меня получается два занятых ядра. В итоге я оставил gzip.
Автор: Сергей Степанов
Поделиться @
mysqldump | bzip2 filename.bz2
Текстовые потоки это unix-way, поэтому большинство программ под unix-подобные ОС с ними работают. Тем более консольные.
Тут надо разобраться на что имено уходило так много времени. Думаю даже если записать файл на диск два раза, то время в 13 раз не вырастет. Даже если его ещё раз и удалить, если это не SSD. Значит время уходило на сжатие. Возможно если убрать -9, то и первый вариант будет работать быстрей, т. к. это параметр сжатия и он не умолчальный. А если оно нужно, то gzip и наверное pigz тоже их поддерживают. И тогда надо посмотреть, будет ли отрыв по времени в 13 раз.
Предварительное сохранение тоже может иметь плюс. Если сжатие длится долго, то подозреваю mysqldump не закончится и не разлочит таблицы базы, пока не завершится сжатие. Т. е. база данных будет недоступна для программ, как минимум на запись. Если это важно, то надо проверять что происходит быстрее - запись в большой несжатый файл или сжатие с записью маленького сжатого.
Если же отказ от bzip2 вызван только желанием использовать текстовый поток без сохранения промежуточного файла, то gzip и наверное pigz тоже умеют так работать. Т. е. не понятна суть статьи, что-на что меняем и для чего.