类别:SQL数据库 / 日期:2026-01-05 / 浏览:20 / 评论:0
故障信息:
故障原因:
MySQL InnoDB 锁表大小超出限制:The total number of locks exceeds the lock table size
当事务需要锁定大量数据行时,InnoDB 的内存锁缓冲区(lock table)无法容纳所有的锁信息
查看当前会话值:
-- 查询 innodb_buffer_pool_size(缓冲池大小) SELECT @@innodb_buffer_pool_size; -- 查询 innodb_lock_wait_timeout(锁等待超时时间) SELECT @@innodb_lock_wait_timeout; -- 查询 innodb_lru_scan_depth(LRU 扫描深度) SELECT @@innodb_lru_scan_depth;
同时查看全局会话值:
-- 查询全局设置
SELECT @@GLOBAL.innodb_buffer_pool_size;
SELECT @@GLOBAL.innodb_lock_wait_timeout;
SELECT @@GLOBAL.innodb_lru_scan_depth;
-- 批量查询所有相关变量
SHOW GLOBAL VARIABLES WHERE Variable_name IN
('innodb_buffer_pool_size', 'innodb_lock_wait_timeout', 'innodb_lru_scan_depth');查到
SELECT @@innodb_buffer_pool_size;结果是134217728,即128MB
常用换算参照表:
8 MB = 8,388,608 字节 16 MB = 16,777,216 字节 32 MB = 33,554,432 字节 64 MB = 67,108,864 字节 128 MB = 134,217,728 字节 ← 你的当前值 256 MB = 268,435,456 字节 512 MB = 536,870,912 字节 1 GB = 1,073,741,824 字节 2 GB = 2,147,483,648 字节 4 GB = 4,294,967,296 字节 8 GB = 8,589,934,592 字节
128MB 的缓冲池对于生产环境可能偏小,可以临时调整,但重启会失效。以下是临时调整:
-- 临时调整(MySQL 重启后失效) SET GLOBAL innodb_buffer_pool_size = 1073741824; -- 1GB
最好是永久调整,需要修改配置文件my.cnf
-- 永久调整(修改配置文件) -- 在 my.cnf / my.ini 中添加: -- [mysqld] -- innodb_buffer_pool_size = 1G
以下真实环境中的my.cnf相关配置:
1、先查下服务器内存
命令:sudo free -h
物理内存为128G,虚拟内存4G
在my.cnf中增加以下参数:
# InnoDB 存储引擎的内存缓存池大小,设置为 4GB,通常设置为物理内存的 50%-70% (由于还有其它系统,不能设太大) innodb_buffer_pool_size=4096M # 缓冲池的内存块大小,设置为 128MB innodb_buffer_pool_chunk_size=128M # 将缓冲池分割成 8 个独立的实例,适合多核CPU innodb_buffer_pool_instances=8 # MySQL 服务器允许的最大客户端连接数(传统协议) max_connections = 1000 # MySQL X 协议的最大连接数(MySQL 8.0+) mysqlx_max_connections = 1000
设置完成后,需要重启mysql服务,或重启服务器。





