2014年10月28日星期二

Innodb engine Waiting for table level lock

show processlist 看到大量的 Waiting for table level lock

 video_file set dmd5='3b6950150e45488268431b612c81eb1e', filesize=2790658, totaltime=261625, v |         0 |             0 |         1 |
| 2090679959 | 58bb520         | 10.11.80.84:16894   | 56_flash_flv | Query       |     1047 | Waiting for table level lock                                          | update video_file set dmd5='8242e23856e6fe9457a41f26076d1cec', filesize=7871452, totaltime=304600, v |         0 |             0 |         1 |
| 2090679973 | 58bb520         | 10.11.80.82:29175   | 56_flash_flv | Query       |     1012 | Waiting for table level lock                                          | update video_file set dmd5='aa859956958e7aa4c86bd3b0b3b3133b', filesize=10095169, totaltime=286000,  |         0 |             0 |         1 |
| 2090679997 | 58bb520         | 10.11.80.117:37906  | 56_flash_flv | Query       |     1023 | Waiting for table level lock                                          | update video_file set dmd5='5152806cba75a0c659ccb684ae88f3d6', filesize=7750179, totaltime=107880, v |         0 |             0 |         1 |
| 2090680656 | c26140          | 10.11.80.117:38628  | 56_flash_flv | Query       |     1098 | Writing to net                                                        | SELECT /*!40001 SQL_NO_CACHE */ * FROM `flash_flv_date`                                              |  13222420 |             0 |  13222420 |
| 2090680664 | 58bb520         | 10.11.80.117:38634  | 56_flash_flv | Query       |     1098 | Waiting for table level lock                                          | insert into `flash_flv_date` set

表是 innodb 的表,这个可以肯定,如果是对表进行修改操作,会出现 metadata 的锁表等待,但是和平常看到的不太一样。

从 processlist 输出注意到  sql 中的注释 /*!40001 SQL_NO_CACHE */  来看,是在导数据,并且它的执行时间最长,导致大量更新表操作失败。

innodb 是支持事物型的,直接锁住整个表的情况不合理,另外即便是锁表的话,最常见的也是这种:

Waiting for table metadata lock


为了验证来源,进行测试,在 mysqldump 的时候增加 --lock-all-tables 发现看到的信息是这样的,和实际的情况有些不一致

 Waiting for global read lock

通过 grep mysqldump 的 help 输出,使用 --add-locks 参数验证,在 state 列的输出重看到 table level lock 的提示:

Waiting for table level lock

没有评论:

发表评论