Fehlerbehebung bei den Gründen, warum gelöschte MySQL-Datensätze nicht wirksam werden

Fehlerbehebung bei den Gründen, warum gelöschte MySQL-Datensätze nicht wirksam werden

Ein Datensatz eines Online-MySQL-Transaktionsproblems

Letzten Freitag habe ich eine Operation zum Löschen einer großen Tabelle durchgeführt. Während des Löschvorgangs trat ein kleines Problem auf und ich habe zwei Stunden vergeblich damit verbracht. Ich habe den allgemeinen Vorgang hier aufgezeichnet. Schauen wir uns den Vorgang ohne weitere Umschweife einfach an.

Damals wollte ich es löschen, also testete ich zunächst die Syntax der Löschanweisung und löschte zum Ausprobieren eines wie folgt:

mysql ::>>wähle min(id) aus XXXX_user_login aus;
+---------+
| min(ID) |
+---------+
| |
+---------+
 Zeile im Satz (0,00 Sek.)

mysql ::>>löschen aus XXXX_user_login, wobei ID < ;
Abfrage OK, Zeile betroffen (0,00 Sek.)

mysql ::>>wähle min(id) aus XXXX_user_login aus;         
+---------+
| min(ID) |
+---------+
| |
+---------+
 Zeile im Satz (0,00 Sek.)

Dann habe ich mich erneut über den MySQL-Client angemeldet und ein merkwürdiges Problem festgestellt:

[dba_mysql ~]$ /usr/local/mysql/bin/mysql -udba_admin -p -h127.0.0.1 -P4306
Passwort eingeben: 
XXXXXXXXXXXXXXXXXXXXXX
Geben Sie „help;“ oder „\h“ ein, um Hilfe zu erhalten. Geben Sie „\c“ ein, um die aktuelle Eingabeanweisung zu löschen.

mysql ::>>wähle min(id) aus XXXXX_user_login aus;                  
+---------+
| min(ID) |
+---------+
| |
+---------+
 Zeile im Satz (0,00 Sek.)

Das heißt, der gerade gelöschte Datensatz ist wieder da.

Es ist ziemlich seltsam, darüber nachzudenken. Habe ich es falsch gelöscht? Oder hat die Geschäftsseite die Daten nach dem Löschen erneut eingefügt. Ist das nicht ein Problem? . . Habe es noch ein paarmal probiert, mit dem gleichen Ergebnis.

Dieses Phänomen ist sehr seltsam. Ich habe es noch nie zuvor erlebt. Ich habe zuerst das Skript überprüft und bestätigt, dass das gelöschte Skript korrekt war. Dann habe ich lange nachgeprüft und schließlich einen Durchbruch aus der Richtung der Transaktion gefunden. Ich vermutete, dass dies daran lag, dass die Transaktion nicht übermittelt wurde. Also habe ich mir die Parameter der aktuellen Transaktion wie folgt angesehen:

mysql ::>>Variablen wie „%commit%“ anzeigen;   
+--------------------------------+----------+
| Variablenname | Wert |
+--------------------------------+----------+
| Autocommit | AUS |
| innodb_commit_concurrency | |
| innodb_flush_log_at_trx_commit | |
+--------------------------------+----------+
 Zeilen im Set (0,00 Sek.)

[email protected]:(keine) ::>>
mysql ::>>globale Variablen wie „%commit%“ anzeigen;
+--------------------------------+----------+
| Variablenname | Wert |
+--------------------------------+----------+
| Autocommit | EIN |
| innodb_commit_concurrency | |
| innodb_flush_log_at_trx_commit | |
+--------------------------------+----------+
 Zeilen im Set (0,00 Sek.)

Wenn man das sieht, ist das Problem im Grunde behoben. Es liegt daran, dass das automatische Commit in der aktuellen Sitzung deaktiviert ist, sodass es beim Löschen scheinbar erfolgreich war. Nach dem Neustart wurden diese Transaktionen zurückgesetzt, sodass der Löschvorgang anscheinend „ungültig“ ist.

Nachdem das Problem nun lokalisiert wurde, beginnen wir mit der Suche nach der Grundursache des Problems. Schließlich finden wir die Grundursache in der Konfigurationsdatei wie folgt:

[mysqldump]
schnell
max_allowed_packet = M

[mysql]
kein automatisches Wiederaufwärmen
max_allowed_packet = M
prompt=mysql--\\u@\\h:\\d \\R:\\m:\\s>>
init-command="Interactive_timeout festlegen=28800;Warte_timeout festlegen=28800;Autocommit festlegen=0;"

