MySQL Failover-Hinweise: Ausführliche Erläuterung zum anwendungsorientierten Design

MySQL Failover-Hinweise: Ausführliche Erläuterung zum anwendungsorientierten Design

1. Einleitung

Wie wir alle wissen, muss im Anwendungsszenario der Lese- und Schreibtrennung von Datenbank-Middleware sichergestellt werden, dass bei Auftreten eines fehlerhaften Knotens in der zugrunde liegenden Datenbank die Middleware die Datenbankverbindung schnell trennen oder migrieren kann, ohne dass die Benutzer davon etwas bemerken.

In der MySQL-Datenbank wird ein session_track_transaction_info-Parameter bereitgestellt, um eine Lösung bereitzustellen.

Da es in der offiziellen Dokumentation keine Beschreibung dieses Parameters gibt, werden in diesem Artikel speziell die optionalen Werte dieses Parameters vorgestellt und die tatsächlichen Auswirkungen überprüft. Reden wir nicht zu viel, schauen wir uns die ausführliche Einführung mit dem Herausgeber an

2. session_track_transaction_info-Parameter

2.1 Parametereinführung

In MySQL 5.7 können Sie den Status von Transaktionen verfolgen, indem Sie die Variable session_track_transaction_info festlegen.

  • Dieser Parameter existiert auf zwei Ebenen: global und Sitzungsebene und kann dynamisch geändert werden.
  • Der Wert, auf den dieser Parameter eingestellt werden kann, ist 0 (Standard AUS), 1, 2
/**
 Transaktionsverfolgungsebene
*/
Aufzählung enum_session_track_transaction_info {
 TX_TRACK_NONE = 0, ///< keine Tracker-Elemente für Transaktionsinformationen senden
 TX_TRACK_STATE = 1, ///< Transaktionsstatus verfolgen
 TX_TRACK_CHISTICS = 2 ///< Status und Eigenschaften des Tracks
};

Die zulässigen Werte für diesen Parameter sind 0, 1 und 2.

  • Wenn der Wert auf 0 gesetzt ist, show variables like '%session_track_transaction_info%' , was bedeutet, dass die Verfolgung des Transaktionsstatus nicht aktiviert ist.
  • Wenn auf 1 gesetzt, zeigt die Anzeige show variables like '%session_track_transaction_info%' STATE an, was den Status der Tracking-Transaktion angibt
  • Wenn der Wert auf 2 gesetzt ist, werden bei der Anzeige von show variables like '%session_track_transaction_info%' EIGENSCHAFTEN angezeigt, die den Status und die Anweisungen der Verfolgungstransaktion angeben.

2.2 Einfluss der Parametereinstellungen

Wenn der Parameter session_track_transaction_info aktiviert ist, kann der Transaktionsstatusdatensatz nicht direkt in der Datenbank abgefragt werden.

