Как сделать резервную копию базы данных MySQL, но с низким приоритетом?


15

Я хочу сделать резервную копию базы данных, но в течение дня, когда есть нагрузка на сервер. Крайне важно, чтобы резервное копирование не влияло на apache и другие базы данных, работающие на одном сервере.

Должна быть возможность использовать команду mysqldump , но запустить команду с низким приоритетом.

Как я могу это сделать?

Обновление: похоже, просто использование nice с mysqldump не работает, поскольку mysqldump порождает новый процесс.


вы смотрели на mysqlhotcopy?

@fsb как mysqlhotcopy поддерживает то, что хочет ОП?
Томас

Ответы:


8

Если у вас есть запасной сервер, который может справиться с нагрузкой записи вашего сервера, вы можете настроить репликацию на этот сервер, а затем выполнить резервное копирование с подчиненного сервера. Это также имеет то преимущество, что вы можете останавливать репликацию во время резервного копирования и получать согласованный снимок ваших данных по всем базам данных или всем таблицам в одной базе данных, не влияя на сервер баз данных. Это настройка, которую я всегда рекомендую для резервного копирования MySQL, если у вас есть ресурсы.

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


К сожалению, эта опция выглядит так, как будто она наиболее эффективна, но я думаю, что это единственная реальная опция, если я хочу минимального воздействия на основной сервер.
Андюк

2
Это почти единственный способ получить правильно приостановленную резервную копию, если вы не хотите влиять на операции. Поскольку замедление mysqldumpлибо приведет к удержанию длинной блокировки, либо к несинхронизации таблиц.
Дэн Карли

15

Энди, я думаю, у тебя было достаточно времени, чтобы найти решение. Недавно я нашел решение для этого, которое отлично работает для меня в tsheets , и решил, что поделюсь им.

cstream - это инструмент обработки потока общего назначения, такой как UNIX dd, обычно используемый в каналах, сконструированных из командной строки. Что делает cstream полезным для нас, так это то, что он позволяет вам указать максимальную пропускную способность для всех входных данных. Это означает, что вы можете ограничить дисковый ввод-вывод вашей команды mysqldump с помощью такой простой команды:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

Предполагая, что вы создаете резервную копию базы данных, которая использует все таблицы InnoDB, приведенная выше команда безопасна (не повлияет на другие запросы) и выполнит ваш mysqldump, ограничивая чтение с диска только одним мегабайтом в секунду. Настройте пропускную способность с помощью параметра -t на любое значение, которое позволит вашей среде выполнять резервное копирование, не влияя на работу вашего клиента.


Только что проверил, и я работаю как шарм! Спасибо, что поделились с Брэндоном!
sucotronic

4

FWIW вы также должны быть в состоянии сделать это с PV ( http://linux.die.net/man/1/pv )

mysqldump --single -action --quick -u -p | pv --rate-limit 1m> destination (или | nc или | tar cfj backup.bz2 -)

Хорошая вещь об этом - это различные опции для мониторинга прогресса и опция -R, которая позволяет вам передавать опции уже запущенному процессу, например; -rate-limit для изменения скорости передачи.


1

если вы используете innodb, вы можете попробовать xtrabackup с опцией --throttle .

вы также можете посмотреть на ionice и запустить mysqldump вместе с ним.

или, может быть, вы хотите включить двоичное ведение журнала в mysql и запускать полный дамп раз в неделю / ночь, копируя bin-журналы в безопасное место каждые 1-2 часа. и ... ведомое устройство только для чтения для резервного копирования также является опцией.


0

Если вы работаете с Linux или другим вариантом * nix, вы можете сделать это следующим образом:

хороший -n ## mysqldump

Это даст ему более низкий приоритет планирования. Планирование диапазона приоритетов от -20 (самый высокий приоритет) до 19 (самый низкий приоритет). Значение по умолчанию для nice равно 10, если аргумент -n опущен.


0

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 для приоритета ввода / вывода и nice для приоритета процессора.

Запустите vmstat 5, проверьте столбец с надписью WA. Высокое значение означает, что процессор ожидает ввода-вывода. Используйте ionice, если это просто загрузка процессора, используйте nice.

Ответ на обновление:

Кажется, ты прав. Это вызывает mysql, который не замечен. Я думаю, вы могли бы использовать renice для этого и установить значение nice после его запуска.

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

Репликация, как подсказывает ваша ссылка, является одним из способов. Воспроизведите, остановите и сбросьте на другом хосте.


0

Поместите свои данные MySQL в LV и используйте специальное задание mylvmbackup, которое делает снимок LV и разбирает файлы данных MySQL. Таким образом, вы не блокируете таблицы, сводя к минимуму влияние ваших приложений на нагрузку ввода-вывода.


0

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


Это не так: если таблицы InnoDB, на них не ставится блокировка для чтения.
Dr01
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.