腾讯云轻量应用服务器(Lighthouse)跑 MySQL 内存爆掉,是新手常踩的坑。尤其是你选了 1核2G 或 2核4G 这种入门配置,默认安装的 MySQL 8.0 对内存的要求其实有点“奢侈”。
别急着加钱升配,先按下面这套逻辑排查和优化,能省不少钱。
第一步:确认是不是真的“内存不够”
很多时候你以为内存不够,其实是 Swap 在救场,或者被其他进程占用了。
-
看实时状态
SSH 连上去,执行top或htop。- 关注
%MEM和RES列。 - 如果 MySQL (
mysqld) 占了大部分内存,且系统负载高,那是真不够。 - 如果内存快满了,但 CPU 使用率不高,可能是 Swap 频繁交换导致的卡顿。
- 关注
-
检查 Swap 分区
轻量服务器默认可能没开 Swap,或者开的很小。free -h如果 Swap 是 0B,建议手动创建一个。对于 2G 内存的机器,给 2G-4G 的 Swap 作为缓冲是非常必要的,虽然慢点,但至少不会直接 OOM (Out Of Memory) 崩溃。
创建 Swap 示例:
# 创建 2GB swap 文件 sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 写入 fstab 开机生效 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
第二步:MySQL 配置调优(核心手段)
MySQL 默认的 my.cnf 或 my.ini 是为大内存服务器设计的。在轻量服务器上,必须手动裁剪。
找到你的配置文件路径(通常是 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),重点修改以下参数:
1. 限制 InnoDB Buffer Pool(最关键)
这是 MySQL 吃内存的大户。默认可能设为物理内存的 50%-70%。
- 2G 内存服务器:设置为
384M到512M。 - 4G 内存服务器:设置为
1G到1.5G。
[mysqld]
innodb_buffer_pool_size = 384M
注意:不要设太小,否则查询性能会急剧下降;也不要太大,否则容易 OOM。
2. 调整 Key Buffer Size(仅针对 MyISAM)
如果你没用 MyISAM 引擎(现在基本都用 InnoDB),这个可以设小一点,比如 16M 或直接注释掉。
key_buffer_size = 16M
3. 连接线程相关参数
max_connections 别设太大,轻量服务器扛不住并发。默认 214 够用了,甚至改小点。
thread_cache_size 和 table_open_cache 也要相应减小。
max_connections = 100
thread_cache_size = 10
table_open_cache = 200
4. 临时表内存
tmp_table_size = 16M
max_heap_table_size = 16M
修改后重启 MySQL:
sudo systemctl restart mysqld
# 或者
sudo service mysql restart
第三步:优化数据库本身
有时候不是 MySQL 吃内存,而是你的 SQL 写法有问题。
-
开启慢查询日志
找出那些全表扫描、没有索引的烂 SQL。这些查询会占用大量临时表和排序空间,瞬间撑爆内存。slow_query_log = 1 long_query_time = 2 slow_query_log_file = /var/log/mysql/slow.log -
检查是否有大事务或未提交的事务
长时间不关闭的连接或事务会持有锁和内存。定期清理僵尸连接。 -
使用更轻量的数据库?(极端情况)
如果你的业务只是简单的博客、小型 CMS,数据量不大,考虑换用 MariaDB(配置更灵活)或者直接上 SQLite(单文件,无后台进程,极省资源)。但对于生产环境,还是推荐 MySQL/MariaDB。
第四步:云服务器层面的优化
-
关闭不必要的服务
轻量服务器通常只装了一个系统和几个必要服务。检查一下有没有运行 Redis、Nginx、Java 应用等。如果这些都在同一台机器上,它们会抢 MySQL 的内存。- 最佳实践:Web 应用和数据库分离。如果预算有限,至少把 Nginx/Apache 和 MySQL 分开部署在不同实例,或者确保 Web 端代码高效,减少数据库压力。
-
监控告警
在腾讯云控制台开启云监控,设置内存使用率超过 80% 时告警。这样你能知道什么时候该真正考虑升级了。
第五步:何时必须升级?
如果做了以上所有优化,内存依然经常飙到 95% 以上,且出现以下症状:
- 网站响应极慢,超时错误增多。
- MySQL 频繁重启。
- 业务增长确实需要更多并发处理能力。
这时候,别犹豫,直接升配。
- 方案 A:升级到更高规格的轻量服务器(如 2核4G 或 4核8G)。
- 方案 B:将数据库迁移到独立的 CDB(云数据库 MySQL)实例。轻量服务器的优势是便宜简单,劣势是资源隔离性差。一旦数据量上来,独立 CDB 的性能和稳定性远胜于在轻量服务器上硬扛。
总结
对于腾讯云轻量服务器:
- 必做:加 Swap 分区。
- 必做:修改
my.cnf,把innodb_buffer_pool_size降到 384M-512M(2G 内存机型)。 - 建议:优化慢 SQL,避免全表扫描。
- 底线:如果业务重要,别在轻量服务器上玩极限操作,早点上独立云数据库。
记住,轻量服务器适合“小而美”的项目,不适合“大而全”的高并发场景。合理配置 + 适度妥协 = 稳定运行。
云技术博客