Vor einiger Zeit habe ich einen Blogbeitrag mit dem Titel „Können wir SQL-Anweisungen von nicht festgeschriebenen Transaktionen in ORACLE finden?“ geschrieben. Können wir also in der MySQL-Datenbank die von nicht festgeschriebenen Transaktionen ausgeführten SQL-Anweisungen oder zugehörige Informationen zu nicht festgeschriebenen Transaktionen finden? Das Experiment hat bestätigt, dass sich der Thread im Ruhezustand befindet, wenn in einer Sitzung (Verbindung) eine nicht festgeschriebene Transaktion vorliegt und kein Vorgang ausgeführt wird. mysql> wähle connection_id() von dual; +-----------------+ | Verbindungs-ID() | +-----------------+ | 6 | +-----------------+ 1 Zeile im Satz (0,00 Sek.) mysql> setze Sitzungs-Autocommit=0; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> löschen aus kkk, wo ID =1; Abfrage OK, 1 Zeile betroffen (0,00 Sek.) MySQL> Fragen Sie in einer anderen Sitzung (Verbindung) die Detailinformationen der Transaktion ab, die seit mehr als 10 Sekunden nicht mehr festgeschrieben wurde: Wählen Sie t.trx_mysql_thread_id aus. ,t.trx_state ,t.trx_tables_in_use ,t.trx_tables_locked ,t.trx_query ,t.trx_rows_locked ,t.trx_rows_modifiziert ,t.trx_lock_structs ,t.trx_started ,t.trx_isolation_level ,p.Zeit ,p.Benutzer ,p.host ,p.db ,p.Befehl VON information_schema.innodb_trx t INNER JOIN information_schema.prozessliste p EIN t.trx_mysql_thread_id = p.id WO t.trx_state = "LÄUFT" UND p.Zeit > 10 UND p.command = 'Schlaf'\G Wie im obigen Screenshot gezeigt, ist trx_query ein NULL-Wert. Es ist grundsätzlich unmöglich, SQL-Anweisungen für nicht festgeschriebene Transaktionen zu finden. Die Informationen zu Transaktionen in MySQL sind nicht sehr detailliert und können sogar als etwas knapp bezeichnet werden. Ich kann nicht einmal feststellen, wo die Sperre auf diesem Tisch erfolgt. Es sind nur Informationen wie trx_row_locked, trx_row_modified und trx_started sichtbar. Dasselbe gilt, wenn Sie mysql> Engine-InnoDB-Status anzeigen; ---TRANSAKTION 1282583, AKTIV 11937 Sek. 2 Sperrstruktur(en), Heap-Größe 360, 8 Zeilensperre(n), Undo-Log-Einträge 1 MySQL-Thread-ID 6, OS-Thread-Handle 0x7f8da2de3700, Abfrage-ID 190 Localhost-Root Wenn die nicht festgeschriebene Transaktion andere Sitzungen blockiert, ist es möglich (nur eine Möglichkeit, in vielen Szenarien ist es unmöglich, das SQL zu finden, das mit der festgeschriebenen Transaktion zusammenhängt), das von der nicht festgeschriebenen Transaktion ausgeführte SQL zu finden. Wie der folgende Test zeigt, wurde der Löschvorgang in der Sitzung ausgeführt (Verbindung mysql> setze Sitzungs-Autocommit=0; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> wähle Verbindungs-ID(); +-----------------+ | Verbindungs-ID() | +-----------------+ | 11 | +-----------------+ 1 Zeile im Satz (0,01 Sek.) mysql> löschen aus kkk, wo ID=1; Abfrage OK, 1 Zeile betroffen (0,00 Sek.) MySQL> Eine andere Sitzung (Verbindung) führt einen Vorgang zum Aktualisieren eines Datensatzes aus. Zu diesem Zeitpunkt wird SQL blockiert. mysql> wähle Verbindungs-ID(); +-----------------+ | Verbindungs-ID() | +-----------------+ | 13 | +-----------------+ 1 Zeile im Satz (0,00 Sek.) MySQL> mysql> aktualisiere kkk, setze ID=100, wobei ID=1; In einer anderen Sitzung können wir das folgende SQL ausführen, um das letzte von der nicht festgeschriebenen Transaktion ausgeführte SQL zu finden. mysql> AUSWÄHLEN r.trx_id wartende_trx_id, -> r.trx_mysql_thread_id wartender_Thread, -> r.trx_query warte_abfrage, -> b.trx_id blockierende_trx_id, -> b.trx_mysql_thread_id blockierender Thread, -> b.trx_query blockierende_Abfrage -> VON information_schema.innodb_lock_waits w -> INNER JOIN information_schema.innodb_trx b -> EIN b.trx_id = w.blocking_trx_id -> INNER JOIN information_schema.innodb_trx r -> EIN r.trx_id = w.requesting_trx_id; +----------------+----------------+----------------------------------+-----------------+-----------------+----------------+ | Warte-TRX-ID | Warte-Thread | Warte-Abfrage | Blockierungs-TRX-ID | Blockierungs-Thread | Blockierungs-Abfrage | +----------------+----------------+----------------------------------+-----------------+-----------------+----------------+ | 2830 | 13 | kkk-Update, ID=100 festlegen, wobei ID=1 | 2825 | 11 | NULL | +----------------+----------------+----------------------------------+-----------------+-----------------+----------------+ 1 Zeile im Satz (0,00 Sek.) mysql> SELECT a.sql_text, -> c.id, -> d.trx_started -> VON performance_schema.events_statements_current ein -> tritt performance_schema.threads b bei -> EIN a.thread_id = b.thread_id -> beitreten information_schema.processlist c -> EIN b.processlist_id = c.id -> beitreten information_schema.innodb_trx d -> EIN c.id = d.trx_mysql_thread_id -> wobei c.id=11 -> ORDER BY d.trx_started\G; *************************** 1. Reihe *************************** sql_text: Löschen aus kkk, wo ID = 1 ID: 11 trx_started: 12.06.2019 23:36:13 1 Zeile im Satz (0,03 Sek.) FEHLER: Keine Abfrage angegeben MySQL> Zusammenfassen: Grundsätzlich kann MySQL nur die grundlegenden Informationen zu nicht festgeschriebenen Transaktionen finden, wie etwa trx_mysql_thread_id usw. In manchen Szenarien haben wir fast keine Möglichkeit, detaillierte Informationen herauszufinden, wie etwa das von der nicht festgeschriebenen Transaktion ausgeführte SQL. Es ist unklar, welche Vorgänge für die nicht festgeschriebenen Transaktionen ausgeführt wurden. Das ist alles für diesen Artikel. Ich hoffe, dass der Inhalt dieses Artikels für Ihr Studium oder Ihre Arbeit von gewissem Referenzwert ist. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: Eine kurze Diskussion über die Magie von parseInt() in JavaScript
>>: Detaillierte Erklärung zur Verwendung des Split-Befehls zum Teilen von Linux-Dateien
Vorwort Ich habe mir am Sonntag zu Hause das drei...
Holen Sie sich das IP-Tool importiere lombok.exte...
Ich möchte das Marquee-Tag verwenden, um das Scrol...
Sperren in MySQL Sperren sind ein Mittel, um Ress...
Vorwort Das Linux-System wird durch den Systemdie...
Ich habe das ganze Internet durchsucht und bin au...
Problembeschreibung html <iframe id="h5In...
GTID-basierte Replikation Einführung Die GTID-bas...
Ergebnisse erzielen Umsetzungsideen Der Schmelzef...
Gute Datenbankspezifikationen tragen dazu bei, di...
WebRTC steht für Web Real-Time Communication und ...
Heute werden wir einen fragmentierten Bildladeeff...
Windows: Unterstützt NTFS, FAT Linux unterstützt ...
Inhaltsverzeichnis Installieren Sie Docker unter ...
Inhaltsverzeichnis Was ist MySQL NDB Cluster? Vor...