Wenn Sie gleichzeitig Tabellenprüfungs-/Reparaturvorgänge ausführen, möchten Sie möglicherweise nicht, dass der MySQL-Server und das Dienstprogramm gleichzeitig auf eine Tabelle zugreifen. Wenn beide Programme Daten in die Tabelle schreiben, führt dies offensichtlich zu großen Problemen und es können sogar unerwartete Situationen auftreten. Wenn ein Programm in eine Tabelle schreibt, kann der gleichzeitige Lesevorgang eines anderen Programms zu verwirrenden Ergebnissen führen. In diesem Artikel wird hauptsächlich beschrieben, wie MySQL-Datenbanktabellen gesperrt werden.
Methoden zum Sperren von Tabellen
Es gibt viele Möglichkeiten, zu verhindern, dass Client-Anfragen einander stören oder dass sich der Server und das Wartungsprogramm gegenseitig stören. Wenn Sie die Datenbank schließen, können Sie sicherstellen, dass keine Interaktion zwischen dem Server und myisamchk und isamchk stattfindet. Das Anhalten des Servers ist jedoch keine gute Idee, da dadurch die Datenbank und die Tabellen, die nicht fehlerhaft sind, nicht mehr verfügbar sind. Der in diesem Abschnitt besprochene Hauptprozess besteht darin, Interaktionen zwischen dem Server und myisamchk oder isamchk zu vermeiden. Der Weg, diese Funktionalität zu erreichen, besteht darin, die Tabelle zu sperren.
Der Server verfügt über zwei Methoden zum Sperren von Tabellen:
1. Internes Sperren
Internes Sperren kann verhindern, dass sich Client-Anfragen gegenseitig stören – zum Beispiel, indem das SELECT des Clients vermieden wird Die Abfrage wurde durch die UPDATE-Abfrage eines anderen Clients gestört. Sie können auch einen internen Sperrmechanismus verwenden, um zu verhindern, dass der Server auf die Tabelle zugreift, während Sie myisamchk oder isamchk zum Überprüfen oder Reparieren der Tabelle verwenden.
Syntax:
Tabellen sperren: LOCK TABLES tbl_name {READ |. WRITE},[ tbl_name {READ |. WRITE},…]
Tabellen entsperren: UNLOCK TABLES
LOCK TABLES sperrt Tabellen für den aktuellen Thread. UNLOCK TABLES gibt alle vom aktuellen Thread gehaltenen Sperren frei. Wenn der Thread ein weiteres LOCK TABLES ausgibt oder wenn die Serververbindung geschlossen wird, werden alle vom aktuellen Thread gesperrten Tabellen automatisch entsperrt.
Wenn ein Thread eine READ-Sperre für eine Tabelle erhält, kann dieser Thread (und alle anderen Threads) nur aus der Tabelle lesen. Wenn ein Thread eine WRITE-Sperre für eine Tabelle erhält, liest oder schreibt nur der Thread, der die Sperre hält, die Tabelle und andere Threads werden blockiert.
Jeder Thread wartet (ohne Zeitüberschreitung), bis er alle von ihm angeforderten Sperren erhält.
WRITE-Sperren haben in der Regel eine höhere Priorität als READ-Sperren, um sicherzustellen, dass Änderungen schnellstmöglich verarbeitet werden. Dies bedeutet, dass, wenn ein Thread eine READ-Sperre erhält und dann ein anderer Thread eine WRITE-Sperre anfordert, nachfolgende READ-Sperrenanforderungen warten, bis der WRITE-Thread die Sperre erhält und sie aufhebt.
Natürlich müssen Sie für die Prüfung nur die Lesesperre erwerben. Darüber hinaus kann Zhongqingqiaoxia die Tabelle nur lesen, aber nicht ändern, sodass auch andere Clients die Tabelle lesen können. Zur Reparatur benötigen Sie etwas, das verhindert, dass ein Client die Tabelle ändert, während Sie daran arbeiten.
2. Externe Sperre
Der Server kann auch eine externe Sperre (Sperre auf Dateiebene) verwenden, um zu verhindern, dass andere Programme Dateien ändern, während der Server die Tabelle verwendet. Normalerweise verwendet der Server während Tabellenüberprüfungsvorgängen externe Sperren in Verbindung mit myisamchk oder isamchk. Allerdings ist die externe Sperre auf einigen Systemen deaktiviert, da sie nicht zuverlässig funktioniert. Das zum Ausführen von myisamchk oder isamchk gewählte Verfahren hängt davon ab, ob der Server externe Sperren verwenden kann. Bei Nichtverwendung muss das interne Sperrprotokoll verwendet werden.
Wenn der Server mit der Option --skip-locking ausgeführt wird, ist die externe Sperre deaktiviert. Diese Option ist auf einigen Systemen, z. B. Linux, die Standardeinstellung. Sie können feststellen, ob der Server externe Sperren verwenden kann, indem Sie den Befehl mysql admin variables ausführen. Überprüfen Sie den Wert der Variable „skip_locking“ und gehen Sie wie folgt vor:
Wenn „skip_locking“ deaktiviert ist, ist die externe Sperre wirksam. Sie können einen Menschen und ein Dienstprogramm ausführen, um die Tabelle zu überprüfen. Der Server und das Dienstprogramm arbeiten zusammen, um auf die Tabelle zuzugreifen. Bevor Sie jedoch eines der beiden Dienstprogramme ausführen, sollten Sie mysqladmin Flush-Tables verwenden. Um eine Tabelle zu reparieren, sollte das Reparatursperrprotokoll der Tabelle verwendet werden.
Wenn „skip_locating“ aktiviert ist, ist die externe Sperrung deaktiviert. Wenn Sie also in myisamchk oder isamchk nach einem Fix suchen, bedeutet dies, dass der Server davon nichts weiß und es am besten ist, den Server herunterzufahren. Wenn der Server bestehen bleibt, stellen Sie sicher, dass keine Clients darauf zugreifen, bevor Sie dies verwenden. Das Sperrprotokoll der Kartenpartei muss verwendet werden, um dem Server mitzuteilen, dass die Tabelle für andere Clients nicht zugänglich ist.
Überprüfen Sie das Sperrprotokoll der Tabelle
In diesem Abschnitt wird nur beschrieben, wie Sie die interne Sperre der Tabelle verwenden. Für das Sperrprotokoll der Prüftabelle dient dieser Vorgang nur der Prüfung der Tabelle und nicht der Reparatur der Tabelle.
1. Rufen Sie MySQL auf, um die folgende Anweisung auszugeben:
$mysql –u root –p db_namemysql>LOCK TABLE tbl_name READ;mysql>FLUSH TABLES;
Diese Sperre verhindert andere Clients Die Maschine schreibt in die Tabelle und ändert die Tabelle während der Prüfungen. Die FLUSH-Anweisung veranlasst den Server, die Datei der Tabelle zu schließen, wodurch alle ungeschriebenen Änderungen gelöscht werden, die sich noch im Cache befinden.
2. Führen Sie den Prüfvorgang aus
$myisamchk tbl_name$ isamchk tbl_name
3. Lösen Sie die Tabellensperre
mysql>UNLOCK TABLES;
Wenn myisamchk oder isamchk auf ein Problem mit der Tabelle hinweist, muss eine Reparatur der Tabelle durchgeführt werden.
Dieser Artikel fasst die obige Einführung für Sie zusammen. Der oben genannte Inhalt enthält alle Erklärungen, die ich Ihnen zum Sperren der MySQL-Datenbanktabelle erläutern möchte. Jeder kann helfen.