MySQL的编译安装
<p>在 Linux(以 CentOS 7/Stream 8/9 为例)上<strong>源码编译安装 MySQL 8.0</strong>是一个相对复杂的过程,因为它需要大量的依赖库、较高的内存(建议 4GB 以上,否则编译可能失败)以及较新的 CMake 版本。</p><p>以下是基于最新环境整理的<strong>MySQL 8.0 源码编译安装完整实战指南</strong>。</p>
<hr>
<h3 id="️-编译前重要提示">⚠️ 编译前重要提示</h3>
<ol>
<li><strong>硬件要求</strong>:编译过程非常消耗内存和 CPU。建议至少 <strong>2核 CPU</strong> 和 <strong>4GB 内存</strong>。如果内存只有 2GB,必须增加 Swap 分区,否则 <code>make</code> 过程中会被系统杀掉(OOM)。</li>
<li><strong>时间成本</strong>:编译过程可能需要 30 分钟到 2 小时,取决于机器性能。</li>
<li><strong>Boost 库</strong>:MySQL 8.0 强依赖 Boost 库,且对版本要求严格。通常推荐下载包含 Boost 的源码包(文件名带 <code>boost</code>)。</li>
</ol>
<hr>
<h3 id="第一步系统环境准备">第一步:系统环境准备</h3>
<h4 id="1-卸载冲突软件">1. 卸载冲突软件</h4>
<p>确保系统中没有安装 MariaDB 或旧版 MySQL。</p>
<pre><code class="language-bash"># 停止服务
systemctl stop mariadb
systemctl disable mariadb
# 卸载
yum remove -y mariadb-libs mariadb mysql mysql-libs
rm -rf /etc/my.cnf /etc/mysql
</code></pre>
<h4 id="2-安装编译依赖工具">2. 安装编译依赖工具</h4>
<p>MySQL 8.0 编译需要 <code>gcc</code>, <code>gcc-c++</code>, <code>cmake</code>, <code>ncurses</code>, <code>bison</code>, <code>openssl</code> 等开发包。</p>
<pre><code class="language-bash">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
</code></pre>
<h4 id="3-升级-cmake-关键步骤">3. 升级 CMake (关键步骤)</h4>
<p>CentOS 7 自带的 CMake 版本通常过低(2.8.x),而 MySQL 8.0 需要 <strong>CMake 3.5+</strong>(建议 3.16+)。<br>
<em>如果 <code>cmake --version</code> 显示版本低于 3.5,请执行以下操作升级:</em></p>
<pre><code class="language-bash"># 下载较新版本的 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 或更高
</code></pre>
<h4 id="4-创建用户和目录">4. 创建用户和目录</h4>
<pre><code class="language-bash"># 创建 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
</code></pre>
<hr>
<h3 id="第二步下载源码包">第二步:下载源码包</h3>
<p><strong>强烈建议下载带有 Boost 的源码包</strong>(文件名包含 <code>boost</code>),这样可以避免手动下载匹配版本的 Boost 库的麻烦。</p>
<p>前往官网或使用 wget 下载(版本号可根据需要调整,这里以 8.0.36 为例):</p>
<pre><code class="language-bash">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
</code></pre>
<hr>
<h3 id="第三步配置-cmake-核心步骤">第三步:配置 CMake (核心步骤)</h3>
<p>创建一个 <code>build</code> 目录进行编译(推荐 out-of-source 编译),然后运行 <code>cmake</code> 配置。</p>
<pre><code class="language-bash">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
</code></pre>
<p><strong>参数解释:</strong></p>
<ul>
<li><code>-DCMAKE_INSTALL_PREFIX</code>: 安装路径。</li>
<li><code>-DMYSQL_DATADIR</code>: 数据文件存放路径。</li>
<li><code>-DWITH_BOOST</code>: 指定 Boost 库的路径(解压后的源码包内自带,路径需对应实际文件夹名,如 <code>boost_1_81_0</code>)。</li>
<li><code>-DDEFAULT_CHARSET</code>: 默认字符集,推荐 <code>utf8mb4</code>。</li>
<li><code>-DWITH_SSL=system</code>: 使用系统安装的 OpenSSL。</li>
</ul>
<blockquote>
<p><strong>注意</strong>:如果 <code>cmake</code> 报错,请仔细阅读错误信息,通常是缺少某个开发包(如 <code>rpcgen</code> 或 <code>libtirpc</code>),安装后重新运行 cmake 命令即可。</p>
</blockquote>
<hr>
<h3 id="第四步编译与安装">第四步:编译与安装</h3>
<p>这一步最耗时。建议使用 <code>make -j</code> 开启多线程编译(<code>nproc</code> 查看 CPU 核数)。</p>
<pre><code class="language-bash"># 编译 (根据 CPU 核数调整 -j 后面的数字,例如 4 核就用 -j 4)
make -j $(nproc)
# 安装
make install
</code></pre>
<p><em>如果在 <code>make</code> 过程中卡死或报错 <code>Killed</code>,说明内存不足,请立即增加 Swap 分区。</em></p>
<hr>
<h3 id="第五步初始化与配置">第五步:初始化与配置</h3>
<h4 id="1-环境变量配置">1. 环境变量配置</h4>
<pre><code class="language-bash">echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
source /etc/profile
</code></pre>
<h4 id="2-编写配置文件-etcmycnf">2. 编写配置文件 <code>/etc/my.cnf</code></h4>
<pre><code class="language-ini">
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
socket = /tmp/mysql.sock
default-character-set = utf8mb4
</code></pre>
<h4 id="3-初始化数据库">3. 初始化数据库</h4>
<p>MySQL 8.0 推荐使用 <code>--initialize-insecure</code> 生成空密码,方便首次登录,或者使用 <code>--initialize</code> 生成随机密码。</p>
<pre><code class="language-bash"># 确保数据目录权限正确
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
</code></pre>
<h4 id="4-启动服务">4. 启动服务</h4>
<p>编译安装不会自动注册 systemd 服务,需要手动复制脚本或创建 service 文件。</p>
<p><strong>方法 A:使用官方提供的启动脚本(简单)</strong></p>
<pre><code class="language-bash">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
</code></pre>
<p><strong>方法 B:使用 Systemd (推荐 CentOS 7+)</strong><br>
创建 <code>/etc/systemd/system/mysqld.service</code>:</p>
<pre><code class="language-ini">
Description=MySQL Server
After=network.target
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
WantedBy=multi-user.target
</code></pre>
<p>然后执行:</p>
<pre><code class="language-bash">systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld
</code></pre>
<hr>
<h3 id="第六步登录与安全加固">第六步:登录与安全加固</h3>
<ol>
<li>
<p><strong>登录数据库</strong></p>
<ul>
<li>如果是 <code>--initialize-insecure</code>:<pre><code class="language-bash">mysql -u root
</code></pre>
</li>
<li>如果是 <code>--initialize</code>:<pre><code class="language-bash">grep 'temporary password' /data/mysql/error.log
mysql -u root -p
# 输入上面查到的临时密码
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>修改密码与配置</strong><br>
首次登录后(特别是安全初始化),必须修改密码:</p>
<pre><code class="language-sql">-- 修改 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;
</code></pre>
</li>
<li>
<p><strong>验证安装</strong></p>
<pre><code class="language-bash">mysql -V
# 输出应包含 "Ver 8.0.xx"
netstat -tlnp | grep 3306
# 确认端口监听
</code></pre>
</li>
</ol>
<h3 id="常见问题排查">常见问题排查</h3>
<ul>
<li><strong>内存不足 (OOM)</strong>: 编译时进程被杀。
<ul>
<li><em>解决</em>: <code>dd if=/dev/zero of=/swapfile bs=1M count=4096 && mkswap /swapfile && swapon /swapfile</code> (增加 4G Swap)。</li>
</ul>
</li>
<li><strong>Boost 版本不匹配</strong>: CMake 报错 Boost 版本不对。
<ul>
<li><em>解决</em>: 务必下载带 <code>boost</code> 的源码包,并且 <code>-DWITH_BOOST</code> 路径要指向解压出来的具体 boost 文件夹(如 <code>boost_1_81_0</code>)。</li>
</ul>
</li>
<li><strong>SSL 错误</strong>: 编译找不到 SSL。
<ul>
<li><em>解决</em>: 确保安装了 <code>openssl-devel</code>,并在 CMake 中使用 <code>-DWITH_SSL=system</code>。</li>
</ul>
</li>
</ul>
<p>按照以上步骤,您就可以成功从源码编译并安装一个定制的 MySQL 8.0 数据库了。</p><br><br>
来源:https://www.cnblogs.com/jindongyan666/p/19653201
頁:
[1]