Відповіді:
Будь-яка "запитувана" послідовність вимкнення в 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 так, як ви зазвичай робили, або з initscripts (наприклад, вашим локальним варіантом service mysql.server restart
), або з mysqladmin shutdown
подальшим ручним перезавантаженням.
Коротше кажучи, деякі найкращі практики, які слід враховувати перед вимкненням MySQL:
mysql> STOP SLAVE;
.mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
.mysql> SHOW PROCESSLIST;
, вбийте їх mysql> kill thread_id;
або почекайте, поки вони закінчать.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!
innodb_fast_shutdown = 1
справді використання гарантує, що MySQL запускається швидше? Дивлячись на документи, здається, що це покращує швидкість відключення (ціною швидкості запуску?).