在 1核2G 内存的 Linux 服务器上部署 MySQL 8,由于资源有限,必须进行合理的参数优化,以避免内存耗尽、性能下降或服务崩溃。以下是关键的配置建议和 my.cnf(或 mysqld.cnf)中的推荐参数。
✅ 一、基本原则
- 控制内存使用总量:确保 MySQL 使用的内存不超过 1.2GB,给操作系统和其他进程留出空间。
- 简化功能:关闭不必要的特性(如查询缓存、大缓冲池)。
- 避免 swap 频繁使用:swap 会严重降低性能。
✅ 二、推荐的 my.cnf 配置
[mysqld]
# 基础设置
port = 3306
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
pid-file = /var/run/mysqld/mysqld.pid
# --- 内存与缓存优化 ---
# 总内存控制目标:约 1GB ~ 1.2GB
# InnoDB 缓冲池(最重要)
innodb_buffer_pool_size = 512M
# 在小内存机器上,可设为物理内存的 40%~50%
# InnoDB 日志文件大小(建议为 buffer pool 的 25% 左右)
innodb_log_file_size = 128M
innodb_log_buffer_size = 16M
# 表定义缓存(适当减小)
table_open_cache = 200
table_definition_cache = 400
open_files_limit = 1000
# 排序与连接缓冲(每个连接临时使用,不能太大)
sort_buffer_size = 64K
join_buffer_size = 64K
read_buffer_size = 64K
read_rnd_buffer_size = 256K
# 每个线程的栈大小(默认一般为 256K,可略降)
thread_stack = 192K
# 临时表限制
tmp_table_size = 32M
max_heap_table_size = 32M
# 连接相关
max_connections = 50 # 避免过多连接耗尽内存
wait_timeout = 60 # 非交互连接超时(秒)
interactive_timeout = 60 # 交互连接超时
max_connect_errors = 100000
# --- 性能与日志 ---
# 关闭查询缓存(MySQL 8 默认已禁用,但显式声明)
query_cache_type = 0
query_cache_size = 0
# 慢查询日志(可选开启用于调试)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 二进制日志(根据是否需要主从复制决定)
# log-bin = mysql-bin
# server-id = 1
# 错误日志级别
log_error_verbosity = 2
# --- InnoDB 特性优化 ---
# 禁用大型预读等高级特性
innodb_flush_log_at_trx_commit = 1 # 安全优先(生产),若追求速度可设为 2
sync_binlog = 1 # 保证一致性
# 调整 IO 并发数(小机器降低)
innodb_io_capacity = 200
innodb_io_capacity_max = 400
# 后台线程数减少
innodb_read_io_threads = 2
innodb_write_io_threads = 2
# 清理线程
innodb_purge_threads = 1
innodb_page_cleaners = 1
# 禁用不必要特性(节省内存)
innodb_adaptive_hash_index = OFF # 小数据量下收益低,反而占内存
innodb_stats_on_metadata = OFF # 提升 information_schema 查询性能
# --- 安全与兼容 ---
# 取消符号链接(安全)
symbolic-links = 0
# 默认存储引擎
default_storage_engine = InnoDB
# 字符集(建议 UTF8MB4)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
✅ 三、系统级优化建议
1. 文件句柄限制
编辑 /etc/security/limits.conf:
mysql soft nofile 65535
mysql hard nofile 65535
2. Swap 使用控制
虽然有 2G 内存,但建议保留少量 swap(如 1G),并调整 swappiness:
# 临时设置
sudo sysctl vm.swappiness=10
# 永久设置(写入 /etc/sysctl.conf)
vm.swappiness=10
3. 监控工具
安装基础监控:
htop, iotop, mysqladmin, 或 Prometheus + Node Exporter
✅ 四、注意事项
| 项目 | 建议 |
|---|---|
| 不要启用 | Performance Schema(除非调试)、Query Cache、大 buffer |
| 定期维护 | 清理慢日志、备份、检查表状态 |
| 连接管理 | 应用层使用连接池,避免短连接频繁创建 |
| 数据库规模 | 适合轻量应用(< 10GB 数据),不适合大数据或高并发 |
✅ 五、验证配置生效
重启 MySQL 后检查关键参数:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
检查错误日志是否有警告:
tail -f /var/log/mysql/error.log
✅ 六、总结
对于 1核2G 的 MySQL 8 实例,核心是:
- 控制
innodb_buffer_pool_size在 512M 左右 - 减少 per-thread buffers(避免连接多时 OOM)
- 关闭非必要功能(如 query cache、adaptive hash index)
- 设置合理的连接数和超时时间
- 监控内存和连接使用情况
⚠️ 如果你的应用访问量较大,建议尽早考虑升级配置或引入 Redis 缓存减轻数据库压力。
如有具体应用场景(如 WordPress、API 后端等),可进一步针对性调优。
CLOUD技术博