Користувачі скаржаться, що система працює повільно, коли виконується mysqldump


9

База даних MYSQL (ibdata1) має розмір 73 ГБ і налаштована для роботи як виділений сервер бази даних на ОС Windows 2008 O / S для таблиць INNODB. Ми запускаємо резервну копію за допомогою mysqldump mysqldump --skip-opt --quick --single-транзакція --create-options --extended-insert --disable-keys --add-drop-table --complete-insert - set-charset - стиснути --log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

Файл резервного копіювання Proddb0635.sql зберігається на окремому сервері від сервера баз даних. Оперативна пам’ять - 12 ГБ. Розмір басейну INNODB становить 6 ГБ. Додатковий mem.pool - 32 Мб. Розмір кешу запитів - 2 ГБ, чиста довжина буфера - 16 М Макс. розмір пакета 1 Гб.

версія mysql - 5.0.67.

Коли резервне копіювання не працює, користувачі задоволені продуктивністю.

Коли резервне копіювання запущене, частота звернень до пулу INNODB - близько 100%. Немає жодних читання чи записів, що очікують на очікування. innodb зачекати безкоштовно 0. Використання процесора не високе мінімум 9% до максимум 15% Частота звернення до кеш-запитів низька, близько 40% із запуском mysqlbackup або без нього. Наразі Windows Task Manager відображає, що використовується 10 Гб оперативної пам’яті. Чи варто збільшити кеш запитів, лише 2 ГБ оперативної пам’яті? mysqlld-nt займає 9,2 ГБ оперативної пам’яті, а mysqldump - 5 Мб оперативної пам’яті. Алос зазначив, що розмір дамп-файлу однаковий за наявності чи відсутності опції --compress.

Чи можу я зменшити розмір буфера iNNODB?

Дякую

Відповіді:


8

У Windows існує відома проблема, що при натисканні великого файлу на інший сервер вся пам'ять закінчується виділенням в кеш-пам'ять системи замість користувачів-процесів. Ви можете подивитися в розділі "Фізична пам'ять" (MB) менеджера завдань, щоб побачити, скільки пам'яті виділено в системний кеш.

Це можна вирішити, створивши резервну копію на локальному диску, після чого віддалену машину витягніть цей файл.


Дякую, мрденні. У нас є наші диски, які зберігаються на SAN.Чи впливають і на це?
dbachacha

1
Це питання незалежно від того, як представлено сховище. Оскільки сховище є пам’яттю SAN, немає необхідності копіювати файли по мережі на іншу машину. Представіть новий LUN на MySQL Server, а потім створіть резервну копію на цій машині. Якщо вам потрібно перенести файли на іншу машину для резервного копіювання стрічки, використовуйте SAN. Зніміть LUN, подайте знімок на сервер резервного копіювання, створіть резервну копію файлів, а потім видаліть знімок. Повторіть наступного дня. Це, ймовірно, все може бути сценарієм.
mrdenny

Ваша перша пропозиція: # не змінилося в кеш-системі. Що стосується LUN, то я передам це своїм колегам, які працюють у System & Network Team.
dbachacha

Я перемістив сценарій резервного копіювання для запуску на інший сервер, і там значно покращився. Крім того, ми виявили, що код програми не повторно використовує синхронне з'єднання, а відкриває / закриває в декількох функціях, згрупованих в один запит до сервера баз даних. Також я виявив, що одна картка NIC ділиться резервними даними резервного копіювання та даними онлайн-транзакцій. Отже, ми плануємо створити спеціальний NIC саме для резервного копіювання. Дуже дякую.
dbachacha

7

Ось кілька міркувань щодо покращення продуктивності mysqldump, враховуючи ваші обставини. Ось ваша команда:

mysqldump --skip-opt --quick --single-транзакція --create-options --extended-insert --disable-keys --add-drop table --комплект вставки --set-charset --compress - -log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

Перше, що я помічаю - це ви перенаправляєте вихід до файлової системи. Він говорить "devNas", тому я припускаю, що це мережеве приєднане сховище . Я фанат NAS для резервного копіювання, але він повинен бути підключений на окремому фізичному NIC від виробничого трафіку . Можливо, ви не насичуєте пропускну здатність, але вони все ще конкурують. Це стане більшою проблемою через прапор --quick, оскільки він промиває кожен рядок, а не зберігає його в пам'яті.

Наступне, що я бачу - це те, що ви попросили --compress. Схоже, ви локально використовуєте mysql, оскільки ви не використовували перемикач -h. Для цього можливо використовувати місцевий процесор, що в цьому контексті непотрібне. Чи потрібно - компрес? Він стискає дані лише між клієнтом mysqldump та сервером mysql, а не вмістом файлу.

Далі я бачу, що ви використовуєте прапор --single-транзакції. Це викличе додатковий процесор, оскільки він тестує кожен вибір, як частину mysqldump.

Це не має нічого спільного з продуктивністю, але ви використовуєте клавіші -disable, які працюють лише на MyISAM ( керівництво ).

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


