温馨提示×

debian mysql为何占用过高

小樊
52
2026-10-01 21:39:34
栏目: 云计算

在 Debian 上 MySQL(或 MariaDB)占用过高,通常指 CPU、内存或磁盘 I/O 过高。下面按常见原因 + 排查方法 + 解决建议系统说明。


一、先确认“占用高”是哪一类

1️⃣ 查看系统资源占用

top
htop
free -h
df -h
iostat -x 1

重点看:

  • CPU:mysqld 是否长期 100%+
  • 内存:是否接近 OOM
  • 磁盘 IO:await / %util 是否很高

二、最常见原因与对应排查

一、慢查询 / 缺乏索引(最常见)

表现:CPU 高,但内存不一定高

排查

SHOW PROCESSLIST;

看是否有:

  • Sending data
  • Copying to tmp table
  • 长时间 Query

开启慢查询日志:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

或 Debian 配置文件:

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

解决

  • 加索引
  • 优化 SQL
  • 避免 SELECT *
  • 避免 LIKE '%xxx%'

二、连接数过多

表现:内存暴涨,连接数异常

查看

SHOW STATUS LIKE 'Threads_connected';
SHOW PROCESSLIST;

原因

  • 应用未关闭连接
  • 没有连接池
  • 被攻击(扫端口)

解决

max_connections = 200
wait_timeout = 60
interactive_timeout = 60

三、缓冲池配置不合理(InnoDB)

表现:内存占用异常高或过低

查看

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

建议

  • 专用数据库服务器:
innodb_buffer_pool_size = 物理内存的 60%~70%
  • 小内存 VPS(1G):
innodb_buffer_pool_size = 256M

四、临时表 / 排序滥用

表现:磁盘 IO 高

查看

SHOW STATUS LIKE 'Created_tmp_disk_tables';

解决

  • 增加 tmp_table_size
  • 优化 GROUP BY / ORDER BY
  • 加索引

五、日志 / binlog 无限增长

表现:磁盘占用高

查看

du -sh /var/lib/mysql

解决

expire_logs_days = 7

或 MySQL 8:

SET GLOBAL binlog_expire_logs_seconds = 604800;

六、被攻击 / 异常访问

表现:大量短连接、异常 IP

查看

netstat -ant | grep 3306

解决

  • 限制 IP
  • 防火墙
  • 不暴露 3306 到公网

三、Debian 特有注意点

1️⃣ MySQL vs MariaDB

Debian 默认可能是 MariaDB

mysql --version

配置文件位置:

/etc/mysql/my.cnf
/etc/mysql/mariadb.conf.d/

2️⃣ systemd 限制

systemctl status mysql
journalctl -u mysql

四、快速自检清单 ✅

  • [ ] 慢查询日志是否开启
  • [ ] 是否有全表扫描
  • [ ] 连接数是否过多
  • [ ] buffer pool 是否合理
  • [ ] 是否暴露公网
  • [ ] 磁盘是否快满

如果你愿意,可以贴:

  • top 输出
  • SHOW PROCESSLIST;
  • my.cnf
  • 服务器内存大小

我可以 直接帮你定位是哪一类问题。

0 踩