Як створити резервну копію бази даних mysql, але з низьким пріоритетом?


15

Я хочу створити резервну копію бази даних, але протягом дня, коли на сервері є завантаження. Важливо, щоб резервна копія не впливала на apache та інші бази даних, що працюють на одному сервері.

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

Як я можу це зробити?

Оновлення: Схоже, просто використовувати приємне з mysqldump не працює, оскільки mysqldump породить новий процес.


ви подивилися на mysqlhotcopy?

@fsb як mysqlhotcopy підтримує те, що хоче ОП?
Томаш

Відповіді:


8

Якщо у вас є запасний сервер, який може впоратися з завантаженням вашого сервера, ви можете встановити реплікацію на цей сервер, а потім зробити резервну копію з підлеглого сервера. Це також має перевагу в тому, що ви можете зупинити реплікацію, роблячи резервну копію та отримувати послідовний знімок даних у всіх базах даних або всіх таблицях в одній базі даних, не впливаючи на сервер бази даних. Це налаштування, яке я завжди рекомендую створити для резервного копіювання MySQL, якщо у вас є ресурси.

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


На жаль, ця опція виглядає як найбільшою роботою, але я думаю, що це єдиний реальний варіант, якщо я хочу мінімального впливу на основний сервер.
андюк

2
Це майже єдиний спосіб отримати належну затримку резервного копіювання, якщо ви не хочете впливати на операції. Оскільки уповільнення mysqldumpспричинить затримку тривалого блокування або не синхронізацію таблиць.
Ден Карлі

15

Енді, на даний момент я здогадуюсь, що у тебе було достатньо часу, щоб знайти рішення. Нещодавно я придумав рішення цього питання, яке для мене чудово працює в таблицях , і я подумав, що поділюсь цим.

cstream - це інструмент для обробки потоків загального призначення, як UNIX dd, який зазвичай використовується в трубах, побудованих командним рядком . Те, що робить cstream корисним для нас, це те, що він дозволяє вказати максимальну пропускну здатність для всіх вхідних даних. Це означає, що ви можете обмежити IO диска своєї команди 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-транзакція --quick -u -p | pv - допустима межа 1м> пункт призначення (або | nc або | tar cfj backup.bz2 -)

Приємно в цьому - різні варіанти моніторингу прогресу та опція -R, яка дозволяє передавати параметри вже запущеному процесу, наприклад; --raterate-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 для пріоритету вводу / виводу та приємно для пріоритету процесора.

Запустіть vmstat 5, перевірте стовпчик із написом WA. Високе значення означає, що процесор чекає вводу / виводу. Використовуйте ionice, якщо її тільки завантаження процесора, використовуйте nice.

Відповідь на оновлення:

Здається, ви праві. Він називає mysql, який не озвучений. Я думаю, ви могли б використовувати для цього renice і встановити приємне значення після його запуску.

У мене немає достатньо великої бази даних, щоб скинути атм, щоб зробити корисний сценарій для вас.

Реплікація, як підказує ваше посилання, - це один із способів. Повторіть, зупиніть і скиньте на хості anthoer.


0

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


0

Ви завжди можете спробувати не виконувати його в години пік. Який би пріоритет ви не використовували, дамп все ще вимагатиме блокування всіх ваших таблиць.


Це неправда: якщо таблиці є InnoDB, на них не розміщується блокування для читання.
dr01
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.