In der letzten Zeile der Konfigurationsdatei wurde die Autocommit-Konfiguration der MySQL-Clientgruppe auf 0 gesetzt. Natürlich konnte sie nicht automatisch übermittelt werden. Also änderte ich diesen Parameter auf 1 und probierte das Skript erneut aus, stellte jedoch fest, dass das Problem weiterhin bestand. . .

Es scheint, dass die Änderungen noch nicht gründlich sind.

Wir wissen, dass es eine Sequenz gibt, in der MySQL Konfigurationsdateien lädt. Wir können den Befehl mysql --help|grep my.cnf verwenden, um sie anzuzeigen. Nach der Überprüfung liegt es daran, dass die Konfiguration in /etc/my.cnf auch autocommit=0 ist, sodass die Parameter der aktuellen Konfigurationsdatei überschrieben werden. Nachdem Sie schließlich den Inhalt des Autocommit-Parameters in der Datei /etc/my.cnf geändert haben, stellen Sie die Verbindung zum MySQL-Server wieder her und stellen Sie fest, dass das Problem gelöst ist.

Zusammenfassend sind folgende kleine Erkenntnisse festzuhalten:

1. Wenn Sie feststellen, dass die Daten nicht gelöscht werden können, können Sie zunächst überprüfen, ob der Parameter für die Transaktionsübermittlung deaktiviert ist.

2. Verwenden Sie „Variablen anzeigen“ und „Globale Variablen anzeigen“, um die Transaktionsparameter der aktuellen Sitzung bzw. die globalen Variablen anzuzeigen.

3. Die Parameter in der MySQL-Gruppe in der Datei my.cnf werden verwendet, um die Konfiguration des MySQL-Clients zu steuern.

4. Die Datei my.cnf hat eine Ladereihenfolge. Wenn Sie diese ändern, müssen alle geändert werden. Oder stellen Sie sicher, dass nur eine my.cnf-Datei vorhanden ist.

Oben finden Sie ausführliche Informationen zur Fehlerbehebung bei den Gründen, warum gelöschte MySQL-Datensätze nicht wirksam sind. Weitere Informationen zu nicht wirksamen gelöschten MySQL-Datensätzen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Eine einfache Erklärung der parallelen MySQL-Replikation
  • So bedienen Sie JSON-Felder in MySQL
  • Unterschiede zwischen MySQL CHAR und VARCHAR beim Speichern und Lesen
  • MySQL-Lernprogramm Clustered Index
  • Eine kurze Diskussion über die MySQL-Optimierungslösung für große Tabellen
  • Absteigender Index in MySQL 8.0
  • Detaillierte Erklärung der Speicher-Engine in MySQL
  • Eine Fallstudie zur MySQL-Optimierung
  • So überspringen Sie Fehler bei der MySQL-Master-Slave-Replikation
  • Eine kurze Analyse der parallelen MySQL-Replikation

<<:  So kapseln Sie die Karussellkomponente in Vue3

>>:  Analyse des Prozesses zum Erstellen eines LAN-Servers basierend auf http.server

Artikel empfehlen

So überwachen Sie die Linux-Speichernutzung mit einem Bash-Skript

Vorwort Auf dem Markt sind zahlreiche Open-Source...

Beispielcode zur Implementierung eines Laufschriftformats mit CSS3

Hintergrund Folgendes ist passiert: Luzhu erfuhr ...

Analyse der MySql CURRENT_TIMESTAMP-Funktion anhand eines Beispiels

Beim Erstellen eines Zeitfelds STANDARD CURRENT_T...

Das kürzeste JS, um festzustellen, ob es sich um IE6 handelt (IE-Schreibmethode)

Häufig verwendeter JavaScript-Code zum Erkennen d...

MySQL vollständig deinstallieren. Persönlicher Test!

MySQL sauber deinstallieren. Persönlich getestet,...

Detaillierte Analyse des virtuellen Nginx-Hosts

Inhaltsverzeichnis 1. Virtueller Host 1.1 Virtuel...

Einige Referenzen zu Farben in HTML

In HTML werden Farben auf zwei Arten dargestellt. ...

So erzielen Sie mit three.js einen dynamischen 3D-Texteffekt

Vorwort Hallo zusammen, hier ist der CSS-Assisten...

Besprechen Sie die Anwendung von Mixin in Vue

Mixins bieten eine sehr flexible Möglichkeit, wie...

Vue+openlayer5-Methode zum Abrufen der Koordinaten des aktuellen Mauszeigers

Vorwort: Wie erhält man die Koordinaten der aktue...

Mysql Sql-Anweisungsübungen (50 Fragen)

Tabellenname und Felder –1. Studentenliste Studen...