Schritte zur Überprüfung der MySQL InnoDB-Row_ID-Grenzwertüberschreitung

Schritte zur Überprüfung der MySQL InnoDB-Row_ID-Grenzwertüberschreitung

Hintergrund

Ich habe mit meinen Klassenkameraden über ein Randproblem der Zeilen-ID gesprochen und werde es hier ausführlich erklären.

Wenn die InnoDB-Tabelle keinen Primärschlüssel definiert, wird eine systemweit standardmäßig inkrementelle Zeilen-ID (dict_sys->row_id) als Primärschlüssel verwendet. Addieren Sie bei jeder eingefügten Zeile 1 und wiederholen Sie den Vorgang, bis der Maximalwert erreicht ist.

Es ist zu beachten, dass dict_sys->row_id zwar als unsigned long long definiert ist, der Maximalwert jedoch 2^48 beträgt, da dieser Primärschlüsselwert nur 6 Bytes groß ist. Wenn die row_id diesen Wert überschreitet, wird sie zwar immer noch erhöht, beim Schreiben werden jedoch nur die unteren Bits berücksichtigt, was als Modulo-Operation betrachtet werden kann.

Frage

Dies bringt ein Problem mit sich. Wenn in einem MySQL mit langer Laufzeit häufig Zeilen eingefügt und gelöscht werden (z. B. Protokolltabellen), kann es auch dann zu einer Wiederverwendung von row_id-Werten kommen, wenn die endgültige Tabellengröße nicht sehr groß ist. Und wir wissen, dass er als Primärschlüsselwert nicht wiederholt werden kann.

Nehmen wir an, das passiert. In einer Tabelle steht die Zeilen-ID einer neu eingefügten Zeile im Konflikt mit der Zeilen-ID einer älteren Zeile. Was wird passieren?

verifizieren

Eigentlich ist hier nur eine Schlussfolgerung erforderlich. Der Zweck dieses Artikels besteht darin, eine Verifizierungsmethode mit Ihnen zu besprechen. Mit den oben genannten Informationen können wir die Gestaltung der folgenden Reproduktionsschritte in Betracht ziehen:

1) Erstellen Sie eine leere Tabelle ohne Primärschlüssel

2) gdb setzt dict_sys->row_id auf 1

3) Einfügen mehrerer Zeilen in eine leere Tabelle

4) gdb setzt dict_sys->row_id auf 2^48

5) Fügen Sie mehrere weitere Zeilen ein

6) Ergebnisse ansehen

abschließend

Wie Sie sehen, werden die Zeilen (1) und (2) überschrieben.

Eine sinnvollere Lösung wäre, einen Fehler aufgrund eines doppelten Schlüssels zu melden, genau wie beim automatisch inkrementierten Primärschlüssel in der MySQL-Tabelle.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Analyse der Unterschiede zwischen Mysql InnoDB und MyISAM
  • So ermitteln Sie die Höhe des MySQL InnoDB B+-Baums
  • Unterschiede zwischen MySQL MyISAM und InnoDB
  • Beschreiben Sie kurz die MySQL InnoDB-Speicher-Engine
  • Detaillierte Erläuterung der MySQL Innodb-Speicherstruktur und der Speicherung von Nullwerten
  • Wie können die Transaktionseigenschaften von MySQL InnoDB sichergestellt werden?
  • MySQL-Startfehler InnoDB: Sperren nicht möglich/ibdata1-Fehler
  • Ausführliche Erklärung des Sperrmechanismus in MySQL InnoDB
  • Detaillierte Erklärung, wie MySQL (InnoDB) mit Deadlocks umgeht
  • MySQL-Lernen (VII): Detaillierte Erläuterung des Implementierungsprinzips des Innodb Storage Engine-Index
  • MySQL slow_log-Tabelle kann nicht in InnoDB-Engine geändert werden – detaillierte Erklärung
  • Zusammenfassung wichtiger Komponenten von MySQL InnoDB

<<:  Detaillierte grafische Erklärung zum Löschen des Keep-Alive-Cache

>>:  So leeren Sie den Cache nach der Verwendung von Keep-Alive in Vue

Artikel empfehlen

Tutorial zu HTML-Tabellen-Tags (13): Regeln für interne Rahmenstilattribute

Mit REGELN kann die Art der inneren Rahmen der Ta...

Die Verwendung und der Unterschied zwischen vue3 watch und watchEffect

1. Hörer ansehen Vorstellung der Uhr importiere {...

MySQL erklärt das Prinzip und Beispiel zum Abrufen von Abfrageanweisungen

„explain“ wird verwendet, um Informationen zum Ab...

Muss MySql ein Commit durchführen?

Ob MySQL bei der Ausführung von Vorgängen wie Ein...

Detaillierte Erklärung des Unterschieds zwischen Docker-Compose-Ports und Expose

Es gibt zwei Möglichkeiten, Container-Ports in Do...

Windows 10 1903 Fehler 0xc0000135 Lösung [empfohlen]

Windows 10 1903 ist die neueste Version des Windo...

JavaScript-Tipps zur Verbesserung Ihrer Programmierkenntnisse

Inhaltsverzeichnis 1. Filtern Sie eindeutige Wert...

js Array fill() Füllmethode

Inhaltsverzeichnis 1. fill()-Syntax 2. Verwendung...