首页 /mysql

MySQL 版本8.4.0源码编译教程

一、前置依赖安装(Ubuntu 24.04)

sudo apt update && sudo apt full-upgrade -y
# 必装:编译工具链 + CMake(>=3.25!MySQL 8.4 要求高)
sudo apt install -y \
    build-essential \
    cmake ninja-build \
    g++ gcc libssl-dev libsasl2-dev \
    zlib1g-dev liblz4-dev libzstd-dev \
    libcurl4-openssl-dev libedit-dev \
    libnuma-dev libjemalloc-dev \
    pkg-config bison flex \
    git wget curl

# ✅ 验证版本(关键!)
cmake --version  # 必须 ≥ 3.25(若旧,见下方升级方法)
gcc --version    # 推荐 ≥ 12(Ubuntu 24.04 默认 GCC 13.2,OK)

若 CMake < 3.25(如 Ubuntu 22.04)?升级它:

cd /tmp && wget https://github.com/Kitware/CMake/releases/download/v3.29.2/cmake-3.29.2-linux-x86_64.sh
sudo sh cmake-3.29.2-linux-x86_64.sh --prefix=/usr/local --exclude-subdir
export PATH="/usr/local/bin:$PATH"
echo 'export PATH="/usr/local/bin:$PATH"' | sudo tee -a /etc/profile.d/cmake.sh
source /etc/profile.d/cmake.sh
cmake --version  # 应输出 3.29.2

二、获取 MySQL 源码(官方 GitHub,非 tarball)

下载 MySQL 官方已将源码迁至 https://github.com/mysql/mysql-server,不再维护 Launchpad 或旧 SVN。

# 创建工作目录(建议 SSD)
mkdir -p ~/mysql-src && cd ~/mysql-src

# 克隆(推荐 v8.4.0 tag,稳定版;也可用 main 分支,但可能不稳定)
git clone --branch mysql-8.4.0 --depth 1 https://github.com/mysql/mysql-server.git .
# ✅ 提示:--depth 1 加速克隆(无历史记录),约 300MB

# 查看当前分支 & 提交
git describe --tags  # 输出类似:mysql-8.4.0-rc

三、配置 CMake(关键!决定功能开关)

✅ 强烈建议使用 Ninja 构建(比 make 快 2–3 倍,内存占用低)

✅ 所有选项以 -D 开头;-DBUILD_C 启用官方发布配置(推荐新手)

# 创建构建目录(与源码分离,干净可删)
mkdir build && cd build

# ✅ 执行 CMake 配置(一行命令,已优化,含安全加固)
cmake .. -G Ninja \
  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
  -DBUILD_C \
  -DWITH_SSL=system \
  -DWITH_ZLIB=system \
  -DWITH_LZ4=system \
  -DWITH_ZSTD=system \
  -DWITH_LIBEDIT=system \
  -DWITH_SYSTEMD=ON \
  -DINSTALL_SYSC \
  -DINSTALL_PREFIX=/usr/local/mysql \
  -DMYSQL_DATADIR=/usr/local/mysql/data \
  -DDEFAULT_CHARSET=utf8mb4 \
  -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci \
  -DENABLE_DOWNLOADS=OFF \
  -DENABLED_LOCAL_INFILE=ON \
  -DWITH_JEMALLOC=ON \
  -DWITH_NUMA=ON \
  -DWITH_ICU=system \
  -DWITH_UNIT_TESTS=OFF \  # 关闭测试(节省 30+ 分钟编译时间)
  -DWITH_BOOST=../boost

# ✅ 验证配置是否成功(必须看到 "Build files have been written")
# 若报错,常见原因见文末【避坑清单】

🔑 关键选项说明:
|选项| 含义 | 推荐值|
| - | - | - |
| -DWITH_SSL=system | 使用系统 OpenSSL(Ubuntu 24.04 自带 3.0+,支持 TLS 1.3)| ✅ 更安全、免编译 Boost.SSL|
|-DWITH_SYSTEMD=ON |生成 mysqld.service,支持 systemctl start mysql |✅ 必开
|-DINSTALL_PREFIX |安装路径(不影响运行时数据目录) |/usr/local/mysql(标准)
|-DMYSQL_DATADIR |数据库存放路径(可独立挂载 SSD) |/usr/local/mysql/data
|-DWITH_JEMALLOC=ON |启用 jemalloc 内存分配器(提升高并发性能)| ✅ 推荐

🌟 进阶:如需 静态链接 OpenSSL/Boost(满足 FIPS 或离线部署),可改用 -DWITH_SSL=bundled + -DWITH_BOOST=../boost(需先下载 boost)。
四、编译与安装(耐心等待 ~15–30 分钟)

bash

1. 并行编译(-j$(nproc) 表示用满 CPU 核心)

ninja -j$(nproc)
# ✅ 成功标志:最后几行显示:
# [100%] Built target mysqld
# [100%] Built target mysql_client_test
# 2. 安装(需要 root 权限)
sudo ninja install
# 3. 验证二进制文件
/usr/local/mysql/bin/mysqld --version
# 输出:mysqld  Ver 8.4.0 for Linux on x86_64 (MySQL Community Server - GPL)

✅ 此时 MySQL 已安装到 /usr/local/mysql/,但尚未初始化数据库、未启动服务。

🛠 五、初始化数据目录 & 启动服务

✅ Step 1:创建数据目录并赋权

