MySQL的编译安装

第一步:系统环境准备

1. 卸载冲突软件

确保系统中没有安装 MariaDB 或旧版 MySQL。

复制代码
# 停止服务
systemctl stop mariadb
systemctl disable mariadb

# 卸载
yum remove -y mariadb-libs mariadb mysql mysql-libs
rm -rf /etc/my.cnf /etc/mysql
2. 安装编译依赖工具

MySQL 8.0 编译需要 gcc, gcc-c++, cmake, ncurses, bison, openssl 等开发包。

复制代码
yum install -y gcc gcc-c++ cmake make ncurses-devel bison openssl-devel openssl libaio-devel libtirpc-devel rpcgen libxcrypt-devel perl wget tar vim
3. 升级 CMake (关键步骤)

CentOS 7 自带的 CMake 版本通常过低(2.8.x),而 MySQL 8.0 需要 CMake 3.5+ (建议 3.16+)。
如果 cmake --version 显示版本低于 3.5,请执行以下操作升级:

复制代码
# 下载较新版本的 cmake (例如 3.24.2)
cd /usr/local/src
wget https://github.com/Kitware/CMake/releases/download/v3.24.2/cmake-3.24.2-linux-x86_64.tar.gz
# 或者编译安装源码版 cmake (如果上面的二进制包不可用)
# wget https://cmake.org/files/v3.24/cmake-3.24.2.tar.gz

# 解压二进制包直接可用
tar -zxvf cmake-3.24.2-linux-x86_64.tar.gz
mv cmake-3.24.2-linux-x86_64 cmake-3.24.2
ln -s /usr/local/src/cmake-3.24.2/bin/cmake /usr/bin/cmake
ln -s /usr/local/src/cmake-3.24.2/bin/ccmake /usr/bin/ccmake

# 验证版本
cmake --version 
# 应显示 3.24.2 或更高
4. 创建用户和目录
复制代码
# 创建 mysql 用户和组
groupadd mysql
useradd -r -g mysql -s /bin/false mysql

# 创建安装目录和数据目录
mkdir -p /usr/local/mysql
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /usr/local/mysql

第二步:下载源码包

强烈建议下载带有 Boost 的源码包 (文件名包含 boost),这样可以避免手动下载匹配版本的 Boost 库的麻烦。

前往官网或使用 wget 下载(版本号可根据需要调整,这里以 8.0.36 为例):

复制代码
cd /usr/local/src
# 下载带 boost 的源码包 (约 200MB+)
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.0.36.tar.gz

# 解压
tar -zxvf mysql-boost-8.0.36.tar.gz
cd mysql-8.0.36

第三步:配置 CMake (核心步骤)

创建一个 build 目录进行编译(推荐 out-of-source 编译),然后运行 cmake 配置。

复制代码
mkdir build
cd build

cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DWITH_BOOST=../boost/boost_1_81_0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_SSL=system \
-DWITH_ZLIB=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=0

参数解释:

  • -DCMAKE_INSTALL_PREFIX: 安装路径。
  • -DMYSQL_DATADIR: 数据文件存放路径。
  • -DWITH_BOOST: 指定 Boost 库的路径(解压后的源码包内自带,路径需对应实际文件夹名,如 boost_1_81_0)。
  • -DDEFAULT_CHARSET: 默认字符集,推荐 utf8mb4
  • -DWITH_SSL=system: 使用系统安装的 OpenSSL。

注意 :如果 cmake 报错,请仔细阅读错误信息,通常是缺少某个开发包(如 rpcgenlibtirpc),安装后重新运行 cmake 命令即可。


第四步:编译与安装

这一步最耗时。建议使用 make -j 开启多线程编译(nproc 查看 CPU 核数)。

复制代码
# 编译 (根据 CPU 核数调整 -j 后面的数字,例如 4 核就用 -j 4)
make -j $(nproc)

# 安装
make install

如果在 make 过程中卡死或报错 Killed,说明内存不足,请立即增加 Swap 分区。


第五步:初始化与配置

