我有一个带有 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;