Maison > base de données > tutoriel mysql > Optimisation MySQL - Explication détaillée de l'arrêt en toute sécurité des instances MySQL

Optimisation MySQL - Explication détaillée de l'arrêt en toute sécurité des instances MySQL

黄舟
Libérer: 2017-03-10 10:46:34
original
1116 Les gens l'ont consulté


Processus d'arrêt :

  • 1. Initier l'arrêt et envoyer le signal SIGTERM

  • 2. Si nécessaire, créez un nouveau thread d'arrêt

Si l'arrêt est initié par le client, un thread d'arrêt dédié sera créé

S'il est reçu directement Si le SIGTERM le signal est désactivé, un thread spécifiquement responsable du traitement du signal sera responsable du travail d'arrêt, ou un nouveau thread indépendant sera créé pour prendre en charge cette question

Lorsqu'un thread d'arrêt indépendant ne peut pas être créé (par exemple exemple, mémoire insuffisante), le serveur MySQL émettra un message d'avertissement similaire au suivant :

Erreur : Impossible de créer un thread pour tuer le serveur

  • 3. ne répond plus aux nouvelles demandes de connexion

Fermez la surveillance du réseau TCP/IP, fermez Unix Socket et les autres canaux

  • 4. et les transactions

Les connexions inactives seront immédiatement interrompues

Les connexions qui ont actuellement des transactions et des activités SQL seront marquées comme supprimées et leur statut sera vérifié régulièrement afin que ils peuvent être fermés lors du prochain contrôle ; (Se référer à la syntaxe KILL)

S'il y a actuellement une transaction active, la transaction sera annulée. Si des tables non transactionnelles sont également modifiées dans la transaction, la transaction est modifiée. les données ne peuvent pas être annulées et seule une partie des modifications peut être effectuée

S'il s'agit du maître dans le scénario de réplication maître/esclave, le traitement du thread de réplication est le même que celui du thread ordinaire. ;

S'il s'agit de l'esclave dans le scénario de réplication Maître/Esclave, il fermera tour à tour les threads IO et SQL. Si ces deux threads sont actuellement actifs, ils seront également marqués comme tués puis fermés ;

Sur le serveur Slave, le thread SQL est autorisé à arrêter directement l'opération SQL en cours (pour éviter les problèmes de réplication), puis à fermer le thread

Dans MySQL 5.0.80 et versions antérieures ; versions, si le thread SQL exécute une transaction au milieu, la transaction sera annulée ; à partir de 5.0, à partir de 81, il attendra la fin de toutes les opérations à moins que l'utilisateur ne lance une opération KILL.

Lorsque le thread SQL de l'esclave est forcé de KILL lors de l'exécution d'opérations sur des tables non transactionnelles, cela peut provoquer une incohérence dans les données du maître et de l'esclave

  • 5. Le processus du serveur est arrêté Tous les threads, fermez tous les moteurs de stockage ;

Actualisez tous les caches de tables, fermez toutes les tables ouvertes

