it-swarm-eu.dev

Existuje ladný nebo bezpečný restart pro mysql jako pro Apache httpd?

Chtěl bych restartovat mysql elegantně stejně jako httpd, kde se vlákna před restartem obsluhují. Nechtěl bych rozbít dotazy.

30
giorgio79

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 ...

  • změníte názor na restart a uvolníte zámek ručně (UNLOCK TABLES;)
  • restartujete server nebo
  • náhodně nebo úmyslně odpojíte klienta příkazového řádku od tohoto vlákna (nedělejte to). Nechte toto okno připojené a sedí na řádku mysql:

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.

39
Michael - sqlbot

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:

  1. Potvrďte instanci, kterou chcete vypnout, abyste omylem nezastavili další instanci.
  2. Zastavte replikaci, pokud chcete vypnout otroka mysql> STOP SLAVE;.
  3. Vyplachujte špinavé stránky předem, abyste zkrátili dobu vypnutí mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;.
  4. Zkontrolujte dlouhodobě spuštěné dotazy mysql> SHOW PROCESSLIST;, Zabij je mysql> kill thread_id; nebo počkejte, až skončí.
  5. Vypněte fond vyrovnávacích pamětí při vypnutí 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!

2
Moll