Chtěl bych restartovat mysql elegantně stejně jako httpd, kde se vlákna před restartem obsluhují. Nechtěl bych rozbít dotazy.
Jakákoli "požadovaná" vypínací sekvence v MySQL (kratší než kill -9
) je poněkud půvabné , protože probíhající transakce (na tabulkách transakcí) jsou vráceny zpět, ale zde je několik způsobů, jak provést restart co nejčistší.
Poznámka: Pokud vypínáte server kvůli upgradu, tento proces nepoužívejte; místo toho postupujte podle postupu podrobně v této odpovědi .
V opačném případě, pokud právě restartujete jinak zdravý server, abyste mohli změnit globální proměnnou typu read-only nebo něco podobného, zde je půvabná cesta:
Nejprve povolte innodb_fast_shutdown
, pokud ještě není. To přímo nesouvisí s ladností vypnutí, ale mělo by to váš server vrátit rychleji.
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)
Dále pověřte server, aby zavřel všechny otevřené tabulky, jakmile na ně nebudou odkazovat žádné aktuálně spuštěné dotazy. Tento krok také nemá nic společného s elegantním odstavením, ale zrychlí následující krok:
mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)
FLUSH TABLES
příkaz (s volitelným klíčovým slovem LOCAL
, které se vyhýbá zbytečnému, ale jinak neškodnému vyprázdnění všech otroků), bude blokován a váš řádek se nevrátí, dokud nebudou všechny tabulky uzavřeny. Jakmile je každá tabulka „propláchnuta“ (uzavřena), pokud dotaz následně odkazuje na tabulku, bude automaticky znovu otevřena, ale to je v pořádku. Tímto krokem dosahujeme pro poslední krok méně práce:
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)
mysql>
Toto prohlášení propláchne všechny tabulky (tedy výhodu spočívající v tom, že se některé z nich zbaví méně rušivého postupu s předchozím krokem) a získává globální (na celém serveru) zámek jen pro čtení.
Nemůžete mít globální zámek čtení, dokud nebude dokončen každý aktuálně spuštěný dotaz „write“ (tj. Téměř všechno kromě SELECT
). Vydání požadavku na zámek umožní dokončení existujících dotazů, ale neumožní spuštění nových.
Výzva se nevrací, dokud nezůstanete tento globální zámek, takže každý dotaz, který probíhá, když požádáte o uzamčení, je schopen dokončit a vy vím, že jsou hotové, protože dostanete výzvu zpět. Jakékoli následné dotazy, které se pokusí zapsat cokoli do libovolné tabulky, se zastaví, nezmění se žádná data a čekají na zámek neomezeně dlouho, dokud ...
UNLOCK TABLES;
)Odolejte pokušení toto zavřít.
mysql>
Tato nečinná konzole Prompt je to, co drží globální zámek za vás. Ztratit to, ztratit zámek.
Z jiného okna konzoly restartujte MySQL obvyklým způsobem, buď pomocí initscriptů (např. Místní varianta service mysql.server restart
) nebo s mysqladmin shutdown
následuje ruční restart.
Stručně řečeno, některé z osvědčených postupů, které by měly být zváženy před vypnutím MySQL, jsou:
mysql> STOP SLAVE;
.mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
.mysql> SHOW PROCESSLIST;
, Zabij je mysql> kill thread_id;
nebo počkejte, až skončí.mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;
a znovu načíst při spuštění # vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ON
k zahřátí fondu vyrovnávacích pamětí.Poté, co potvrdíte předchozí body, můžete bezpečně restartovat MySQL Shell$ service mysql restart
Pro více informací viz můj příspěvek Zkontrolujte tyto před vypnutím MySQL!