mysql - 在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.
另外,如果截断查询由于任何原因而失败,锁是继续还是被释放?
解决方案
您明确链接的文档指的是alter table ... truncate partition ...
语句,而不是alter table ... drop partition ...
您根据仅锁定正在清除的分区的问题使用的文档。
此外,链接的手册说
此外,ALTER TABLE 语句在表级别采用元数据锁。
您收到的错误消息与记录的行为一致。
您可能需要在不使用系统时执行 drop 操作以避免此锁定问题。
推荐阅读
- sorting - 伪代码逗号
- swift - Swift 中带有 CollectionView 和 TableView 的 UIView
- c++ - 为什么 while(!file.eof()) 会陷入无限循环?C++
- python - 使用来自另一个文件的参数打开一个 python 文件
- vba - vba 脚本将代码从文本文件复制到 ThisoutlookSession 模块
- android - 在 React Native Camera 中使用 focusDepth 时图像失焦
- django - 在 Django 应用程序中使用 Heroku Connect 中的 Salesforce 自定义字段
- reactjs - React useContext 不会更新子组件,但适用于页面刷新
- forms - 在 null 上调用了方法“更新”
- xamarin.forms - Xamarin iOS 部署到应用商店导致“无效的捆绑结构 [...] GoogleMaps”错误