Чи є витончений чи безпечний перезапуск для mysql, як для apache httpd?


29

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

Відповіді:


37

Будь-яка "запитувана" послідовність вимкнення в MySQL (не має значення kill -9) є дещо витонченою , оскільки операції, що проводяться (за транзакційними таблицями), повертаються назад, але ось кілька способів зробити перезапуск максимально чистим.

Примітка: якщо ви вимикаєте сервер для оновлення, не використовуйте цей процес; натомість слідкуйте за процесом, детальним у цій відповіді .

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

По-перше, увімкніть, innodb_fast_shutdownякщо цього ще немає. Це не пов'язане безпосередньо з витонченістю відключення, але це повинно швидше повернути ваш сервер.

mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)

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

mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)

FLUSH TABLESЗаява (з опціональним LOCALключовим словом, що дозволяє уникнути непотрібний , але в іншому випадку нешкідливого флеш будь-яких рабів) буде блокувати і ваша підказка не повернуся , поки все таблиці не може бути закритий. Після того, як кожна таблиця буде "розмита" (закрита), якщо запит згодом посилається на таблицю, вона буде автоматично відкрита, але це нормально. На цьому кроці ми робимо менше роботи для останнього кроку:

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)

mysql>

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

У вас не може бути глобального блокування читання, поки не буде виконано кожен поточний запит "написати" (тобто, майже все, але SELECT). Видача запиту на блокування дозволить існуючим запитам закінчуватися, але не дозволить запускати нові.

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

  • Ви передумаєте про перезапуск і відпустите замок вручну ( UNLOCK TABLES;)
  • перезавантажте сервер, або
  • ви випадково чи навмисно відключили клієнта командного рядка від цього потоку (тому не робіть цього). Зберігайте це вікно підключеним і сидіти за запитом mysql:

Втримайтеся від спокуси закрити це.

mysql>

Цей підказки простої консолі - це те, що тримає глобальний замок для вас. Втратити це, втратити замок.

У іншому вікні консолі перезапустіть MySQL так, як ви зазвичай робили, або з initscripts (наприклад, вашим локальним варіантом service mysql.server restart), або з mysqladmin shutdownподальшим ручним перезавантаженням.


Чи innodb_fast_shutdown = 1справді використання гарантує, що MySQL запускається швидше? Дивлячись на документи, здається, що це покращує швидкість відключення (ціною швидкості запуску?).
Кріс

Ідея @Chris полягає в тому, що це допомагає гарантувати, що все закриття + запуск буде настільки ж швидким, як і практичним, але це дещо анекдотично, оскільки обсяг роботи, що проводиться, теоретично однаковий - просто переміщений на іншу сторону послідовності - все ж чомусь це загалом здавалося, що в цілому швидше, як, мабуть, є деяка неефективність у тому, як це відбувається при відключенні, чого немає при запуску. Важко сказати.
Майкл - sqlbot

2

Коротше кажучи, деякі найкращі практики, які слід враховувати перед вимкненням MySQL:

  1. Підтвердіть екземпляр, який ви збираєтеся закрити, щоб уникнути помилки зупинки іншого екземпляра.
  2. Зупиніть реплікацію, якщо ви збираєтесь відключити раба mysql> STOP SLAVE;.
  3. Заздалегідь промийте брудні сторінки, щоб скоротити час завершення роботи mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;.
  4. Перевірте тривалі запити mysql> SHOW PROCESSLIST;, вбийте їх mysql> kill thread_id;або почекайте, поки вони закінчать.
  5. Скиньте буферний пул при відключенні mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;та перезавантажте його при запуску, # vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ON щоб розігріти буферний пул.

Після підтвердження попередніх пунктів можна сміливо перезапустити MySQL shell$ service mysql restart

Детальніше дивіться у моєму повідомлення Перевірте це, перш ніж вимкнути MySQL!


Чому це було знято? Я не знаю достатньо, щоб визнати, які команди (и) є поганими, але я хочу знати, щоб я міг їх уникнути.
Джон

Я не знаю, що що-небудь із перерахованого вище - це погана команда. Я дотримуюся вищезазначених кроків і так багато людей роблять. Тільки крок 4 повинен бути обережним, ви не повинні вбивати жоден запит, поки ви не будете впевнені в тому, що робите, інакше чекайте, поки тривалі запити завершаться. Спробуйте, і якщо це допомогло вам, відхиліть його, якщо інакше - негайно!
Moll
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.