mysql专题系列二:mysql大批量删除(修改)报错的解决方案

1,818 阅读2分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

一、问题描述

在我们的日常开发中,尤其是在压测的时候,经常会导入大批量的数据,测试完毕以后,还需要删除,或者将修改过的数据恢复原样,一种比较正规的方式就是 让DBA 去执行数据备份和恢复,另一种就是 编写 update或者 delete语句,进行更新或者删除,当对一张大表进行批量的更新或者删除的时候 会经常报以下错误:

mysql版本:5.7

The total number of locks exceeds the lock table size

从字面上理解,就是当前操作锁住的总行数已经超过设置的锁表的大小,锁表了 肯定就没办法删除了。

二、解决办法

2.1解决方案一:分批进行更新或者删除

如给delete 语句后面加上limit ,一次 1w条

delete from user where name like '%mysql专题数据库%' limit 10000;

2.2 解决方案二:调整mysql的innodb_buffer_pool_size 参数

innodb_buffer_pool_size 默认大小是128m(mysql8.0)

--查看当前mysql的innodb_buffer_pool_size 大小
SHOW VARIABLES LIKE "%innodb_buffer_pool_size%";

临时设置 innodb_buffer_pool_size 大小为2g,这种是临时的解决方案,如果重启mysql以后,这个配置就失效如果还想使用就必须再设置一次。

set global innodb_buffer_pool_size = 2147483648

永久生效需要改动my.cnf 配置文件,在配置文件中增加如下配置:

innodb_buffer_pool_size = 2G

然后重启mysql服务。 拓展:

  • innodb_buffer_pool_size(缓冲池大小)生产环境 mysql专用服务器 建议设置成服务器总内存的 70%到80%之间
  • innodb_buffer_pool_chunk_size(定义InnoDB缓冲池大小调整操作的块大小)
  • innodb_buffer_pool_instances(InnoDB 缓冲池划分为的区域数)
  • innodb_buffer_pool_size 必须是 innodb_buffer_pool_chunk_size 乘以 innodb_buffer_pool_instances 的倍数。

三、参考文章

  1. MySQL调优之innodb_buffer_pool_size大小设置
  2. MySQL优化:innodb_buffer_pool_instances与innodb_buffer_pool_size参数分析
  3. mysql8.0 官方文档
  4. Mysql解决The total number of locks exceeds the lock table size错误
  5. MYSQL解决 The total number of locks exceeds the lock table size 问题
  6. mysql底层解析——缓存,Innodb_buffer_pool,包括连接、解析、缓存、引擎、存储等