在 Linux(以 CentOS 7/Stream 8/9 為例)上源碼編譯安裝 MySQL 8.0是一個相對複雜的過程,因為它需要大量的依賴庫、較高的內存(建議 4GB 以上,否則編譯可能失敗)以及較新的 CMake 版本。
以下是基於最新環境整理的MySQL 8.0 源碼編譯安裝完整實戰指南。
⚠️ 編譯前重要提示
- 硬件要求:編譯過程非常消耗內存和 CPU。建議至少 2核 CPU 和 4GB 內存。如果內存只有 2GB,必須增加 Swap 分區,否則
make過程中會被系統殺掉(OOM)。 - 時間成本:編譯過程可能需要 30 分鐘到 2 小時,取決於機器性能。
- Boost 庫:MySQL 8.0 強依賴 Boost 庫,且對版本要求嚴格。通常推薦下載包含 Boost 的源碼包(文件名帶
boost)。
第一步:系統環境準備
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報錯,請仔細閲讀錯誤信息,通常是缺少某個開發包(如rpcgen或libtirpc),安裝後重新運行 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
第六步:登錄與安全加固
-
登錄數據庫
- 如果是
--initialize-insecure:mysql -u root - 如果是
--initialize:grep 'temporary password' /data/mysql/error.log mysql -u root -p # 輸入上面查到的臨時密碼
- 如果是
-
修改密碼與配置
首次登錄後(特別是安全初始化),必須修改密碼:-- 修改 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; -
驗證安裝
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。
- 解決: 確保安裝了
按照以上步驟,您就可以成功從源碼編譯並安裝一個定製的 MySQL 8.0 數據庫了。