Gemäß [WL#4797] zeichnet MySQL Informationen zur Verfolgung des Transaktionsstatus im OK-Paket auf, das von jeder Abfrageanforderung zurückgegeben wird.

Sie können Informationen zum Transaktionsstatus anzeigen, indem Sie Pakete erfassen.

2.2.1 Natives MySQL OK-Paketformat

OK Paket Datenpaketformatdefinition

Typ Name beschreiben
int<1> Kopf 0x00 oder 0xFE zeigt an, dass das Datenpaket ein OK-Paket ist.
int Anzahl der betroffenen Zeilen Anzahl der betroffenen Zeilen
int Die zuletzt eingegebene ID Die zuletzt eingegebene ID
int<2> Statusanzeige Wenn CLIENT_PROTOCOL_41 definiert ist, gibt es diesen Teil
int<2> Anzahl der Warnungen Die Anzahl der Warnungen. Wenn CLIENT_PROTOCOL_41 definiert ist, wird dieser Teil angezeigt.
int<2> Statusanzeige Wenn CLIENT_TRANSACTIONS definiert ist, gibt es diesen Teil
Schnur Information Für Menschen lesbare Statusinformationen. Wenn CLIENT_SESSION_TRACK definiert ist, wird dieser Abschnitt angezeigt.
Schnur Sitzungsstatus Informationen zum Sitzungsstatus. Wenn SERVER_SESSION_STATE_CHANGED definiert ist, wird dieser Abschnitt angezeigt.
Schnur Information Für Menschen lesbare Informationen

Die Länge in int<lenenc> und string<lenenc> stellt LengthEcode dar.

Der Code zum Einkapseln des OK-Pakets in MySQL-5.7.19 befindet sich in der Funktion net_send_ok() in der Datei protocol_classic.cc.

2.2.3 session_track_transaction_info Zusätzliche Informationen

session_track_transaction_info verwendet 8 Zeichen, um Transaktionsinformationen darzustellen, und diese 8 Zeichen werden im Rückgabedatenpaket der COM_QUERY-Anforderungsanweisung gespeichert (wenn der Client eine Anweisung ausführt, wird sie im MySQL-Protokoll in eine COM_QUERY-Anforderung gekapselt und an den Server gesendet. Nachdem der Server sie analysiert und ausgeführt hat, kapselt er das Ergebnis in ein Datenpaket und gibt es zurück).

Standort Informationen anzeigen Spezifische Bedeutung
Platz 1 Transaktion T startet explizit eine Transaktion
Ich starte implizit eine Transaktion (@autocommit=0)
_ Keine aktiven Transaktionen
Platz 2 unsicheres Lesen r Eine Tabelle einer nicht-transaktionalen Speicher-Engine wird in der aktuellen Transaktion gelesen
_ In der aktuellen Transaktion wird keine Tabelle mit nicht-transaktionaler Speicher-Engine gelesen
Platz 3 Transaktion lesen R Die Tabelle der transaktionalen Speicher-Engine wird in der aktuellen Transaktion gelesen
_ In der aktuellen Transaktion werden keine transaktionalen Speichermaschinentabellen gelesen
Platz 4 unsicheres Schreiben w Die Tabelle der nicht-transaktionalen Speicher-Engine wird in der aktuellen Transaktion geschrieben
_ In der aktuellen Transaktion werden keine Daten in eine Tabelle einer nicht-transaktionalen Speicher-Engine geschrieben
Platz 5 Transaktion schreiben W Die Tabelle der transaktionalen Speicher-Engine wird in der aktuellen Transaktion geschrieben
_ In der aktuellen Transaktion werden keine Daten in die Tabelle der transaktionalen Speicher-Engine geschrieben.
Platz 6 unsichere Anweisung s In der aktuellen Transaktion wird eine unsichere Anweisung verwendet, ähnlich wie UUID()
_ Es werden keine ähnlichen unsicheren Anweisungen verwendet
Platz 7 Ergebnismenge S sendet einen Ergebnissatz an den Client
_ Kein Ergebnissatz
Platz 8 Gesperrte Tabellen Die L-Tabelle wird explizit mit der Anweisung LOCK TABLES gesperrt.
_ Keine Tabellensperren in der aktuellen Transaktion

2.2.2 OK-Paketformatanalyse, wenn session_track_transaction_info = 0

session_track_transaction_info=0 bedeutet, dass keine Transaktionsinformationen aufgezeichnet werden und in keinem der vom Server zurückgegebenen Datenpakete Informationen zur Verfolgung des Transaktionsstatus vorhanden sind.

## session_track_transaction_info = 0
Der Client führt begin aus; gekapseltes Datenpaket 06 00 00 # payload_length
00 # Sequenz-ID
03 # Befehlstyp COM_QUERY
62 65 67 69 6e # beginnen

Vom Server zurückgegebenes Datenpaket: Antwort 
07 00 00 # Nutzlastlänge 
01 # Sequenz-ID
00 # Header 0x00 zeigt ein OK-Paket an 00 # Betroffene Zeilen 0
00 # Die zuletzt eingefügte ID
03000000

Der Client führt insert into t1 values(55) aus, um das Datenpaket 1a 00 00 # payload_length einzukapseln 
00 # Sequenz-ID
03 # Befehlstyp COM_QUERY
696e7365727420696e746f2074312076616c75657328353529 # in t1-Werte einfügen (55)

Vom Server zurückgegebenes Datenpaket: Antwort
07 00 00 # Nutzlastlänge
01 # Sequenz-ID
00010003000000

Der Client führt Commit aus; das gekapselte Datenpaket ist 07 00 00 # payload_length
00 # Sequenz-ID
03 # Befehlstyp COM_QUERY
636f6d6d6974 # festschreiben

Vom Server zurückgegebenes Datenbankpaket: Antwort
07 00 00 # Nutzlastlänge
01 # Sequenz-ID
00000002000000

2.2.4 OK-Paketformatanalyse, wenn session_track_transaction_info = 1

## session_track_transaction_info = 1
Der Client führt begin aus; gekapseltes Datenpaket 06 00 00 # payload_length
00 # Sequenz-ID
03 # Befehlstyp COM_QUERY
626567696e#beginnen

Vom Server zurückgegebenes Datenpaket: Antwort
14 00 00 # Nutzlastlänge
01 # Sequenz-ID
00 # Header 0x00 zeigt ein OK-Paket an 00 # Betroffene Zeilen 0
00 # Die zuletzt eingefügte ID
03400000000b050908
54 5f 5f 5f 5f 5f 5f 
# Informationen zum Transaktionsstatus T_______
# Stelle 1: 54 //Öffne eine Transaktion explizit # Stelle 2: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen gelesen # Stelle 3: 5f //In der aktuellen Transaktion werden keine transaktionalen Speicher-Engine-Tabellen gelesen # Stelle 4: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen geschrieben # Stelle 5: 5f //In der aktuellen Transaktion werden keine transaktionalen Speicher-Engine-Tabellen geschrieben # Stelle 6: 5f //In der aktuellen Transaktion werden keine unsicheren Anweisungen verwendet # Stelle 7: 5f //Kein Ergebnissatz # Stelle 8: 5f //Keine Tabellensperre Client führt Einfügen in t1 aus values(111) gekapseltes Datenpaket 1b 00 00 # payload_length
00 # Sequenz-ID
03 # Befehlstyp COM_QUERY
696e7365727420696e746f2074312076616c7565732831313129 # in t1-Werte einfügen (111)

Vom Server zurückgegebenes Datenpaket: Antwort
14 00 00 # Nutzlastlänge
01 # Sequenz-ID
00010003400000000b050908 
54 5f 5f 5f 57 5f 5f 5f # Transaktionsstatusinformationen T___W___
# Stelle 1: 54 //Öffne eine Transaktion explizit # Stelle 2: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen gelesen # Stelle 3: 5f //In der aktuellen Transaktion werden keine transaktionalen Speicher-Engine-Tabellen gelesen # Stelle 4: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen geschrieben # Stelle 5: 57 //In der aktuellen Transaktion werden transaktionale Speicher-Engine-Tabellen geschrieben # Stelle 6: 5f //In der aktuellen Transaktion werden keine unsicheren Anweisungen verwendet # Stelle 7: 5f //Kein Ergebnissatz # Stelle 8: 5f //Client führt Commit aus, ohne die Tabelle zu sperren; gekapseltes Datenpaket 07 00 00 # payload_length
00 # Sequenz-ID
03 # Befehlstyp COM_QUERY
636f6d6d6974 # festschreiben

Vom Server zurückgegebenes Datenpaket: Antwort
1400000100000002400000000b050908
5f 5f 5f 5f 5f 5f 5f 5f # Informationen zum Transaktionsstatus________
# Stelle 1: 5f //Keine aktive Transaktion# Stelle 2: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen gelesen# Stelle 3: 5f //In der aktuellen Transaktion werden keine transaktionalen Speicher-Engine-Tabellen gelesen# Stelle 4: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen geschrieben# Stelle 5: 5f //In der aktuellen Transaktion werden keine transaktionalen Speicher-Engine-Tabellen geschrieben# Stelle 6: 5f //In der aktuellen Transaktion werden keine unsicheren Anweisungen verwendet# Stelle 7: 5f //Kein Ergebnissatz# Stelle 8: 5f //Keine Tabellensperre

2.2.5 OK-Paketformatanalyse, wenn session_track_transaction_info = 2

Wenn der Parameter session_track_transaction_info auf 2 gesetzt ist, werden detailliertere Informationen zum Transaktionsstatus angezeigt.

Der Client führt begin aus; gekapseltes Datenpaket 06 00 00 # payload_length
00 # Sequenz-ID
03 # Befehlstyp COM_QUERY
626567696e#beginnen

Vom Server zurückgegebenes Datenpaket: Antwort
29 00 00 # Nutzlastlänge
01 # Sequenz-ID
000000034000000020050908
54 5f 5f 5f 5f 5f 5f 5f # Informationen zum Transaktionsstatus T_______
0413125354415254205452414e53414354494f4e3b # TRANSAKTION STARTEN;
# Stelle 1: 54 //Öffne eine Transaktion explizit # Stelle 2: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen gelesen # Stelle 3: 5f //In der aktuellen Transaktion werden keine transaktionalen Speicher-Engine-Tabellen gelesen # Stelle 4: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen geschrieben # Stelle 5: 5f //In der aktuellen Transaktion werden keine transaktionalen Speicher-Engine-Tabellen geschrieben # Stelle 6: 5f //In der aktuellen Transaktion werden keine unsicheren Anweisungen verwendet # Stelle 7: 5f //Kein Ergebnissatz # Stelle 8: 5f //Keine Tabellensperre Client führt Einfügen in t1 aus values(222) gekapseltes Datenpaket 1b 00 00 # payload_length
00 # Sequenz-ID
03 # Befehlstyp COM_QUERY
696e7365727420696e746f2074312076616c7565732832323229 # in t1-Werte einfügen (222)

Vom Server zurückgegebenes Datenpaket: Antwort
14 00 00 # Nutzlastlänge
01 # Sequenz-ID
00010003400000000b050908
54 5f 5f 5f 57 5f 5f 5f # Transaktionsstatusinformationen T___W___
# Stelle 1: 5f //Keine aktive Transaktion# Stelle 2: 5f //In der aktuellen Transaktion wird keine nicht-transaktionale Speicher-Engine-Tabelle gelesen# Stelle 3: 5f //In der aktuellen Transaktion wird keine transaktionale Speicher-Engine-Tabelle gelesen# Stelle 4: 5f //In der aktuellen Transaktion wird keine nicht-transaktionale Speicher-Engine-Tabelle geschrieben# Stelle 5: 5f //In der aktuellen Transaktion wird keine transaktionale Speicher-Engine-Tabelle geschrieben# Stelle 6: 5f //In der aktuellen Transaktion werden keine unsicheren Anweisungen verwendet# Stelle 7: 5f //Kein Ergebnissatz# Stelle 8: 5f //Keine Tabelle ist gesperrtClient führt Commit aus; gekapseltes Datenpaket 07 00 00 # payload_length
00 # Sequenz-ID
03 # Befehlstyp COM_QUERY
636f6d6d6974 # festschreiben

Vom Server zurückgegebenes Datenpaket: Antwort
17 00 00 # Nutzlastlänge
01 # Sequenz-ID
00000002400000000e050908 
5f 5f 5f 5f 5f 5f 5f 5f # Informationen zum Transaktionsstatus________
040100
# Stelle 1: 5f //Keine aktive Transaktion# Stelle 2: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen gelesen# Stelle 3: 5f //In der aktuellen Transaktion werden keine transaktionalen Speicher-Engine-Tabellen gelesen# Stelle 4: 5f //In der aktuellen Transaktion werden keine nicht-transaktionalen Speicher-Engine-Tabellen geschrieben# Stelle 5: 5f //In der aktuellen Transaktion werden keine transaktionalen Speicher-Engine-Tabellen geschrieben# Stelle 6: 5f //In der aktuellen Transaktion werden keine unsicheren Anweisungen verwendet# Stelle 7: 5f //Kein Ergebnissatz# Stelle 8: 5f //Keine Tabellensperre

3. Fazit

Nach dem Festlegen des Parameters session_track_transaction_info können die Transaktionsstatusinformationen der aktuellen Verbindung im Rückgabedatenpaket von MySQL abgerufen werden.

Diese Funktion kann in Datenbank-Middleware verwendet werden, um im Falle eines MySQL-Fehlers Verbindungen automatisch zu migrieren und so die Auswirkungen auf die Benutzer zu reduzieren.

In einigen Szenarien kann der zugrunde liegende MySQL-Knotenfehler umgeschaltet werden und die Anwendung kann unbemerkt umschalten.

Nun, 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. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Eine Lösung für das MySQL-Master-Slave-Synchronisationsproblem
  • Zusammenfassung der Online-Methoden zur Fehlerbehebung bei MySQL-Synchronisierungsfehlern (unbedingt lesen)
  • Super-Deployment-Tutorial zur MHA-Hochverfügbarkeits-Failover-Lösung unter MySQL
  • Eine langsame MySQL-Abfrage verursachte einen Fehler
  • Übersicht, Installation, Fehlerbehebung, Tipps und Tools zur MySQL-Replikation (geteilt von Huo Ding)
  • Methoden zum Erkennen von MySQL-Tabellenfehlern
  • Häufige Fehler und Gründe für MySQL-Verbindungsfehler
  • MySQL schlägt fehl und die Anwendung wird direkt getrennt, was zu einer Datensperre führt (Produktionsfehler)

<<:  Die Eltern-Kind-Knoten-Zuordnung des El-Tree-Mehrfachauswahlbaums (Kontrollkästchen) des Elements ist nicht zugeordnet

>>:  Lösung für 700 % CPU-Auslastung eines Linux-Prozesses, der nicht beendet werden kann

Artikel empfehlen

Lösung zur Installation von OpenCV 3.2.0 in Ubuntu 18.04

Laden Sie opencv.zip herunter Installieren Sie di...

Detaillierte Erklärung der Schlüsselwörter und reservierten Wörter in MySQL 5.7

Vorwort Die Schlüsselwörter von MySQL und Oracle ...

So implementieren Sie einen Kennwortstärke-Detektor in React

Inhaltsverzeichnis Vorwort verwenden Komponentens...

Beispiel für automatischen Stoppeffekt nach Text-Scrollen

Die Wirkung ist ganz einfach: Kopieren Sie einfach...

Detaillierte Erläuterung der Vue-Formularbindung und -Komponenten

Inhaltsverzeichnis 1. Was ist bidirektionale Date...

js realisiert das dynamische Laden von Daten durch Wasserfallfluss

In diesem Artikel erfahren Sie den spezifischen C...

Docker-Fallanalyse: Erstellen eines MySQL-Datenbankdienstes

Inhaltsverzeichnis 1 Konfigurations- und Datenver...

Vue+Swiper realisiert Timeline-Effekt

In diesem Artikel wird der spezifische Code von v...

Zusammenfassung der CSS-Schwebeelementanalyse

Float: links/rechts/keine; 1. Gleichstufiges Schw...

Lernen Sie die asynchrone Programmierung in Node.js in einem Artikel

Inhaltsverzeichnis Einführung Synchron Asynchron ...

HTML-Codebeispiel: Detaillierte Erklärung von Hyperlinks

Hyperlinks sind die am häufigsten verwendeten HTM...