如何记录所有等待表锁的 MySQL 查询?

net*_*ope 7 mysql myisam logging amazon-ec2

我们正在尝试诊断 MySQL 5.0 的死锁问题。目前所有的表都是 MyISAM 表,所以所有的锁都是表锁。我们有一个很好table_locks_waitedtable_locks_immediate比率(低于 1:1000),但在几分钟内我们会遇到一些僵局。这仅发生在 Amazon EC2 上,而不发生在我们的任何其他服务器上。

有没有办法记录所有无法立即获得表锁的查询?我们希望查看对table_locks_waited数字有贡献的所有查询。

小智 5

尝试使用以下命令实时观察查询和锁定:

watch -n 0.5 'mysqladmin -u root -ppassword "processlist"'
Run Code Online (Sandbox Code Playgroud)

如果锁定发生任何时间长度,您应该很好地了解发生了什么。


Rol*_*DBA 2

在慢速日志中,显示的字段之一是锁定时间

这是一个包含两个已记录查询的示例

# 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);
Run Code Online (Sandbox Code Playgroud)

请注意 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)
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都可以掌握任何查询的锁定时间