Skip to content

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-dev

macOS 系统

bash
# 安装 Xcode Command Line Tools
xcode-select --install

# 使用 Homebrew 安装依赖
brew install cmake openssl zlib ncurses libaio

Windows 系统

  • 安装 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 start

macOS 系统

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 用户和组
  • 清理环境变量配置