在 1GB 内存的服务器上,强烈不建议安装 MySQL 8.0(官方默认配置),因为其最小推荐内存为 2GB,且默认配置下极易触发 OOM(内存溢出)导致服务崩溃。
针对 1GB 内存环境,以下是按优先级推荐的方案及优化建议:
1. 首选推荐:MySQL 5.7(经过严格调优)
虽然 MySQL 5.7 也已停止官方支持(EOL),但在资源受限的旧硬件上,它比 8.0 更轻量。
- 理由:相比 8.0,5.7 的默认内存占用更低,架构相对成熟,社区有大量针对低配服务器的调优模板。
- 关键限制:必须手动修改配置文件
my.cnf,严禁使用默认值。
2. 次选推荐:MariaDB 10.3 或 10.6
MariaDB 是 MySQL 的一个分支,通常被认为在相同负载下内存占用略低于 MySQL。
- 理由:对低内存环境的兼容性更好,插件机制灵活,可以禁用不必要的功能模块以进一步节省内存。
- 注意:如果是新业务,建议优先考虑 MariaDB 10.6(较新版本),但需确认应用兼容性。
3. 终极轻量方案:SQLite(如果适用)
如果你的应用场景是单用户、读写不频繁、不需要高并发连接(如个人博客、小型内部工具、定时任务后台)。
- 理由:SQLite 不需要独立的服务器进程,直接嵌入在应用中运行,内存占用极低(几 MB 级别)。
- 缺点:不支持多用户并发写入,不适合 Web 高并发场景。
⚠️ 核心操作:必须进行的内存优化
无论选择哪个版本,在 1GB 服务器上必须执行以下配置修改,否则无法稳定运行:
1. 关闭 Swap(虚拟内存)
Swap 会严重拖慢数据库性能,且可能导致数据不一致。
# 临时关闭
swapoff -a
# 永久关闭(编辑 /etc/fstab,注释掉 swap 行)
2. 调整 my.cnf (或 mariadb.cnf) 配置
这是最关键的一步。你需要将以下参数写入 /etc/my.cnf 的 [mysqld] 部分:
[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
lc-messages-dir = /usr/share/mysql
# --- 核心内存优化参数 ---
# 最大允许连接数(默认 151,1GB 内存建议设为 20-30)
max_connections = 20
# 共享内存缓冲区(InnoDB 核心)
innodb_buffer_pool_size = 128M
# 解释:1GB 总内存,操作系统 + 其他进程至少留 400MB,留给 InnoDB 最多 400-500MB,保守起见设为 128M-256M
# 日志缓冲区
innodb_log_file_size = 32M
# 线程缓存(减少创建线程开销)thread_cache_size = 5
# 查询缓存(MySQL 5.7 中建议关闭,因为维护成本高;MariaDB 可开启但需谨慎)
query_cache_type = 0
query_cache_size = 0
# 临时表大小(避免产生磁盘临时表)
tmp_table_size = 32M
max_heap_table_size = 32M
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 其他安全与性能设置
skip-name-resolve = 1 # 禁止 DNS 反向解析,加快连接速度
slow_query_log = 1
long_query_time = 2
3. 启动与监控
- 启动后使用
free -h和top观察内存。 - 确保
available内存不要长期低于 100MB。 - 如果依然不稳定,考虑将
innodb_buffer_pool_size降至 64M。
总结建议
| 需求场景 | 推荐方案 | 备注 |
|---|---|---|
| Web 应用/高并发 | MariaDB 10.6 (调优版) | 性能最好,兼容性佳 |
| 遗留系统/兼容旧代码 | MySQL 5.7 (深度调优) | 必须大幅降低 Buffer Pool |
| 单机小工具/低频访问 | SQLite | 零配置,最省资源 |
| 绝对避免 | MySQL 8.0 | 除非有 2GB+ 内存,否则必崩 |
特别提醒:1GB 内存非常紧张,除了数据库,请务必同时限制 PHP/Node.js/Java 等应用进程的内存上限(例如 PHP-FPM 的 pm.max_children 设置为 2-4),防止应用把数据库内存挤爆。
云知识