对于 4核 CPU、4GB 内存 的 Linux 服务器,安装 MySQL(以目前主流的 MySQL 8.0 为例)时,核心原则是:保守配置,优先保证稳定性,避免 OOM(内存溢出)。
⚠️ 重要前提:
- 如果服务器还运行其他服务(如 Nginx、Redis、Java 应用等),需预留至少 1–2GB 内存给它们。
- 以下配置假设 MySQL 是服务器上唯一或主要的大型服务。
- 所有参数需在
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf中修改,并重启 MySQL 生效。
✅ 推荐基础配置(my.cnf)
[mysqld]
# ========================
# 基本设置
# ========================
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
# ========================
# 内存相关关键参数(核心!)
# ========================
# InnoDB 缓冲池大小:建议为物理内存的 50%~70%,但留足余量
innodb_buffer_pool_size = 2G # 最大不超过 2.5G,避免系统崩溃
# InnoDB 日志文件大小:每个文件 256MB~512MB,总大小约为 buffer_pool 的 25%
innodb_log_file_size = 256M # 两个文件,共 512MB
# InnoDB 自适应哈希索引、刷新策略等优化
innodb_flush_method = O_DIRECT
innodb_log_buffer_size = 16M
innodb_buffer_pool_instances = 4 # 多核下可设为 4,提升并发性能
# ========================
# 连接与线程
# ========================
max_connections = 200 # 根据实际并发调整,默认 151 可稍增
thread_cache_size = 8 # 缓存线程数,减少创建开销
# ========================
# 查询缓存(MySQL 8.0 已移除 query_cache_type,忽略)
# ========================
# ========================
# 字符集与时区
# ========================
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
time_zone = '+08:00' # 中国时区
# ========================
# 安全与日志
# ========================
log_error = /var/log/mysql/error.log
slow_query_log = 1
long_query_time = 2
slow_query_log_file = /var/log/mysql/slow.log
# 禁用符号链接(安全加固)
symbolic-links = 0
🔍 参数详解与调优建议
| 参数 | 推荐值 | 说明 |
|---|---|---|
innodb_buffer_pool_size |
2G | 最关键参数。4GB 内存中,OS + 其他进程需占 ~1.5GB,剩余最多给 MySQL ~2.5GB,保守取 2G。 |
innodb_log_file_size |
256M | 日志越大,写入性能越好,但恢复时间越长。256M×2=512MB 适合中等负载。 |
innodb_buffer_pool_instances |
4 | 与 CPU 核数一致,减少锁竞争,提升多线程并发性能。 |
max_connections |
200 | 若 QPS 不高,无需设太高。可通过 SHOW STATUS LIKE 'Threads_connected'; 监控实际使用。 |
thread_cache_size |
8 | 合理缓存线程,减少上下文切换开销。 |
tmpdir |
/tmp |
确保 tmpfs 挂载有足够空间(建议 ≥1GB)。 |
📊 性能监控与后续调优步骤
-
启动后检查是否成功加载配置:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW VARIABLES LIKE 'max_connections'; -
监控关键指标:
-- 查看当前连接数 SHOW STATUS LIKE 'Threads_connected'; -- 查看缓冲池命中率(理想 > 99%) SHOW STATUS LIKE 'Innodb_buffer_pool_read_requests'; SHOW STATUS LIKE 'Innodb_buffer_pool_reads'; -- 查看慢查询 tail -f /var/log/mysql/slow.log -
动态调整(无需重启):
SET GLOBAL max_connections = 300; -- 注意:buffer_pool_size 不能动态调整,需重启
⚠️ 注意事项
- 不要过度分配内存:若
innodb_buffer_pool_size超过 2.5GB,可能导致系统 OOM,MySQL 被内核杀死。 - SSD 硬盘:强烈建议使用 SSD,显著提升 IOPS,对 MySQL 性能影响巨大。
- 关闭不必要的服务:如未使用,禁用
query_cache(MySQL 8.0 已移除)、performance_schema可选关闭以节省资源。 - 定期清理二进制日志:
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
🔄 如果服务器还运行其他服务?
| 服务 | 建议预留内存 |
|---|---|
| Nginx + PHP-FPM | 512MB ~ 1GB |
| Redis | 512MB+ |
| Java 应用(如 Spring Boot) | 1GB+ |
| MySQL 单独使用 | 可给 2.5GB |
👉 通用公式:
innodb_buffer_pool_size ≤ (总内存 - OS保留1GB - 其他服务内存) × 0.7
例如:若还有 Java 应用占用 1.5GB,则 MySQL 最多可用:
(4 - 1 - 1.5) × 0.7 ≈ 0.35GB → 不合理,应降低 Java 内存或升级服务器
✅ 总结
对于 4C4G 服务器,最稳妥且高性能的配置是:
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_buffer_pool_instances = 4
max_connections = 200
此配置在大多数中小型网站、API 服务、后台系统中表现良好,兼顾性能与稳定性。如有高并发场景,建议升级至 8C8G 或更高配置。
云服务器