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
sudo-Konfigurationsdatei Die Standardkonfiguratio...
Um mehrere Sites auf einem Server bereitzustellen...
Inhaltsverzeichnis 1. Weltkarte 1. Installieren S...
Speicherort der MySQL-Datenbank: 1. Wenn MySQL di...
Ich bin bei der Arbeit auf einen Fall gestoßen, ü...
Mussten Sie schon einmal sehr große Datenmengen (...
Code kopieren Der Code lautet wie folgt: <!DOC...
docker-compose.yml Version: '2' Leistunge...
MySQL-Partitionierung ist hilfreich bei der Verwa...
Ich frage mich, ob Sie jemals über diese Frage na...
MySQL-Zeilen-zu-Spalten-Operation Die sogenannte ...
Grundlegende SQL-Anweisungen MySQL-Abfrageanweisu...
Vorwort In diesem Artikel wird hauptsächlich besc...
In diesem Artikel wird der spezifische Code von V...
Erneutes Mounten des Datenträgers nach dem Initia...