一、问题描述
开发中对一张大表进行批量的更新或者删除的时候 会报以下错误:
The total number of locks exceeds the lock table size
从字面上理解,就是当前操作锁住的总行数已经超过设置的锁表的大小。
二、解决办法
解决方案一:分批进行更新或者删除
如给delete 语句后面加上limit ,一次 1w条
delete from user where name like '%zs%' limit 10000;
解决方案二:调整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 的倍数。