我们正在尝试诊断 MySQL 5.0 中的死锁问题。目前所有表都是 MyISAM 表,因此所有锁都是表锁。我们的比率很好table_locks_waited
(table_locks_immediate
低于 1:1000),但几分钟内就会出现几个死锁。这只发生在 Amazon EC2 上,而不会发生在我们的任何其他服务器上。
有没有办法记录所有无法立即获得表锁的查询?我们希望查看导致该table_locks_waited
数字的所有查询。
答案1
在慢速日志中,显示的字段之一是锁定时间
以下是记录的两个查询的示例
# Time: 110726 1:00:09
# User@Host: mysql[mysql] @ [10.64.100.208]
# Query_time: 8 Lock_time: 0 Rows_sent: 0 Rows_examined: 852669
insert into rates_old select * from rates;
# Time: 110726 1:30:56
# User@Host: mysql[mysql] @ [10.64.100.208]
# Query_time: 50 Lock_time: 0 Rows_sent: 0 Rows_examined: 11015414
SET timestamp=1311661856;
delete a.*, b.* from zillowDump a, zillowHistory b where a.loanRequestId=b.loanRequestId and a.addDate < date_sub(now(), INTERVAL 2 week);
请注意 Lock_time:字段。
警告
在 MySQL 5.1+ 中,该字段出现在默认的 mysql.slow_log 表中
mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
Table: slow_log
Create Table: CREATE TABLE `slow_log` (
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`query_time` time NOT NULL,
`lock_time` time NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)
无论哪种方式,您都可以掌握任何查询的锁定时间
答案2
尝试使用此命令实时观察查询和锁:
watch -n 0.5 'mysqladmin -u root -ppassword "processlist"'
如果锁定持续一段时间,您应该清楚发生了什么。