在 Debian 上 MySQL(或 MariaDB)占用高内存,通常不是“泄漏”,而是配置和使用方式导致的正常或可调优占用。下面按「常见原因 → 排查方法 → 解决建议」来讲。
MySQL 默认会把大量内存给 InnoDB Buffer Pool:
innodb_buffer_pool_size
如果你内存是 8G,但没改配置,MySQL 可能默认占用 50%~70%。
✅ 查看当前值:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
✅ 建议:
每个连接大约占用:
查看:
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
如果 max_connections=151,但实际常用 20,就是浪费。
✅ 建议:
max_connections = 50
MySQL 5.7 及以前:
query_cache_size
高并发下反而拖慢并占内存。
✅ 建议(MySQL 8 已移除):
query_cache_type = 0
query_cache_size = 0
以下参数过大会直接吃内存:
tmp_table_size
max_heap_table_size
sort_buffer_size
join_buffer_size
read_buffer_size
✅ 建议:
top / htop 中:
MySQL 的 VIRT 经常几 GB,这是正常的。
✅ 看真实占用:
ps -o pid,user,rss,cmd -p $(pgrep mysqld)
会导致:
ps aux | grep mysqld
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';
SHOW PROCESSLIST;
SHOW VARIABLES LIKE 'slow_query_log';
/etc/mysql/my.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
/etc/mysql/mariadb.conf.d/
修改后:
systemctl restart mysql
[mysqld]
innodb_buffer_pool_size = 1G
max_connections = 50
query_cache_type = 0
query_cache_size = 0
tmp_table_size = 32M
max_heap_table_size = 32M
你可以告诉我:
SHOW VARIABLES 或 ps 输出我可以直接帮你算一套合适的内存配置。