Verzeichnis der Serienartikel
Kapitel 1: sql_mode Kapitel
2: Tabelle optimieren, Tabelle analysieren, Tabelle ändern, Ghost Kapitel 3
: InnoDB MVCC-Prinzip
Kapitel 4: Ausführungsprozess für SQL-Anweisungen
Kapitel 5: Einführung in das Percona-Toolkit
Kapitel 6: MySQL-Index Kapitel
7: MySQL-Sperre
Kapitel 8: MySQL-Sperranalyse
Kapitel 9: Schritte zur Fehlerbehebung bei MySQL-Deadlocks
Artikelverzeichnis
Vorwort
MySQL-Deadlock tritt gelegentlich online oder in der Entwicklungsumgebung auf. Sie können die folgenden Methoden verwenden, um das Deadlock-Problem zu beheben.
1. Online-Umgebung
1. Zeigen Sie die letzte Deadlock-Situation an
show engine innodb status\G
Die gesperrte Anweisung kann basierend auf der ausgeführten SQL rückgängig gemacht werden.
2. Fehlerprotokoll
Ändern oder erweitern Sie die Konfiguration in der Datei /etc/my.cnf, achten Sie auf die hinzugefügte Position unter [mysqld], sonst wird sie ungültig;
innodb_print_all_deadlocks = ON
Der Pfad des Fehlerprotokolls kann über die folgende SQL angezeigt werden:
SHOW VARIABLES LIKE 'log_error';
Auf diese Weise können Sie mysql-Deadlocks durch Fehlerprotokollanalyse beheben
2. Entwicklungsumgebung
1. Wenn ein Deadlock auftritt
SELECT
a.trx_id,
d.SQL_TEXT,
a.trx_state,
a.trx_started,
a.trx_query,
b.ID,
b.USER,
b.DB,
b.COMMAND,
b.TIME,
b.STATE,
b.INFO,
c.PROCESSLIST_USER,
c.PROCESSLIST_HOST,
c.PROCESSLIST_DB
FROM
information_schema.INNODB_TRX a
LEFT JOIN information_schema.PROCESSLIST b ON a.trx_mysql_thread_id = b.id
LEFT JOIN PERFORMANCE_SCHEMA.threads c ON b.id = c.PROCESSLIST_ID
LEFT JOIN PERFORMANCE_SCHEMA.events_statements_current d ON d.THREAD_ID = c.THREAD_ID;
Sie können die Anweisungen sehen, die derzeit auf Sperren warten.
2. Analysieren Sie den Verriegelungsbereich
SELECT ENGINE,ENGINE_TRANSACTION_ID,THREAD_ID,EVENT_ID,OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME,LOCK_TYPE, LOCK_MODE,LOCK_STATUS,LOCK_DATA FROM performance_schema.data_locks;