Я хочу сделать резервную копию базы данных, но в течение дня, когда на сервере есть нагрузка. Жизненно важно, чтобы резервное копирование не влияло на apache и другие базы данных, работающие на том же сервере.
Должна быть возможность использовать mysqldump команда, но запустите команду с низким приоритетом.
Как я могу это сделать?
Обновить: Выглядит как простое использование nice с mysqldump не работает поскольку mysqldump порождает новый процесс.
Энди, я полагаю, у тебя было достаточно времени, чтобы найти решение. Я недавно придумал решение, которое отлично работает для меня в таблицы, и решил, что поделюсь им.
cstream - это универсальный инструмент для обработки потоков, такой как UNIX dd, обычно используемый в каналах, построенных из командной строки. Что делает cstream полезным для нас, так это то, что он позволяет вам указать максимальную пропускную способность для всего ввода. Это означает, что вы можете ограничить дисковый ввод-вывод вашей команды mysqldump с помощью такой простой команды:
mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql
Предполагая, что вы создаете резервную копию базы данных, которая использует все таблицы InnoDB, указанная выше команда безопасна (не повлияет на другие запросы) и выполнит ваш mysqldump, ограничивая чтение с диска до одного мегабайта в секунду. Настройте полосу пропускания с помощью параметра -t на любое значение, которое позволит вашей среде выполнять резервное копирование, не влияя на качество обслуживания клиентов.
Если у вас есть запасной сервер, который может справиться с нагрузкой записи вашего сервера, вы можете настроить репликацию на этот сервер, а затем выполнить резервное копирование с ведомого сервера. Это также имеет то преимущество, что вы можете остановить репликацию во время резервного копирования и получить согласованный моментальный снимок ваших данных для всех баз данных или всех таблиц в одной базе данных, не влияя на сервер базы данных. Я всегда рекомендую эту настройку для резервного копирования MySQL, если у вас есть ресурсы.
В качестве приятного бонуса теперь у вас есть подчиненное устройство только для чтения, которое вы можете использовать для медленных длительных запросов.
FWIW, вы также можете сделать это с помощью pv (http://linux.die.net/man/1/pv)
mysqldump --single-transaction --quick -u -p | pv --rate-limit 1m> destination (или | nc или | tar cfj backup.bz2 -)
Приятным здесь является наличие различных опций для отслеживания прогресса и опция -R, которая позволяет передавать опции уже запущенному процессу, например; --rate-limit для изменения скорости передачи.
если вы используете innodb, вы можете попробовать xtrabackup с дроссельной заслонкой вариант.
вы также можете посмотреть на ionice и запустите с ним mysqldump.
или, может быть, вы хотите включить двоичное ведение журнала в mysql и запускать полный дамп один раз в неделю / ночь, копируя бинарные журналы в безопасное место каждые 1-2 часа. и ... ведомое устройство только для чтения для целей резервного копирования также является вариантом.
Если вы используете его в Linux или другом варианте * nix, вы можете сделать это следующим образом:
приятно -n ## mysqldump
Это даст ему более низкий приоритет планирования. Диапазон приоритета планирования от -20 (высший приоритет) до 19 (низший приоритет), по умолчанию для nice - 10, если опущен аргумент -n.
cron.d / mysql_dump:
17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql
ionice для приоритета ввода / вывода и хорош для приоритета процессора.
Запустите vmstat 5, проверьте столбец с надписью WA. Высокое значение означает, что ЦП ожидает ввода-вывода. Используйте ionice, если это просто загрузка процессора, используйте nice.
Ответ на обновление:
Кажется, вы правы. Он вызывает mysql, который не поддерживается. Я думаю, вы могли бы использовать для этого renice и установить значение nice после его запуска.
Однако у меня нет достаточно большой базы данных, чтобы сбросить банкомат и создать для вас полезный сценарий.
Репликация, как подсказывает ваша ссылка, - это один из способов. Репликация, остановка и сброс на хосте Anthoer.
Поместите данные MySQL на LV и используйте аккуратный mylvmbackup задание, которое делает снимок LV и обрабатывает файлы данных MySQL. Таким образом, вы не блокируете таблицы, сводя к минимуму влияние на ваши приложения только нагрузки ввода-вывода.
Вы всегда можете попробовать не запускать его в часы пик. Какой бы приоритет вы ни использовали, дамп все равно потребует блокировки всех ваших таблиц.