シリーズ記事ディレクトリ
第 1 章: sql_mode 第
2 章: テーブルの最適化、テーブルの分析、テーブルの変更、gh-ost 第 3 章:
InnoDB MVCC の原則
第 4 章: SQL ステートメントの実行プロセス
第 5 章: Percona Toolkit の紹介
第 6 章: MySQL インデックス 第
7 章: MySQL ロックの
章8: MySQL ロック分析
第 9 章: MySQL デッドロックのトラブルシューティング手順
記事ディレクトリ
序文
MySQL のデッドロックは、オンラインまたは開発環境で発生することがあります.次の方法を使用して、デッドロックの問題をトラブルシューティングできます.
1. オンライン環境
1. 最後のデッドロック状況を表示する
show engine innodb status\G
ロックされたステートメントは、実行された sql に基づいて元に戻すことができます。
2.エラーログ
/etc/my.cnf ファイルの構成を変更または増やします。[mysqld] の下に追加された位置に注意してください。そうしないと無効になります。
innodb_print_all_deadlocks = ON
エラー ログのパスは、次の sql で表示できます。
SHOW VARIABLES LIKE 'log_error';
このようにして、エラー ログの分析を通じて mysql のデッドロックをトラブルシューティングできます。
2. 開発環境
1. デッドロックが発生した場合
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;
現在ロックを待っているステートメントを確認できます。
2. ロック範囲を分析する
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;