在 1 核 2G 的服务器上运行 MySQL 8.0,核心思路是限制内存占用、减少并发连接、关闭非必要功能。以下是针对 CentOS/Ubuntu 的精简配置方案:
一、系统层面优化(通用)
# 关闭 Swap(避免频繁交换导致卡顿,仅当物理内存充足时建议开启,否则可保留小 swap)
sudo swapoff -a
# 若必须使用 swap,限制为最小值
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
二、MySQL 配置文件精简(/etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld]
# 基础设置
basedir=/usr
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
user=mysql
log-error=/var/log/mysqld.log
# 字符集(推荐 utf8mb4,但避免过大的索引)
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 关键性能参数(适配 1C2G)
max_connections = 50 # 默认 151,大幅降低
innodb_buffer_pool_size = 256M # 占物理内存约 12%,避免 OOM
innodb_log_file_size = 64M # 减小日志文件大小
innodb_flush_log_at_trx_commit = 2 # 牺牲少量持久性换取速度(生产环境慎用)
query_cache_size = 0 # MySQL 8.0 已废弃查询缓存,必须设为 0
tmp_table_size = 32M
max_heap_table_size = 32M
thread_cache_size = 16
table_open_cache = 200
sort_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
join_buffer_size = 256K
# 禁用不必要功能
skip-name-resolve # 禁用 DNS 反向解析,提升连接速度
skip-symbolic-links # 禁用符号链接
local-infile = 0 # 禁用本地文件导入(安全加固)
# 日志策略(生产环境需调整)
slow_query_log = 1
long_query_time = 2
log_output = FILE
general_log = 0 # 一般日志关闭,除非调试
# 其他
sync_binlog = 1 # 保证主从同步安全
innodb_flush_method = O_DIRECT # 避免双重缓冲
✅ 注意:
innodb_buffer_pool_size不要超过 512M(留空间给 OS 和其他进程)max_connections根据实际业务调整,Web 应用通常 30~50 足够- 若为纯读场景,可考虑只读实例;写多读少则优先调优连接池
三、启动与验证
# 重启服务
sudo systemctl restart mysql # Ubuntu
# 或
sudo systemctl restart mysqld # CentOS 7+
# 检查关键参数
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';"
四、额外建议
- 定期清理慢查询:分析
/var/log/slow-query.log优化 SQL。 - 监控资源:安装
htop或glances实时观察内存/CPU。 - 备份策略:使用
mysqldump --single-transaction避免锁表。 - 考虑替代方案:若负载持续较高,可尝试:
- 降级到 MariaDB 10.6(更轻量)
- 使用 SQLite(单文件、无网络开销)
- 迁移至云数据库(如 AWS RDS t3.micro)
通过以上配置,MySQL 8.0 可在 1C2G 环境下稳定运行中小型应用(如博客、CMS、API 后端)。若出现 OOM,优先检查 innodb_buffer_pool_size 和 max_connections。
CLOUD技术笔记