在 2GB 内存的机器上编译 MySQL 8.0 是非常具有挑战性的,但并非完全不可能。MySQL 8.0 的源码编译对系统资源(尤其是内存)要求较高,在默认配置下通常建议至少 4GB 或更多内存,否则很容易出现:
- 编译过程因内存不足而被
OOM Killer终止 g++编译器占用大量内存导致系统卡死或崩溃- 链接阶段(linking)耗尽内存
✅ 是否可行?
可以尝试,但需要优化编译方式和环境配置,以降低内存使用。
?️ 在 2G 内存环境下成功编译 MySQL 8.0 的建议方案
1. 添加交换空间(Swap)
这是最关键的一步!2G 物理内存不够,必须添加足够的 Swap 空间来防止 OOM。
# 创建一个 2GB 的 swap 文件
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 查看 swap 是否启用
free -h
推荐总虚拟内存(RAM + Swap)≥ 4GB。即:2G RAM + 2G~4G Swap。
2. 使用轻量级构建选项(CMake 配置)
使用最小化编译选项,减少组件数量和优化级别。
cmake .
-DCMAKE_BUILD_TYPE=Release
-DWITH_BOOST=/tmp/boost
-DDOWNLOAD_BOOST=1
-DENABLED_PROFILING=OFF
-DENABLE_DEBUG_SYNC=OFF
-DMYSQL_MAINTAINER_MODE=OFF
-DWITH_UNIT_TESTS=OFF
-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1
-DWITHOUT_BLACKHOLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_INNOBASE_MEMCACHE=1
-DWITHOUT_PERF_SCHEMA=1
-DWITHOUT_MRG_MYISAM=1
-DWITHOUT_NDBCLUSTER=1
-DWITH_SSL=bundled
-DWITH_ZLIB=bundled
-DCMAKE_C_FLAGS="-O2 -g0"
-DCMAKE_CXX_FLAGS="-O2 -g0"
关键点:
-g0:不生成调试符号,节省内存和磁盘空间-O2而非-O3:避免高优化带来的内存暴涨- 移除不需要的存储引擎和功能
- 不编译单元测试
3. 减少并行编译线程数
不要使用 -j$(nproc),这会瞬间耗尽内存。
推荐使用单线程或双线程编译:
make -j1 # 最安全,内存最少
# 或
make -j2 # 如果你有 swap 且想快一点
⚠️ 使用
-j4或更高几乎必然导致 OOM。
4. 增加系统限制
确保没有 ulimit 限制影响编译:
ulimit -u 65535
ulimit -d unlimited
ulimit -v unlimited
5. 使用更轻的发行版或容器环境
- 使用最小化安装的 Ubuntu Server、Debian 等
- 关闭不必要的服务(如 GUI、systemd-units)
- 使用 Docker 构建时分配足够 swap
6. 监控内存使用
实时监控内存和 swap 使用情况:
watch -n 1 'free -h && echo "---" && ps aux --sort=-%mem | head -10'
一旦发现内存紧张,立即终止编译。
? 其他建议
| 建议 | 说明 |
|---|---|
| 使用 SSD | 提升 swap 性能,减少 I/O 卡顿 |
| 编译前清理内存 | 关闭其他应用,释放缓存 echo 3 > /proc/sys/vm/drop_caches |
| 分阶段编译 | 先 make mysql_server,再逐步构建其他模块 |
| 考虑预编译包 | 若非必须自定义编译,建议用官方二进制包或系统仓库安装 |
❌ 不推荐的做法
- 在无 Swap 的 2G 内存机器上直接
cmake && make -j4 - 开启调试模式(
-DDEBUG=ON)或 Profiling - 编译所有插件和测试用例
✅ 成功案例参考
一些用户在 2G RAM + 4G Swap 的 VPS 上成功编译了 MySQL 8.0,耗时约 30~60 分钟,关键就是:
- 启用足够 Swap
-j1编译- 精简 CMake 选项
✅ 替代方案(推荐)
如果你只是想运行 MySQL 8.0,而不是深度定制,建议:
# Ubuntu/Debian
sudo apt install mysql-server
# 或下载官方预编译二进制包
https://dev.mysql.com/downloads/mysql/
这些是已经编译好的,无需自己从源码构建。
总结
| 条件 | 是否可行 |
|---|---|
| 2G 内存 + 无 Swap | ❌ 极大概率失败 |
2G 内存 + 2G~4G Swap + 精简配置 + -j1 |
✅ 可行,但慢 |
| 2G 内存 + 高并行 + 默认配置 | ❌ 必崩 |
✅ 结论:
可以在 2G 内存 + 足够 Swap + 优化配置 + 低并行度 的条件下编译 MySQL 8.0,但过程缓慢且需耐心。如果不是必须定制,强烈建议使用官方预编译版本。
如需帮助写完整的编译脚本,也可以告诉我你的操作系统版本,我可以提供一键编译方案。
CDNK博客