在 Debian 上 MySQL(通常是 MySQL / MariaDB)占用内存过高,常见原因可分为 配置因素 和 使用因素 两大类。下面按“最常见 → 较少见”的顺序说明,并给出排查与优化方法。
MySQL 默认会分配大量内存给:
innodb_buffer_pool_size
这是 最容易吃内存的部分。
mysql -u root -p
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
编辑配置文件(常见路径):
/etc/mysql/mysql.conf.d/mysqld.cnf
# 或
/etc/mysql/mariadb.conf.d/50-server.cnf
示例(2G 内存机器):
innodb_buffer_pool_size = 512M
修改后重启:
systemctl restart mysql
每个连接都会占用内存:
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
max_connections = 500max_connections = 100
并降低每个连接的内存:
sort_buffer_size = 1M
join_buffer_size = 1M
read_buffer_size = 1M
以下情况会暴涨内存:
ORDER BY 大表无索引GROUP BY 大结果集SELECT *SHOW PROCESSLIST;
开启慢查询日志:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
Linux 会把空闲内存用于 文件系统缓存,这看起来像“内存满了”。
free -h
关注:
available
而不是 used
✅ 如果 available 还很多,就不是真正内存不足
aria_pagecache_buffer_size
也会占内存
如:
ps aux | grep mysqld
SHOW ENGINE INNODB STATUS;
mysqltuner
安装:
apt install mysqltuner
mysqltuner
| 场景 | 原因 |
|---|---|
| 1G/2G 服务器 | buffer pool 过大 |
| 突然内存飙升 | 大查询 / 连接暴增 |
| 长期缓慢增长 | 连接未释放 |
| free 显示满 | Linux 缓存正常现象 |
你可以贴出:
free -hmy.cnf 配置SHOW VARIABLES LIKE '%buffer%';我可以直接给你 一份可执行的优化配置。