Chaque moteur de stockage est responsable des opérations d'arrêt associées ; , comme MyISAM Toutes les opérations en attente d'écriture seront vidées ; InnoDB videra le pool de tampons sur le disque (à partir de MySQL 5.0.5, si innodb_fast_shutdown n'est pas défini sur 2), enregistrera le LSN actuel dans l'espace table, puis fermez tous les fils internes.

  • 6. Le processus du serveur MySQL se termine

À propos de la commande KILL

À partir de la version 5.0, KILL prend en charge la spécification de deux CONNECTION | QUERY Options facultatives :

  • KILL CONNECTION est le même que celui d'origine, arrête d'annuler la transaction, ferme la connexion au fil de discussion et libère les ressources associées

  • KILL QUERY arrête uniquement l'opération actuellement soumise pour exécution par le thread, laissant tout le reste inchangé

Après avoir soumis l'opération KILL, un indicateur de kill spécial sera défini sur le thread ; fil de discussion. La fermeture du thread prend généralement un certain temps, car le bit d'indicateur de suppression n'est vérifié que dans des circonstances spécifiques :

  • 1 Lors de l'exécution d'une requête SELECT, dans un ORDER BY ou un GROUP BY. loop , à chaque fois après la lecture de certains blocs d'enregistrement de ligne, le bit de marque d'arrêt sera vérifié s'il existe, l'instruction se terminera

  • 2. à chaque fois à partir de la table d'origine Après avoir lu certains blocs d'enregistrement de ligne, le bit de marque d'arrêt sera vérifié s'il existe, l'instruction mettra fin et supprimera la table temporaire

  • . 3. Lors de l'exécution de UPDATE et DELETE, chaque fois que certains enregistrements de ligne sont lus, une fois le bloc d'enregistrement de ligne mis à jour ou supprimé, le bit d'indicateur d'arrêt sera vérifié s'il existe, l'instruction se terminera et la transaction sera terminée. annulée. Si l'opération est sur une table non transactionnelle, les données modifiées ne seront pas annulées

  • 4. >

    5. Le thread INSERT DELAY ajoutera rapidement de nouveaux enregistrements dans la mémoire, puis se terminera
  • 6. il sera libéré et terminé ;
  • 7. Si l'appel d'opération d'écriture du thread attend de libérer de l'espace disque, il générera directement une erreur "espace disque plein" puis se terminera
  • 8. Lorsque la table MyISAM est KILLée lors de l'exécution de REPAIR TABLE ou OPTIMIZE TABLE, cela entraînera ceci. La table est endommagée et indisponible, et le guide sera utilisé pour la réparer à nouveau.

  • Quelques suggestions pour arrêter MySQL en toute sécurité

  • Si vous souhaitez arrêter en toute sécurité le processus du service mysqld, il est recommandé de suivre les étapes suivantes :

0. Utilisez un compte avec la plus haute autorité tel que SUPER et ALL pour vous connecter à MySQL, de préférence en utilisant le socket unix

  • 1. ci-dessus, définissez innodb_fast_shutdown = 1 , permettant à InnoDB d'être arrêté rapidement (sans purge complète, insertion de fusion de tampon), s'il s'agit de mettre à niveau ou de rétrograder la version de MySQL, ne le définissez pas

  • 2. Définissez innodb_max_dirty_pages_pct = 0 pour laisser InnoDB vider toutes les pages sales sur le disque

  • 3. Définissez max_connections et max_user_connections sur 1, ce qui signifie qu'en fin de compte, aucune nouvelle connexion n'est autorisée à être créée à l'exception de votre connexion actuelle

  • 4 , fermez tous les threads inactifs, c'est-à-dire que l'ID du thread dont l'état est Sleep et Time est supérieur à 1

  • 5. Exécutez SHOW PROCESSLIST pour confirmer s'il y a des threads actifs, surtout s'il existe des threads de verrouillage de table, tels que SELECT avec de grands ensembles de données, ou UPDATE à grande échelle, ou exécuter DDL, il faut être particulièrement prudent

  • 6. pour confirmer La valeur de la longueur de la liste d'historique est faible (généralement inférieure à 500), c'est-à-dire qu'il y a très peu de transactions non purgées, et il est confirmé que les valeurs du numéro de séquence du journal, du journal vidé jusqu'à et du dernier point de contrôle à sont les mêmes, c'est-à-dire que tous les points de contrôle LSN ont été créés

  • 7 Ensuite, effectuez l'opération FLUSH LOCKAL TABLES, actualisez tous les caches de tables et fermez les tables ouvertes (la fonction de. LOCAL est que cette opération n'enregistre pas BINLOG) ;

  • 8 S'il s'agit d'un serveur SLAVE, il est préférable de fermer d'abord IO_THREAD, d'attendre que tous les RELAY LOG soient épuisés, puis fermez SQL_THREAD pour éviter que SQL_THREAD ne soit terminé lors de l'exécution de transactions volumineuses. Une fois toutes les applications terminées, si vous devez forcer l'arrêt, il est préférable d'attendre que la transaction volumineuse soit terminée avant de fermer SQL_THREAD ;

    9. Enfin, exécutez mysqladmin shutdown.
  • 10. En cas d'urgence, vous pouvez définir innodb_fast_shutdown = 1, puis exécuter directement l'arrêt de mysqladmin, ou même appeler directement kill ou kill -9 au niveau de la couche du système d'exploitation pour tuer mysqld. processus (dans Certaines transactions peuvent être perdues lorsque innodb_flush_log_at_trx_commit = 0), mais lorsque le processus mysqld est redémarré, une RÉCUPÉRATION DE CRASH sera effectuée, ce qui doit être pesé.
  • Cela dit, en fait, il suffit d'exécuter l'arrêt de mysqladmin dans des circonstances normales. Si un blocage se produit, reportez-vous au contenu ci-dessus pour analyse et solution.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal