Maison > Article > base de données > Comment exécuter une instruction de mise à jour SQL ?
Cet article vous présentera le processus d'exécution d'une instruction de mise à jour SQL. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
Auparavant, nous avons systématiquement compris le processus d'exécution d'une instruction de requête et introduit les modules de traitement impliqués dans le processus d'exécution. Je pense que vous vous souvenez encore que le processus d'exécution d'une instruction de requête passe généralement par des modules fonctionnels tels que des connecteurs, des analyseurs, des optimiseurs et des exécuteurs, et atteint finalement le moteur de stockage.
Alors, quel est le flux d'exécution d'une instruction de mise à jour ?
Vous avez peut-être souvent entendu des collègues DBA dire que MySQL peut être restauré à son état à tout moment en un demi-mois. Vous êtes peut-être étonné, mais vous êtes peut-être aussi curieux de savoir comment cela se fait.
Commençons par une instruction de mise à jour pour une table. Voici l'instruction de création de cette table. Cette table a un ID de clé primaire et un champ entier c : <.>
mysql> create table T(ID int primary key, c int);Si vous souhaitez ajouter 1 à la valeur de la ligne ID=2, l'instruction SQL s'écrira ainsi :
mysql> update T set c=c+1 where ID=2;Je vous ai présenté le lien d'exécution de base du SQL déclaration précédente. Ici, je vais ramener cette image à nouveau. Vous pouvez également regarder brièvement cette image pour la revoir. Tout d’abord, on peut affirmer avec certitude que le même ensemble de processus pour les instructions de requête et les instructions de mise à jour sera également suivi. Vous devez vous connecter à la base de données avant d'exécuter l'instruction. C'est le travail du connecteur. Comme nous l'avons dit précédemment, lorsqu'il y a une mise à jour sur une table, le cache de requêtes lié à cette table deviendra invalide, donc cette instruction effacera tous les résultats mis en cache sur la table T. C'est pourquoi nous déconseillons généralement d'utiliser la mise en cache des requêtes. Ensuite, l'analyseur saura qu'il s'agit d'une instruction de mise à jour grâce à une analyse lexicale et syntaxique. L'optimiseur décide d'utiliser l'ID d'index. L'exécuteur est alors responsable de l'exécution réelle, de la recherche de cette ligne et de sa mise à jour. Contrairement au processus de requête, le processus de mise à jour implique également deux modules de journalisation importants, qui sont les protagonistes dont nous allons discuter aujourd'hui : redo log (redo log) et binlog (archive log). Si vous entrez en contact avec MySQL, vous ne pourrez certainement pas éviter ces deux mots, et je continuerai à vous les souligner dans le contenu suivant. Mais cela dit, la conception du redo log et du binlog présente de nombreux aspects intéressants, et ces idées de conception peuvent également être utilisées dans vos propres programmes. Module de journal important : refaire le journalJe ne sais pas si vous vous souvenez encore de l'article "Kong Yiji". Le directeur de l'hôtel a un tableau rose spécialement utilisé pour enregistrer les dossiers de crédit des clients. . S'il n'y a pas beaucoup de gens qui paient à crédit, il peut alors écrire le nom et le compte du client au tableau. Mais s'il y a trop de personnes à crédit, il y aura toujours des moments où le tableau des fans ne pourra pas les suivre. À ce moment-là, le commerçant doit disposer d'un grand livre spécialement pour enregistrer le crédit. Si quelqu'un souhaite emprunter de l'argent ou rembourser une dette, le commerçant a généralement deux manières :
De même, le journal redo d'InnoDB a une taille fixe. Par exemple, il peut être configuré comme un ensemble de 4 fichiers, chaque fichier a une taille de 1 Go, alors ce "tableau rose" peut enregistrer un total de 4 Go d'opérations. Commencez à écrire depuis le début, puis revenez au début pour écrire en boucle, comme le montre l'image ci-dessous.
write pos est la position de l'enregistrement en cours. Il recule (dans le sens des aiguilles d'une montre) pendant l'écriture. Après avoir écrit jusqu'à la fin du fichier n°3, il revient au début. du dossier n°0. Le point de contrôle est la position actuelle à effacer, et il avance également et boucle. Avant d'effacer l'enregistrement, l'enregistrement doit être mis à jour dans le fichier de données.
L'espace entre la position d'écriture et le point de contrôle est la partie vide du "tableau rose" qui peut être utilisée pour enregistrer de nouvelles opérations. Si la position d'écriture rattrape le point de contrôle, cela signifie que le "tableau rose" est plein et qu'aucune nouvelle mise à jour ne peut être effectuée pour le moment. Vous devez d'abord arrêter et effacer certains enregistrements pour avancer le point de contrôle.
Avec le redo log, InnoDB peut garantir que même si la base de données redémarre anormalement, les enregistrements précédemment soumis ne seront pas perdus. Cette capacité est appelée crash-safe.
Pour comprendre le concept de sécurité en cas de crash, vous pouvez penser à notre précédent exemple de dossier de crédit. Tant que le dossier de crédit est enregistré sur le tableau rose ou écrit sur le grand livre, même si le commerçant l'oublie plus tard, par exemple en suspendant soudainement son activité pendant quelques jours, il peut toujours clarifier le compte de crédit grâce aux données du grand livre et tableau rose après la reprise des activités.
Comme nous l'avons dit précédemment, MySQL dans son ensemble comprend en fait deux parties : l'une est la couche Serveur, qui fait principalement des choses au niveau fonctionnel de MySQL ; également une couche moteur, qui est responsable de questions spécifiques liées au stockage. Le journal redo du tableau rose dont nous avons parlé ci-dessus est un journal unique au moteur InnoDB, et la couche serveur possède également son propre journal, appelé binlog (journal archivé).
Je pense que vous vous demanderez pourquoi y a-t-il deux journaux ?
Parce qu'il n'y avait pas de moteur InnoDB dans MySQL au début. Le propre moteur de MySQL est MyISAM, mais MyISAM n'a pas de fonctionnalités de sécurité contre les pannes et les journaux binlog ne peuvent être utilisés qu'à des fins d'archivage. InnoDB a été introduit dans MySQL sous la forme d'un plug-in par une autre société. Étant donné que le fait de s'appuyer uniquement sur binlog n'a pas de capacités de sécurité contre les crashs, InnoDB utilise un autre système de journalisation, à savoir le redo log, pour obtenir des capacités de sécurité contre les crashs.
Ces deux journaux présentent les trois différences suivantes.
Avec une compréhension conceptuelle de ces deux journaux, examinons les processus internes de l'exécuteur et du moteur InnoDB lors de l'exécution de cette simple instruction de mise à jour.
Ici, je donne l'organigramme d'exécution de cette instruction de mise à jour. La case lumineuse dans la figure indique qu'elle est exécutée dans InnoDB, et la case sombre indique qu'elle est exécutée dans l'exécuteur.
Vous avez peut-être remarqué que les trois dernières étapes semblent un peu "alambiquées". L'écriture du redo log est divisée en deux étapes : préparer et valider. -validation de phase".
Pourquoi une « soumission en deux phases » est-elle nécessaire ? Il s'agit de rendre cohérente la logique entre les deux journaux. Pour expliquer ce problème, nous devons commencer par la question du début de l'article : Comment restaurer la base de données à l'état d'une seconde en un demi-mois ?
Comme nous l'avons déjà dit, binlog enregistrera toutes les opérations logiques et adoptera la forme d'"écriture d'ajout". Si votre administrateur de base de données promet qu'il peut être restauré dans un délai d'un demi-mois, le système de sauvegarde enregistrera définitivement tous les journaux binaires au cours du dernier demi-mois et le système sauvegardera régulièrement l'intégralité de la base de données. Le « régulier » dépend ici de l'importance du système, qui peut être une fois par jour ou une fois par semaine.
Lorsque vous devez restaurer à une seconde spécifiée, par exemple, à deux heures de l'après-midi un jour, vous constatez qu'une table a été accidentellement supprimée à midi, et vous devez récupérer les données, vous pouvez faire ceci :
D'accord, maintenant que nous avons fini de parler du processus de récupération des données, revenons et expliquons pourquoi le journal a besoin d'une « validation en deux phases ». Ici, autant utiliser la preuve par contradiction pour expliquer.
Toujours en utilisant l'instruction de mise à jour précédente comme exemple. Supposons que la valeur du champ c dans la ligne actuelle avec ID=2 soit 0 et supposons que lors de l'exécution de l'instruction de mise à jour, après l'écriture du premier journal, un crash se produise avant l'écriture du deuxième journal. Que se passera-t-il ?
Écrivez d'abord le redo log, puis le binlog. Supposons que le processus MySQL redémarre anormalement lorsque le journal redo est écrit mais avant l'écriture du binlog. Comme nous l'avons dit précédemment, une fois le journal redo écrit, même si le système tombe en panne, les données peuvent toujours être restaurées, donc la valeur de c dans cette ligne après la récupération est 1. Cependant, comme le journal binaire s'est écrasé avant d'être terminé, cette instruction n'a pas été enregistrée dans le journal binaire pour le moment. Par conséquent, lorsque le journal sera sauvegardé ultérieurement, cette instruction ne sera pas incluse dans le journal binaire enregistré. Ensuite, vous constaterez que si vous devez utiliser ce binlog pour restaurer la bibliothèque temporaire, car le binlog de cette instruction est perdu, la bibliothèque temporaire ne sera pas mise à jour cette fois. La valeur de c dans la ligne restaurée est 0, ce qui est. la même chose que la valeur de la bibliothèque d'origine différente.Vous me direz peut-être : cette probabilité est-elle très faible ? Il n'existe aucune situation dans laquelle la bibliothèque temporaire doit être restaurée à tout moment ?
En fait non, ce processus n'est pas seulement nécessaire pour récupérer des données après une mauvaise opération. Lorsque vous avez besoin d'augmenter la capacité, c'est-à-dire lorsque vous devez créer davantage de bases de données de secours pour augmenter la capacité de lecture du système, la pratique courante consiste désormais à utiliser une sauvegarde complète et à appliquer binlog pour y parvenir. Cette "incohérence" entraînera votre présence. une incohérence entre les bases de données maître et esclave en ligne.
Pour faire simple, redo log et binlog peuvent être utilisés pour représenter l'état de validation d'une transaction, et la validation en deux phases consiste à garder les deux états logiquement cohérents.
Recommandations associées : "
Tutoriel mysqlCe 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!