在 2核2GB 内存的云服务器上部署 MySQL(建议使用 MySQL 8.0+),需极度谨慎优化内存占用,避免因内存不足导致 OOM Killer 杀进程、频繁 swap(严重拖慢性能)或服务崩溃。以下是针对该资源限制的生产可用(轻量级业务)推荐配置,兼顾稳定性与基本性能:
✅ 核心原则
- 总内存占用 ≤ 1.4GB(预留 600MB 给 OS、SSH、日志、突发负载等)
- 禁用非必要功能(如 Performance Schema、InnoDB 缓冲池过大、查询缓存等)
- 使用 SSD 云盘(必须!HDD 在此配置下几乎不可用)
🛠 推荐 my.cnf 配置(MySQL 8.0+,适用于 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld]
# 基础设置
port = 3306
bind-address = 127.0.0.1 # 生产环境务必绑定内网/localhost,禁用0.0.0.0(除非明确需要网络访问且已配安全组+强密码)
max_connections = 50 # 严格限制连接数(默认151太危险!2G内存扛不住)
table_open_cache = 200 # 减少表缓存开销
tmp_table_size = 32M
max_heap_table_size = 32M
sort_buffer_size = 256K # 每连接分配,避免累积过大
read_buffer_size = 128K
read_rnd_buffer_size = 256K
join_buffer_size = 256K
# InnoDB(核心!重点调优)
innodb_buffer_pool_size = 640M # ⚠️ 关键!占物理内存 ~32%(640MB),不可超过800MB
innodb_buffer_pool_instances = 1 # 小内存设为1,避免分片开销
innodb_log_file_size = 64M # 日志文件大小(需首次初始化后修改,见下方说明)
innodb_log_buffer_size = 2M
innodb_flush_log_at_trx_commit = 1 # 安全优先(=2 可提升性能但有丢数据风险,仅测试用)
innodb_flush_method = O_DIRECT # 避免双缓冲(Linux 下推荐)
innodb_io_capacity = 200
innodb_io_capacity_max = 400
# 禁用高内存消耗模块
skip_log_error = OFF # 保留错误日志(必要)
log_error = /var/log/mysql/error.log
slow_query_log = OFF # 如需分析,临时开启并设 long_query_time=2
log_queries_not_using_indexes = OFF
performance_schema = OFF # ⚠️ 必须关闭!默认开启会吃掉 200MB+ 内存
innodb_stats_on_metadata = OFF # 提速 information_schema 查询
# 其他安全/稳定项
wait_timeout = 300 # 空闲连接超时(秒)
interactive_timeout = 300
max_allowed_packet = 16M
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
# 可选:启用本地查询缓存(MySQL 8.0+ 已移除 query_cache,无需配置)
🔧 初始化与注意事项
-
首次启动前(若未初始化过):
mysqld --initialize --user=mysql --datadir=/var/lib/mysql记录生成的临时 root 密码(查看 error.log)。
-
修改
innodb_log_file_size(如需调整):- 停止 MySQL → 删除旧日志文件(
ib_logfile0,ib_logfile1)→ 修改配置 → 启动(MySQL 会自动重建)。 - ⚠️ 切勿直接覆盖运行中的日志文件!
- 停止 MySQL → 删除旧日志文件(
-
安全加固(必做):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '强密码'; DROP USER ''@'localhost'; -- 删除匿名用户 FLUSH PRIVILEGES; -
监控内存使用:
free -h # 总内存 & swap 使用 top -p $(pgrep mysqld) # 查看 mysqld 实际 RSS 内存 mysql -e "SHOW ENGINE INNODB STATUSG" | grep "Buffer pool"
📉 不推荐/禁止事项
| 项目 | 原因 |
|---|---|
innodb_buffer_pool_size > 800M |
极大概率触发 OOM,MySQL 被 kill |
max_connections > 80 |
每连接基础开销约 2–5MB,50 连接 ≈ 200MB+,超限即崩 |
开启 performance_schema |
MySQL 8.0 默认启用,必须显式 =OFF,否则内存暴涨 |
| 使用 MyISAM 引擎 | 不支持事务、崩溃恢复差,且 key_buffer_size 仍需额外内存 |
| 部署 WordPress 等 CMS 且未优化 | 默认插件/主题可能建大量小表+频繁查询,需配合 OPcache + Redis 缓存 |
✅ 替代建议(更稳妥的选择)
如果业务有增长预期或并发稍高(>20 QPS),强烈建议升级配置:
- 最低推荐:2核4GB(
innodb_buffer_pool_size = 1.5G,从容应对) - 云原生替代:使用阿里云 RDS MySQL(基础版 2核4G)、腾讯云 CynosDB(Serverless 模式按需计费),省去运维负担。
需要我帮你:
- ✅ 生成完整可复制的
my.cnf文件 - ✅ 写一键优化脚本(检测当前内存 + 自动配置)
- ✅ 针对 WordPress / Discuz / Laravel 等场景的专项调优
- ✅ 配置简易监控告警(如内存 >90% 自动重启 MySQL)
欢迎随时告诉我你的具体场景 👍
CLOUD技术博