外观
MySQL 源码编译安装
环境准备
系统要求
- 操作系统:支持 Linux、macOS 和 Windows(建议使用 Linux)
- 内存:至少 4GB RAM,推荐 8GB 以上
- 磁盘空间:至少 20GB 可用空间,用于源码、编译和安装
- CPU:至少 4 核 CPU,推荐 8 核以上
- 编译器:支持 GCC 7.3+、Clang 5.0+ 或 MSVC 2017+
依赖安装
Linux 系统(以 CentOS 7/8 为例)
bash
# CentOS 7
yum install -y gcc gcc-c++ cmake make ncurses-devel openssl-devel zlib-devel libcurl-devel libaio-devel
# CentOS 8
dnf install -y gcc gcc-c++ cmake make ncurses-devel openssl-devel zlib-devel libcurl-devel libaio-devel
# Ubuntu/Debian
apt-get update
apt-get install -y gcc g++ cmake make libncurses5-dev libssl-dev zlib1g-dev libcurl4-openssl-dev libaio-devmacOS 系统
bash
# 安装 Xcode Command Line Tools
xcode-select --install
# 使用 Homebrew 安装依赖
brew install cmake openssl zlib ncurses libaioWindows 系统
- 安装 Visual Studio 2017 或更高版本
- 安装 CMake
- 安装 Git
- 安装 Python 3.6+
源码获取
官方源码下载
- MySQL 官方网站:从 MySQL 官方网站下载源码包
- GitHub 仓库:克隆 MySQL GitHub 仓库
- 版本选择:选择稳定版本,推荐 LTS 版本
bash
# 从官方网站下载源码包(示例:MySQL 8.0.30)
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.30.tar.gz
# 解压源码包
tar -zxvf mysql-8.0.30.tar.gz
# 或从 GitHub 克隆
git clone https://github.com/mysql/mysql-server.git
cd mysql-server
git checkout 8.0.30源码目录结构
- cmake/:CMake 构建脚本
- sql/:SQL 解析器和优化器
- storage/:存储引擎实现(InnoDB、MyISAM 等)
- include/:头文件
- lib/:库文件
- client/:客户端工具
- docs/:文档
- tests/:测试代码
编译配置
CMake 配置选项
- CMAKE_INSTALL_PREFIX:安装目录
- MYSQL_DATADIR:数据目录
- SYSCONFDIR:配置文件目录
- WITH_BOOST:Boost 库路径(MySQL 8.0 必须)
- WITH_INNOBASE_STORAGE_ENGINE:启用 InnoDB 存储引擎
- WITH_MYISAM_STORAGE_ENGINE:启用 MyISAM 存储引擎
- WITH_ARCHIVE_STORAGE_ENGINE:启用 Archive 存储引擎
- WITH_BLACKHOLE_STORAGE_ENGINE:启用 Blackhole 存储引擎
- WITH_MEMORY_STORAGE_ENGINE:启用 Memory 存储引擎
- DOWNLOAD_BOOST:自动下载 Boost 库
- WITH_SSL:SSL 支持
- WITH_ZLIB:zlib 支持
- WITH_CURL:curl 支持
- ENABLE_DEBUG:启用调试模式
- ENABLE_PROFILING:启用性能分析
基本配置示例
bash
# 创建构建目录
mkdir -p build
cd build
# 基本配置(自动下载 Boost)
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_BOOST=boost \
-DDOWNLOAD_BOOST=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_CURL=system \
-DENABLED_LOCAL_INFILE=1 \
-DENABLE_DTRACE=0 \
-DCMAKE_BUILD_TYPE=Release
# 查看可用的构建目标
cmake --build . --target help高级配置示例
bash
# 启用所有存储引擎
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_BOOST=boost \
-DDOWNLOAD_BOOST=1 \
-DWITH_ALL_STORAGE_ENGINES=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_CURL=system \
-DENABLED_LOCAL_INFILE=1 \
-DENABLE_DTRACE=0 \
-DCMAKE_BUILD_TYPE=Release \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1
# 启用调试模式
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-debug \
-DMYSQL_DATADIR=/usr/local/mysql-debug/data \
-DSYSCONFDIR=/etc/mysql-debug \
-DWITH_BOOST=boost \
-DDOWNLOAD_BOOST=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DCMAKE_BUILD_TYPE=Debug \
-DENABLE_DEBUG=1 \
-DENABLE_PROFILING=1编译过程
执行编译
- 单线程编译:适用于资源有限的系统
- 多线程编译:推荐使用,提高编译速度
- 编译目标:默认构建所有目标
- 编译时间:根据系统配置,通常需要 30 分钟到 2 小时
bash
# 单线程编译
cmake --build .
# 或使用 make 命令(旧方式)
make
# 多线程编译(推荐,使用 8 个线程)
cmake --build . --parallel 8
# 或
make -j8
# 仅构建特定目标
cmake --build . --target mysqld
# 或
make -j8 mysqld编译常见问题处理
- Boost 库问题:确保 Boost 版本符合要求,或使用 DOWNLOAD_BOOST=1 自动下载
- 编译器错误:更新编译器版本,确保符合要求
- 依赖缺失:安装缺少的依赖包
- 内存不足:增加系统内存,或减少并行编译线程数
- 磁盘空间不足:清理磁盘空间,或使用更小的源码版本
安装过程
执行安装
bash
# 执行安装
cmake --build . --target install
# 或
make install
# 安装完成后,查看安装目录
ls -la /usr/local/mysql权限配置
- 创建 MySQL 用户和组:
- 设置安装目录权限:
- 设置数据目录权限:
bash
# 创建 MySQL 用户和组
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# 设置安装目录权限
chown -R mysql:mysql /usr/local/mysql
# 设置数据目录权限
mkdir -p /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql/data初始化数据库
- 初始化数据目录:
- 生成初始密码:
- 安全配置:
bash
# 进入安装目录
cd /usr/local/mysql
# 初始化数据库(生成随机密码)
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 初始化数据库(无密码)
bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 注意:初始化过程会生成临时密码,记录下来用于后续登录配置文件创建
- 默认配置文件:
- 基本配置示例:
- 配置文件位置:
bash
# 创建配置文件
cat > /etc/my.cnf << EOF
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /usr/local/mysql/data/mysql.pid
user = mysql
skip-name-resolve
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
log-error = /usr/local/mysql/data/error.log
[client]
socket = /tmp/mysql.sock
default-character-set = utf8mb4
EOF
# 设置配置文件权限
chmod 644 /etc/my.cnf启动脚本配置
Linux 系统
bash
# 复制启动脚本
cp support-files/mysql.server /etc/init.d/mysqld
# 设置启动脚本权限
chmod +x /etc/init.d/mysqld
# 添加到系统服务
# CentOS 7
systemctl enable mysqld
# 或
chkconfig --add mysqld
chkconfig mysqld on
# 启动 MySQL 服务
systemctl start mysqld
# 或
service mysqld startmacOS 系统
bash
# 创建 LaunchDaemon 配置文件
cat > /Library/LaunchDaemons/com.mysql.mysqld.plist << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.mysql.mysqld</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/mysql/bin/mysqld</string>
<string>--basedir=/usr/local/mysql</string>
<string>--datadir=/usr/local/mysql/data</string>
<string>--plugin-dir=/usr/local/mysql/lib/plugin</string>
<string>--log-error=/usr/local/mysql/data/error.log</string>
<string>--pid-file=/usr/local/mysql/data/mysql.pid</string>
<string>--socket=/tmp/mysql.sock</string>
<string>--port=3306</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>UserName</key>
<string>mysql</string>
<key>WorkingDirectory</key>
<string>/usr/local/mysql</string>
<key>StandardErrorPath</key>
<string>/usr/local/mysql/data/error.log</string>
</dict>
</plist>
EOF
# 加载并启动服务
launchctl load -w /Library/LaunchDaemons/com.mysql.mysqld.plist验证安装
服务状态检查
bash
# 检查服务状态
# Linux
systemctl status mysqld
# 或
service mysqld status
# macOS
launchctl list | grep mysql连接测试
bash
# 连接 MySQL 服务器
mysql -u root -p -S /tmp/mysql.sock
# 或使用 TCP 连接
mysql -u root -p -h 127.0.0.1
# 查看版本信息
mysql> SELECT version();
# 查看存储引擎
mysql> SHOW ENGINES;
# 查看变量信息
mysql> SHOW VARIABLES LIKE 'basedir';
mysql> SHOW VARIABLES LIKE 'datadir';安全配置
bash
# 运行安全脚本
mysql_secure_installation
# 安全脚本会提示:
# 1. 设置 root 密码
# 2. 删除匿名用户
# 3. 禁止 root 远程登录
# 4. 删除测试数据库
# 5. 刷新权限表环境变量配置
- 添加 MySQL 到 PATH:
- 配置 MYSQL_HOME:
- 使配置生效:
bash
# 编辑 /etc/profile 文件
cat >> /etc/profile << EOF
# MySQL 环境变量
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
EOF
# 使配置生效
source /etc/profile
# 验证环境变量
echo $MYSQL_HOME
echo $PATH
which mysql升级和卸载
升级 MySQL
bash
# 停止 MySQL 服务
systemctl stop mysqld
# 备份数据和配置文件
cp -r /usr/local/mysql/data /usr/local/mysql/data_backup
scp /etc/my.cnf /etc/my.cnf_backup
# 下载新版本源码
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.31.tar.gz
tar -zxvf mysql-8.0.31.tar.gz
# 编译安装新版本(使用相同的配置选项)
cd mysql-8.0.31
mkdir -p build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_BOOST=boost \
-DDOWNLOAD_BOOST=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1
make -j8
make install
# 运行升级脚本
mysql_upgrade -u root -p
# 启动 MySQL 服务
systemctl start mysqld卸载 MySQL
bash
# 停止 MySQL 服务
systemctl stop mysqld
# 删除启动脚本
# Linux
rm -f /etc/init.d/mysqld
systemctl disable mysqld
# macOS
launchctl unload -w /Library/LaunchDaemons/com.mysql.mysqld.plist
rm -f /Library/LaunchDaemons/com.mysql.mysqld.plist
# 删除配置文件
rm -f /etc/my.cnf
# 删除安装目录
rm -rf /usr/local/mysql
# 删除数据目录
rm -rf /usr/local/mysql/data
# 删除 MySQL 用户和组
userdel mysql
groupdel mysql
# 删除环境变量配置
# 编辑 /etc/profile 文件,删除 MySQL 相关配置常见问题处理
初始化失败
- 权限问题:确保数据目录权限正确,属于 mysql 用户
- 配置错误:检查配置文件中的路径和参数
- 日志查看:查看错误日志,定位具体问题
启动失败
- 端口被占用:检查 3306 端口是否被占用
- 配置错误:检查配置文件
- 权限问题:检查文件和目录权限
- 日志查看:查看错误日志
连接失败
- 服务未启动:启动 MySQL 服务
- Socket 文件错误:检查 socket 文件路径和权限
- 密码错误:使用正确的密码登录
- 权限问题:检查用户权限
性能问题
- 编译优化:使用 Release 模式编译,启用适当的优化选项
- 配置调整:根据系统资源调整配置参数
- 索引优化:优化表结构和索引
- 查询优化:优化 SQL 语句
最佳实践
编译选项建议
- 使用 Release 模式:生产环境建议使用 Release 模式,提高性能
- 启用必要的存储引擎:只启用需要的存储引擎,减少内存占用
- 使用系统 SSL:使用系统提供的 SSL 库,便于更新和维护
- 启用性能模式:便于性能监控和分析
- 禁用不必要的功能:如 DTrace、调试模式等
安装配置建议
- 独立的 MySQL 用户:使用专门的 MySQL 用户运行服务,提高安全性
- 合理的目录结构:将源码、编译和安装目录分离
- 定期备份:定期备份数据和配置文件
- 安全配置:运行 mysql_secure_installation 脚本,加强安全性
- 监控配置:配置监控,及时发现问题
升级建议
- 备份数据:升级前务必备份数据和配置文件
- 测试环境验证:在测试环境中验证升级过程
- 逐步升级:跨版本升级时,建议逐步升级,避免直接跨多个大版本
- 运行升级脚本:升级后务必运行 mysql_upgrade 脚本
常见问题(FAQ)
Q1: 为什么要选择源码编译安装 MySQL?
A1: 源码编译安装可以:
- 自定义编译选项,优化性能
- 选择特定版本和功能
- 适应特殊的硬件和操作系统环境
- 方便调试和定制
- 学习 MySQL 内部结构
Q2: 编译 MySQL 需要多长时间?
A2: 编译时间取决于系统配置,通常需要 30 分钟到 2 小时。使用多线程编译可以显著提高速度,建议使用 -j8 或根据 CPU 核心数调整。
Q3: 如何选择 MySQL 版本?
A3: 建议选择稳定版本或 LTS 版本,如 MySQL 8.0.x。根据业务需求和兼容性要求选择具体版本。
Q4: 编译时遇到 Boost 库问题怎么办?
A4: 可以使用 -DDOWNLOAD_BOOST=1 选项,让 CMake 自动下载适合的 Boost 库版本。
Q5: 如何优化编译配置?
A5: 根据实际需求调整编译选项,如:
- 使用 Release 模式
- 只启用必要的存储引擎
- 启用系统 SSL 和 zlib
- 禁用不必要的功能
Q6: 如何配置 MySQL 开机自启?
A6: 根据操作系统不同,可以:
- Linux:使用 systemctl 或 service 命令配置
- macOS:使用 launchctl 命令配置
- Windows:使用服务管理器配置
Q7: 如何验证 MySQL 安装成功?
A7: 可以通过以下方式验证:
- 检查服务状态
- 连接 MySQL 服务器
- 执行简单查询
- 查看版本信息
Q8: 如何升级源码编译的 MySQL?
A8: 升级步骤包括:
- 备份数据和配置文件
- 停止 MySQL 服务
- 编译安装新版本
- 运行升级脚本
- 启动服务并验证
Q9: 编译安装的 MySQL 与二进制安装有什么区别?
A9: 主要区别:
- 源码编译可以自定义配置,二进制安装使用默认配置
- 源码编译支持特定硬件优化,二进制安装是通用版本
- 源码编译需要较长时间,二进制安装快速简单
- 源码编译便于调试和定制,二进制安装适合快速部署
Q10: 如何卸载源码编译的 MySQL?
A10: 卸载步骤包括:
- 停止 MySQL 服务
- 删除启动脚本和配置文件
- 删除安装目录和数据目录
- 删除 MySQL 用户和组
- 清理环境变量配置
