mysqlデータベースのデッドロック解決方法

2375 ワード

  • Author: [email protected]
  • Date: 2016.04.30

  • データベースのデッドロックの問題は、やはり嫌われています.
    ここでは、データベースのデッドロックを解決する2つの方法を示します.
  • 1)データベースの再起動(誰が知っているか)
  • 2)資源を奪うプロセスを殺す:
  • まずどのプロセスが資源を奪っているかを調べます:SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
  • それらを殺す:Kill trx_mysql_thread_id;
  • その他の操作:
  • ロック中のトランザクションの表示:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
  • ロック待ちトランザクションの表示:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
  • 1:現在のトランザクションの表示
    mysql> SELECT * FROM information_schema.innodb_trxG 2:現在ロックされているトランザクションの表示
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 3:現在ロックされているトランザクションの表示
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
    次のクエリは、ブロックされている人と待機している人、およびどのくらい待機しているかを示します.SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, TIMESTAMPDIFF( SECOND, r.trx_wait_started, CURRENT_TIMESTAMP ) wait_time, r.trx_query waiting_query, l.lock_table waiting_table_lock, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, SUBSTRING( p. HOST, 1, INSTR(p. HOST, ':') - 1 ) blocking_host, SUBSTRING(p. HOST, INSTR(p. HOST, ':') + 1) blocking_port, IF (p.COMMAND = 'Sleep', p.TIME, 0) idel_in_trx, b.trx_query blocking_query FROM information_schema.INNODB_LOCK_WAITS w INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.INNODB_TRX r ON r.trx_id = w.requesting_trx_id INNER JOIN information_schema.INNODB_LOCKS l ON w.requested_lock_id = l.lock_id LEFT JOIN information_schema. PROCESSLIST p ON p.ID = b.trx_mysql_thread_id ORDER BY wait_time DESC
    次のクエリは、どのクエリがどのスレッドによってブロックされているかを示します.SELECT CONCAT('thread ' , b.trx_mysql_thread_id , ' from ' , p.host) as who_blocks, IF(p.command = "Sleep", p.time, 0 ) as idle_in_trx, MAX(TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW() )) as max_wait_time, COUNT(*) as num_waiters FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON b.trx_id = w.requesting_trx_id LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id GROUP BY who_blocks ORDER BY num_waiters DESC