在 Ubuntu 上 MySQL 占内存高 是很常见的现象,通常不是“内存泄漏”,而是 MySQL 本身的设计和配置决定的。下面按「原因 → 排查 → 优化」给你讲清楚。
innodb_buffer_pool_size
这是 最大头。
✅ 这是正常的,不是 bug
查看:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
max_connections
每个连接都会分配:
查看:
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
常见内存消耗项:
sort_buffer_sizejoin_buffer_sizeread_buffer_sizetmp_table_size⚠️ 这些是 “每连接”分配,连接多就爆炸
你可能看到:
free -h
used 很高,available 很少
但其实是:
可用:
free -h
cat /proc/meminfo
ps aux | grep mysqld
top
# 或
htop
mysqld --verbose --help | grep buffer
或:
SHOW VARIABLES LIKE '%buffer%';
编辑:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
示例(2G 内存服务器):
innodb_buffer_pool_size = 512M
重启:
sudo systemctl restart mysql
max_connections = 50
sort_buffer_size = 256K
join_buffer_size = 256K
read_buffer_size = 128K
tmp_table_size = 32M
如果你只是:
可直接用:
[mysqld]
innodb_buffer_pool_size = 256M
max_connections = 30
✅ 正常:
❌ 异常:
你可以把下面信息发我,我可以直接帮你算该配多少内存:
SHOW VARIABLES LIKE '%buffer%'; 输出我可以给你一套精准配置。