「这是我参与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 的倍数。