温馨提示×

ubuntu mysql为啥占内存高

小樊
46
2026-09-12 23:46:03
栏目: 云计算

在 Ubuntu 上 MySQL 占内存高 是很常见的现象,通常不是“内存泄漏”,而是 MySQL 本身的设计和配置决定的。下面按「原因 → 排查 → 优化」给你讲清楚。


一、MySQL 为什么会吃内存(核心原因)

1️⃣ InnoDB 缓冲池(最常见原因)

innodb_buffer_pool_size

这是 最大头

  • 默认可能占用 70%~80% 可用内存
  • 用于缓存:
    • 表数据
    • 索引
    • 查询结果

这是正常的,不是 bug

查看:

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

2️⃣ 连接数太多(每个连接都占内存)

max_connections

每个连接都会分配:

  • 线程内存
  • 排序缓冲
  • 临时表内存

查看:

SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';

3️⃣ 各种 buffer / cache 叠加

常见内存消耗项:

  • sort_buffer_size
  • join_buffer_size
  • read_buffer_size
  • tmp_table_size

⚠️ 这些是 “每连接”分配,连接多就爆炸


4️⃣ Ubuntu 的“看起来很满”

你可能看到:

free -h

used 很高,available 很少

但其实是:

  • Linux 会 主动用内存做 cache
  • MySQL 用的是 shared memory

可用:

free -h
cat /proc/meminfo

5️⃣ 版本问题(MySQL 8 更吃内存)

  • MySQL 8 比 5.7 更占内存
  • 默认配置更“激进”

二、快速排查(你该做什么)

✅ 1. 看 MySQL 实际用多少

ps aux | grep mysqld

✅ 2. 看内存分布

top
# 或
htop

✅ 3. 看 MySQL 配置

mysqld --verbose --help | grep buffer

或:

SHOW VARIABLES LIKE '%buffer%';

三、如何降低 MySQL 内存占用(实用)

✅ 方法 1:调小 InnoDB 缓冲池(最有效)

编辑:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

示例(2G 内存服务器):

innodb_buffer_pool_size = 512M

重启:

sudo systemctl restart mysql

✅ 方法 2:限制连接数

max_connections = 50

✅ 方法 3:调小每连接 buffer

sort_buffer_size = 256K
join_buffer_size = 256K
read_buffer_size = 128K
tmp_table_size = 32M

✅ 方法 4:用轻量配置(小内存机器)

如果你只是:

  • 博客
  • 小项目
  • 测试环境

可直接用:

[mysqld]
innodb_buffer_pool_size = 256M
max_connections = 30

四、什么时候“正常”,什么时候“异常”

✅ 正常:

  • MySQL 占内存高但系统不卡
  • 查询快
  • swap 没用

❌ 异常:

  • OOM(被系统杀掉)
  • 开始用 swap
  • 查询变慢

五、如果你愿意

你可以把下面信息发我,我可以直接帮你算该配多少内存

  1. 服务器内存大小
  2. MySQL 版本
  3. 用途(网站 / API / 数据分析)
  4. SHOW VARIABLES LIKE '%buffer%'; 输出

我可以给你一套精准配置

0