sudo mkdir -p /usr/local/mysql/data
sudo chown -R mysql:mysql /usr/local/mysql
sudo chmod -R 755 /usr/local/mysql

✅ Step 2:初始化系统数据库(生成 root 密码)

# 初始化(会自动生成临时 root 密码,记下来!)
sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data
# 查看临时密码(在 error log 中,路径由 --log-error 指定;默认在 data/ 目录下)
sudo grep 'temporary password' /usr/local/mysql/data/*.err
# 示例输出:A temporary password is generated for root@localhost: SxKtYv9!aBcD

✅ Step 3:启用 systemd 服务(自动管理)

# 复制 service 文件(CMake 已生成)
sudo cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /etc/systemd/system/
sudo systemctl daemon-reload
# 启动并设开机自启
sudo systemctl enable mysqld
sudo systemctl start mysqld
# 检查状态

sudo systemctl status mysqld

# ✅ 必须显示 active (running),且无 failed

✅ Step 4:首次登录并修改密码

# 登录(用上一步的临时密码)
sudo /usr/local/mysql/bin/mysql -u root -p
# 在 MySQL shell 中执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass123!';
FLUSH PRIVILEGES;
EXIT;


# ✅ 测试本地连接

/usr/local/mysql/bin/mysql -u root -p -e "SELECT VERSION(), @@hostname;"

🧪 六、验证功能完整性(关键!)

运行以下命令确认核心功能就绪:

# 1. SSL 是否启用
/usr/local/mysql/bin/mysql -u root -p -e "SHOW VARIABLES LIKE 'have_ssl';"  # 应为 YES
# 2. InnoDB 引擎是否可用
/usr/local/mysql/bin/mysql -u root -p -e "SHOW ENGINES;" | grep InnoDB
# 3. JSON、窗口函数、CTE 是否支持
/usr/local/mysql/bin/mysql -u root -p -e "
SELECT JSON_OBJECT('key', 'value') AS json,
       ROW_NUMBER() OVER() AS rn,
       (WITH t AS (SELECT 1) SELECT * FROM t) AS cte;
"
# 4. systemd 服务是否可管理
sudo systemctl is-active mysqld      # 应返回 "active"
sudo systemctl is-enabled mysqld     # 应返回 "enabled"
✅ 全部通过 → 源码构建成功!

运行时极致调优(my.cnf 生产级模板)

[mysqld]
# === 基础身份与路径 ===
user                            = mysql
basedir                         = /usr/local/mysql-optimized
datadir                         = /var/lib/mysql-optimized
socket                          = /var/run/mysqld/mysqld.sock
pid-file                        = /var/run/mysqld/mysqld.pid
port                            = 3306

# === 安全加固 ===
default_authenticati
require_secure_transport        = ON
ssl_mode                        = REQUIRED
tls_version                     = TLSv1.3
skip_show_database              = ON
local_infile                    = OFF
secure_file_priv                = /var/lib/mysql-files/

# === 连接与网络 ===
max_c
wait_timeout                    = 300
interactive_timeout             = 300
c
max_c
skip_name_resolve               = ON  # ✅ 关键!禁用 DNS 反查(防连接卡顿)

# === InnoDB(核心引擎)===
innodb_buffer_pool_size         = 24G      # ≈ 75% 物理内存(32G 机器)
innodb_buffer_pool_instances    = 8        # ≥ 8,避免 mutex 争用
innodb_log_file_size            = 2G       # ≥ 1G,减少 checkpoint 频率
innodb_log_buffer_size          = 64M
innodb_flush_log_at_trx_commit  = 1        # 强一致性(如需更高性能可设 2,但丢事务风险)
innodb_flush_method             = O_DIRECT # ✅ 绕过 page cache,直写 NVMe
innodb_io_capacity              = 2000     # NVMe 推荐 2000–4000
innodb_io_capacity_max          = 4000
innodb_read_io_threads          = 16
innodb_write_io_threads         = 16
innodb_purge_threads            = 4
innodb_adaptive_hash_index      = OFF      # ✅ 高并发下易成瓶颈,关闭
innodb_doublewrite              = ON       # ✅ 必开(防止页损坏)
innodb_checksum_algorithm       = crc32    # 最快校验算法

# === 查询优化 ===
query_cache_type                = 0        # ❌ MySQL 8.0+ 已移除,但显式关掉更清晰
table_open_cache                = 4000
table_definiti
sort_buffer_size                = 4M
read_buffer_size                = 2M
read_rnd_buffer_size            = 8M
join_buffer_size                = 8M
tmp_table_size                  = 256M
max_heap_table_size             = 256M
innodb_sort_buffer_size         = 64M

# === 日志与监控 ===
log_error                       = /var/log/mysql/error-optimized.log
slow_query_log                  = ON
slow_query_log_file             = /var/log/mysql/slow-optimized.log
l
log_queries_not_using_indexes   = ON
general_log                     = OFF
log_error_verbosity             = 3

# === 性能模式 & 审计 ===
performance_schema              = ON
performance_schema_instrument   = '%=ON'
performance_schema_c

# ✅ 审计日志(MySQL 8.4 原生支持,无需插件)
audit_log_policy                = ALL
audit_log_format                = NEW
audit_log_file                  = /var/log/mysql/audit-optimized.log
audit_log_strategy              = ASYNCHRONOUS

# === systemd 集成 ===
# 已由 CMake 启用,此处无需额外配置

评论