Так, я перевірив у Мережі та системного адміністратора. Це мережеве приєднане сховище. Я можу спробувати перемістити mysqldump на інший сервер. Крім того, тепер мені стало сенсом щодо використання --compress. У посібнику сказано, що --compress працює з клієнтом і сервером, але я помітив, чи має це значення. Який тип даних протікає між клієнтом, який запускає mysqldump, і сервером бази даних mysql. Дані протікають між сервером бази даних mysql та devNas. Документація MySQl та дизайн та налаштування баз даних книги віддають перевагу використанню однократних транзакцій для таблиць INNODB.
дбачача

Я перемістив сценарій резервного копіювання для запуску на інший сервер, і там значно покращився. Крім того, ми виявили, що код програми не повторно використовує синхронне з'єднання, а відкриває / закриває в декількох функціях, згрупованих в один запит до сервера баз даних. Також я виявив, що одна картка NIC ділиться резервними даними резервного копіювання та даними онлайн-транзакцій. Отже, ми плануємо створити спеціальний NIC саме для резервного копіювання. Дуже дякую.
dbachacha

Я радий, що це допомагає. Найкращі побажання.
випадковий

Тут мені потрібна допомога, щоб зрозуміти такий сценарій: База даних mysql знаходиться на сервері A. mysqldump працює на сервері B, який скидає дані на сервер C. У нас є виділений NIC з сервера A на сервер C. Це правильно? Я не був впевнений, тому минулої ночі mysqldump працював на сервері A. Я хотів би запустити його на іншому сервері, щоб зменшити суперечки процесора.
dbachacha

mysqldump - це «утиліта клієнта», тобто ви можете запустити його з будь-якого хоста, який має права доступу до таблиць бази даних. Стратегією для вас було б запустити mysqldump з оболонки Server C, націленої на таблиці Server A. Звичайно, вам доведеться надати доступ із сервера С до схеми, яку ви хочете скинути.
випадковий

2

ЗАБЕЗПЕЧЕННЯ №1

Тут потрібно пам’ятати, виконуючи mysqldump проти InnoDB.

Які б брудні сторінки не існували в буферному басейні InnoDB, слід спочатку видалити на диск. Функція mysqldump спровокує промивання таблиці InnoDB, яка все ще містить брудні сторінки.

Існує параметр сервера під назвою innodb_max_dirty_pages_pct . Значенням за замовчуванням 75 є MySQL 5.5 та 90 у версіях MySQL до 5.5. У виробничому середовищі нормально залишити це число за замовчуванням.

Щоб побачити, чи є у вас багато брудних сторінок у басейні InnoDB, запустіть це:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';

До речі, сторінка становить 16 К, як показано з цього:

SHOW GLOBAL STATUS LIKE 'Innodb_page_size';

Якщо мова йде про InnoDB та mysqldump, ви можете знизити це число за двох обставин.

ОБСТОЯТЬ 1: Постійно встановіть його на 0

Просто додайте це до my.ini:

[mysqld]
innodb_max_dirty_pages_pct=0

Це дозволить зберегти буферний басейн InnoDB слабким і середнім. Етап промивання завантаженої таблиці InnoDB буде швидким, оскільки перед тим, як mysqldump працюватиме на ній, потрібно пропустити кілька можливих брудних сторінок (можливо 0).

Єдиний недолік - якщо ви mysqldump з БД з великою торгівлею людьми, можливо, зменшиться кількість вводу / виводу для запису через меншу частоту вимивання брудної сторінки. Ви можете визначити, чи це так без перезавантаження mysql, виконавши це:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Залиште налаштування на 12-24 години, якщо продуктивність запису прийнятна, ви добре піти. Якщо ні, поверніть його за допомогою:

SET GLOBAL innodb_max_dirty_pages_pct = 90;

ОБСТОЯТЬ 2: Встановіть його на 0 приблизно за 1 годину до mysqldump

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Запустіть mysqldump

SET GLOBAL innodb_max_dirty_pages_pct = 90;

ЗАБЕЗПЕЧЕННЯ №2

У вас є --complete-insert як опція mysqldump. Це вбудує назви стовпців у кожну позицію INSERT перед пунктом VALUES. Навіть із --extended-insert, на кожній вставленій партії рядків імена стовпців надсилаються у mysqldump. Ви можете зменшити кількість байтів, надісланих на mysqldump, видаливши --complete-insert.

РЕКОМЕНДАЦІЯ

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


Дякую. Я забув згадати, що користувачі скаржаться, що "економія" потребує часу, а не читання. Я негайно здійсню ваше спостереження №2. Мені напевно подобається ваша рекомендація мати раба, а потім взяти mysqldump з раба.
dbachacha

innodb_buffer_pool_dirty_pages був не надто високим перед початком резервного копіювання. Це приблизно від 9 до макс. 196. Господар-раб - це також хороша рекомендація.
dbachacha

1
Я перемістив сценарій резервного копіювання для запуску на інший сервер, і там значно покращився. Крім того, ми виявили, що код програми не повторно використовує синхронне з'єднання, а відкриває / закриває в декількох функціях, згрупованих в один запит до сервера баз даних. Також я виявив, що одна картка NIC ділиться резервними даними резервного копіювання та даними онлайн-транзакцій. Отже, ми плануємо створити спеціальний NIC саме для резервного копіювання. Дуже дякую. Якщо нічого з цього не вийде, то я впевнений, що і раб-хазяїн буде хорошим.
dbachacha
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.