类别:SQL数据库 / 日期:2026-01-05 / 浏览:20 / 评论:0

故障信息:

image.png

故障原因:

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

image.png

物理内存为128G,虚拟内存4G

image.png

在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服务,或重启服务器。

打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~

版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。

 可能感兴趣的文章