MySQL 5.7 永远停留在“等待表级锁定”状态

MySQL 5.7 永远停留在“等待表级锁定”状态

我有一个带有 MySQL 数据库的 Web 服务器。它包含多个数据库,为我的各种项目提供服务。自从将 Ubuntu 升级到 16.04 以来,它给我带来了很多麻烦。这个问题具体是关于这样一种情况:一个表被表级锁锁定,但没有明显的原因说明为什么锁没有被快速移除。

我有很多卡住的查询,例如:

581723  algebrainc_ro   localhost   algebrainc  Query   10309   Waiting for table level lock    SELECT\n  *\nFROM inventory\nWHERE inventory_id = '21601'
581724  algebrainc_ro   localhost   algebrainc  Query   10309   Waiting for table level lock    SELECT\n  *\nFROM inventory\nWHERE inventory_id = '21592'
581725  algebrainc_ro   localhost   algebrainc  Query   10309   Waiting for table level lock    SELECT\n  *\nFROM inventory\nWHERE inventory_id = '21602'
581726  algebrainc_ro   localhost   algebrainc  Query   10309   Waiting for table level lock    SELECT\n  *\nFROM inventory\nWHERE inventory_id = '21596'
581729  algebrainc_ro   localhost   algebrainc  Query   10306   Waiting for table level lock    SELECT inventory_id, ebay_title FROM inventory WHERE ebay_id = '32999992936'
581730  algebrainc  localhost   algebrainc  Query   10282   Waiting for table level lock    SELECT \n  complete_status status,\n  ebay_transactions.inventory_id,\n  ebay_transactions.ebay_id, \n  quantity, purchase_price, \n  ebay_title \nFROM ebay_transactions, inventory \nWHERE \n  ebay_transactions.inventory_id = inventory.inventory_id \n  AND created_date > date_add( now(), interval -7 day )\nORDER BY \n  created_date

经过一段时间的寻找,performance_schema例如在table_handles和中什么也没找到metadata_locks,我没有找到太多东西。

过了一会儿,我意识到这是因为mysqldump我定期执行转储某个特定表的进程而发生的。我有十几个卡住的mysqldump进程(由 cron 调用),如下所示:

ichudov   1178  0.0  0.0  29004  3248 pts/46   Ss+  20:24   0:00 mysqldump -ualgebrainc -px xxxxxxxx algebrainc XXXXXXXX_posts
ichudov   1394  0.0  0.0  29004   900 pts/26   Ss+  Jun23   0:00 mysqldump -ualgebrainc -px xxxxxxxx algebrainc XXXXXXXX_posts
ichudov   2537  0.0  0.0  29004   920 pts/22   Ss+  Jun24   0:00 mysqldump -ualgebrainc -px xxxxxxxx algebrainc XXXXXXXX_posts

(为保护隐私,表名已隐藏)

在终止mysqldump进程之后,表锁被解除并且一切恢复正常。

但是为什么mysqldump进程会锁定某些东西并且不工作呢?

答案1

原因: mysqldump 期间的表级锁定是导致速度缓慢的原因,因为表使用的是 MyISAM 引擎

解决:将 MyISAM 转换为 Innodb,用于行级锁定,

ALTER TABLE 'table_name' ENGINE=INNODB;

参考:mysqldump 期间的 myisam 锁

相关内容