MySQL デッドロックのトラブルシューティング手順

シリーズ記事ディレクトリ

第 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;

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/ruoshui77/article/details/127330093