首页 > 解决方案 > 在mysql中截断分区锁定整个表

问题描述

新手来了 我每天都会生成大量数据,并存储在按天划分的分区中。但是,我有一个自动删除旧日(30 天前)的 cron。删除查询如下:

ALTER TABLE my_table DROP PARTITION p20210206;mysql(5.7) 的文档在这里说,当我们删除 innodb 表的一个分区时,另一个分区不会被锁定。但是,当我在分区删除过程中执行任何查询时,它们会被锁定。

我打了一个小的插入查询,这是 FULL PROCESS LIST 中的状态

    id: 32031012
   User: ab
   Host: myhost
     db: myDB
Command: Query
   Time: 1
  State: Waiting for table metadata lock
   Info: INSERT INTO my_table VALUES (9, 1, NULL, NULL, 'SUCCESS', '2020-02-05 09:46:13.356', '2020-02-05 09:47:36.869', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 20210307)
Can someone, please explain me why are the other partition getting locked and how can I overcome this problem.

另外,如果截断查询由于任何原因而失败,锁是继续还是被释放?

标签: mysqllockinginnodb

解决方案


您明确链接的文档指的是alter table ... truncate partition ...语句,而不是alter table ... drop partition ...您根据仅锁定正在清除的分区的问题使用的文档。

此外,链接的手册说

此外,ALTER TABLE 语句在表级别采用元数据锁。

您收到的错误消息与记录的行为一致。

您可能需要在不使用系统时执行 drop 操作以避免此锁定问题。


推荐阅读