1. 环境变量配置
复制代码
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
source /etc/profile
2. 编写配置文件 /etc/my.cnf
复制代码
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql
port = 3306
socket = /tmp/mysql.sock
pid-file = /data/mysql/mysqld.pid
user = mysql
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
skip-name-resolve
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[client]
socket = /tmp/mysql.sock
default-character-set = utf8mb4
3. 初始化数据库

MySQL 8.0 推荐使用 --initialize-insecure 生成空密码,方便首次登录,或者使用 --initialize 生成随机密码。

复制代码
# 确保数据目录权限正确
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /usr/local/mysql

# 初始化 (不安全模式,root 无密码)
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

# 如果要用安全模式(生成临时密码),请看日志末尾
# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
4. 启动服务

编译安装不会自动注册 systemd 服务,需要手动复制脚本或创建 service 文件。

方法 A:使用官方提供的启动脚本(简单)

复制代码
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld

# 启动
/etc/init.d/mysqld start

# 设置开机自启
chkconfig --add mysqld
chkconfig mysqld on

方法 B:使用 Systemd (推荐 CentOS 7+)

创建 /etc/systemd/system/mysqld.service:

复制代码
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

然后执行:

复制代码
systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld

第六步:登录与安全加固

  1. 登录数据库

    • 如果是 --initialize-insecure

      复制代码
      mysql -u root
    • 如果是 --initialize

      复制代码
      grep 'temporary password' /data/mysql/error.log
      mysql -u root -p
      # 输入上面查到的临时密码
  2. 修改密码与配置

    首次登录后(特别是安全初始化),必须修改密码:

    复制代码
    -- 修改 root 密码
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
    
    -- 允许远程连接 (可选)
    CREATE USER 'root'@'%' IDENTIFIED BY 'YourStrongPassword123!';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
    -- 退出
    EXIT;
  3. 验证安装

    复制代码
    mysql -V
    # 输出应包含 "Ver 8.0.xx"
    
    netstat -tlnp | grep 3306
    # 确认端口监听

常见问题排查

  • 内存不足 (OOM) : 编译时进程被杀。
    • 解决 : dd if=/dev/zero of=/swapfile bs=1M count=4096 && mkswap /swapfile && swapon /swapfile (增加 4G Swap)。
  • Boost 版本不匹配 : CMake 报错 Boost 版本不对。
    • 解决 : 务必下载带 boost 的源码包,并且 -DWITH_BOOST 路径要指向解压出来的具体 boost 文件夹(如 boost_1_81_0)。
  • SSL 错误 : 编译找不到 SSL。
    • 解决 : 确保安装了 openssl-devel,并在 CMake 中使用 -DWITH_SSL=system
相关推荐
Navicat中国44 分钟前
使用 Navicat 导入向导导入 Excel 数据时,系统提示导入成功,表中也能看到数据,但行数统计显示为 0,这是什么原因?
数据库·excel·导入
gmaajt1 小时前
Golang怎么做国际化多语言_Golang i18n教程【核心】
jvm·数据库·python
折哥的程序人生 · 物流技术专研1 小时前
从“卡死”到“秒过”:WMS销售数据跨库回填的极限优化之旅
数据库·机器学习·oracle
李可以量化1 小时前
DeepSeek 量化交易实战:用标准化提示词模板实现 AI 辅助交易决策
大数据·数据库·人工智能
maqr_1101 小时前
CSS如何利用Sass定义全局阴影方案_通过变量实现统一CSS风格
jvm·数据库·python
m0_613856291 小时前
uni-app怎么做类似于美团的商家评价星级 uni-app五星评分组件制作【实战】
jvm·数据库·python
Irene19912 小时前
大数据开发语境下,SQL 模式名,映射关系 - - 概念理解
大数据·数据库·sql
顾随2 小时前
(二)kettle--输入与输出
javascript·数据库·kettle
2401_833033622 小时前
如何修复固定定位头部容器中悬浮下拉菜单的错位问题
jvm·数据库·python
SelectDB2 小时前
Doris & SelectDB for AI 实战:从基础 RAG 到知识图谱增强的完整实现
数据库·人工智能·数据分析