mysqlデータベースのデッドロック解決方法
2375 ワード
データベースのデッドロックの問題は、やはり嫌われています.
ここでは、データベースのデッドロックを解決する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;
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